2012-02-08 2 views
1

Мы создаем FPS в XNA, и мы находимся в процессе внедрения обнаружения столкновений. Наши стены прямоугольные, поэтому класс BoundingBox казался хорошим вариантом, но он выровнен по оси. Нам бы очень хотелось, чтобы стены были не оси. Большинство обсуждений, которые мы видели, говорят, что используют BoundingSpheres, но это не похоже на лучший вариант, потому что стены действительно просто повернули прямоугольники.Обнаружение столкновений XNA с BoundingBoxes

Нам удалось моделировать движение персонажа как лучи, и мы знаем, что мы должны иметь возможность перевести эти лучи из мирового пространства в пространство с прямоугольной осью с использованием матрицы вращения. К сожалению, мы думаем, что что-то не в порядке с этим преобразованием, потому что мы, похоже, сталкиваемся с невидимыми (или как-то большими) стенами, и наше излучение работает на пересечениях пола (которые пока не вращаются [все равно]). Единственная причина, по которой мы используем лучи, состоит в том, что они легко генерируются, должны быть легко преобразованы в пространство ящика, и мы можем использовать классы XNA, такие как Axis Aligned BoundingBoxes для фактического обнаружения столкновений.

Мы реализовали это так:

internal float? collide(Ray ray) { 
    Matrix transform = Matrix.Invert(Transform); 
    ray.Direction = Vector3.Transform(ray.Direction, transform); 
    ray.Position = Vector3.Transform(ray.Position, transform); 
    return new BoundingBox(new Vector3(-.5f, -.5f, -.5f), new Vector3(.5f, .5f, .5f)).Intersects(ray); 
} 
public Matrix Transform { get { return Matrix.CreateScale(size) * rotate * Matrix.CreateTranslation(pos); } } 

Поворот передается в конструктор и формируется с помощью вызова Matrix.CreateRotationY (тета). Луч, прошедший в столкновение, находится в мировом пространстве. Трансформация также является матрицей, применяемой к нашей модели для рендеринга. Эта модель представляет собой куб, который идет от (-.5, -.5, -.5) до (.5, .5, .5).

В любом случае, наш вопрос сводится к нескольким вещам: есть ли лучший способ для обнаружения столкновений для не связанных по оси ящиков против лучей? Есть ли лучший способ сделать это, чем использовать лучи? Мы просто идиоты с чем-то явно неправильным с нашим кодом? Если возможно, мы хотели бы как можно больше полагаться на классы XNA (или, по крайней мере, код, который уже был написан), и не должны писать гораздо больше, чем класс-оболочка.

+0

Я не могу дать ответ, но эти указатели могут помочь. Вот как я сделал это для моего проекта трассировки лучей, http://github.com/danieljfarrell/pvtrace. (1) сделать код пересечения AABB, (2) переместить AABB в какую-либо произвольную позицию в сцене с матрицами преобразования, (3) выполнить пересечение в кадре координат поля (т. Е. Мы можем использовать стандартный код пересечения AABB), применяя обратное преобразование в поле И для луча. (4) получить точку пересечения в рамке кадра, (5) применить форвардное преобразование для получения точки пересечения в мировом кадре. Элегантный, но дорогой? Кому ты рассказываешь. –

ответ

0

Ну, если вы пытаетесь повернуть прямоугольники (2d) и сохраняете обнаружение столкновений, тогда у меня есть ответ. Когда я узнал Xna, я использовал прямоугольники. У вас может быть много маленьких прямоугольников в прямоугольнике текстуры и обнаруживать столкновение для каждого столкновения.

+0

Чтобы уточнить, наша игра 3D FPS. – dazerdude

 Смежные вопросы

  • Нет связанных вопросов^_^