Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2012, 23:25   #1
Максим139
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 80
По умолчанию Столкновение объектов в 3D

Пишу столкновение объектов в 3D пространстве, делаю так:
Цитата:
bool Hit = true;
if ((Math.Abs(Player.Position.X - Model.Position.X) > Model.Size.X) &&
(Math.Abs(Player.Position.Z - Model.Position.Z) > Model.Size.Z))
Hit = false;
return Hit;
Тоесть, если игрок вне модели, то перемещается. Проблема в том, что если ставить оператор И, то столкновение будет только при касании по диагонали, а если оператор ИЛИ, то будет недоступно прохождение по 2 из координат. Что делать?
Заранее спасибо!
Максим139 вне форума Ответить с цитированием
Старый 28.09.2012, 08:23   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Нарисуйте скрин как должно быть (в частности отобразить что есть касание по диагонали и что есть прохождение по 2 из координат) и как получается в приведённых случаях.

Рискну также предположить, что любая сходная простейшая логика вроде сравнения координат и размеров в 3д будет давать много неточностей, ибо не 2д, да и приведённый способ вообще годится только для ортогонально ориентированных прямоугольников, а не объектов произвольной формы с произвольным углом поворота.

Ну и в порядке глупого предложения - почему бы не попробовать XOR ?
phomm вне форума Ответить с цитированием
Старый 28.09.2012, 14:41   #3
Максим139
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 80
По умолчанию

Как-то так...
Ну мне не нужно какая-то супер-система, чтоб было как в лучших играх. Хотя бы, чтоб игрок к игре не проходил через стены и другие модели ящиков и т.д...
Изображения
Тип файла: jpg example.jpg (15.2 Кб, 181 просмотров)
Максим139 вне форума Ответить с цитированием
Старый 28.09.2012, 19:59   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Поскольку это шарп, предлагаю воспользоваться готовыми вещами, а то попытки выразить логику пересечения 2 прямоугольников в общем случае через точки их положения и размеры приведут к лапше из кода в ифах, предлагаю воспользоваться методом IntersectRect структуры Rectangle, примерно так
Код:
if (Rectangle.Intersect(new Rectangle(Player.Position, Player.Size), 
    new Rectangle(Model.Position, Model.Size)) != Rectangle.Empty)
    // столкновение
else // нет столкновения
Плюс повторюсь - это только для пересечения 2х не повёрнутых прямоугольников, что для игры несколько скудно.

Последний раз редактировалось phomm; 28.09.2012 в 20:01.
phomm вне форума Ответить с цитированием
Старый 28.09.2012, 20:24   #5
Максим139
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 80
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Поскольку это шарп, предлагаю воспользоваться готовыми вещами, а то попытки выразить логику пересечения 2 прямоугольников в общем случае через точки их положения и размеры приведут к лапше из кода в ифах, предлагаю воспользоваться методом IntersectRect структуры Rectangle, примерно так
Код:
if (Rectangle.Intersect(new Rectangle(Player.Position, Player.Size), 
    new Rectangle(Model.Position, Model.Size)) != Rectangle.Empty)
    // столкновение
else // нет столкновения
Плюс повторюсь - это только для пересечения 2х не повёрнутых прямоугольников, что для игры несколько скудно.
Огромное спасибо! Осталось только откалибровать, чтоб камера не заглядывала внутрь при касании вплотную =)
Максим139 вне форума Ответить с цитированием
Старый 29.09.2012, 11:36   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Максим139 Посмотреть сообщение
Пишу столкновение объектов в 3D пространстве, делаю так:

Тоесть, если игрок вне модели, то перемещается. Проблема в том, что если ставить оператор И, то столкновение будет только при касании по диагонали, а если оператор ИЛИ, то будет недоступно прохождение по 2 из координат. Что делать?
Заранее спасибо!
1. Если Вы работаете в 3D, то и проверять надо по трем координатам, а не по двум.
2. Должно быть "ИЛИ", если Вас интересует отсутствие столкновения, и "И" - если наличие столкновения.
3. Что Вы хотели сказать в выделенной фразе, я так и не понял.
s-andriano вне форума Ответить с цитированием
Старый 29.09.2012, 15:27   #7
Максим139
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 80
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
1. Если Вы работаете в 3D, то и проверять надо по трем координатам, а не по двум.
2. Должно быть "ИЛИ", если Вас интересует отсутствие столкновения, и "И" - если наличие столкновения.
3. Что Вы хотели сказать в выделенной фразе, я так и не понял.
1. У меня по двум, x и z, пока что...
2. Ясно.
3. Да, предложение кривое, но в более раннем посте есть скрин.
Максим139 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и уничтожение объектов. Время жизни объектов C++/C# Anett// Помощь студентам 0 24.10.2011 23:26
Определить столкновение объектов TImage (Delphi) misher Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 23.03.2011 21:01
Столкновение GaLiof Помощь студентам 5 25.11.2009 09:42
Столкновение объектов [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 27.09.2008 16:54
Столкновение двух Манжосов Денис :) Помощь студентам 13 10.09.2008 22:01