Пятница, 29 Ноября 2024, 08:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
XNA столкновения (3D)
Stalker_ShooterДата: Суббота, 28 Апреля 2012, 21:52 | Сообщение # 1
3D XNA'шник
Сейчас нет на сайте
Всем привет. У меня возник такой вопрос. Как правильно просчитать столкновения моего персонажа со стеной? У меня есть код перемещения персонажа:

Code
    if (keyboardState.IsKeyDown(Keys.W))
                  {
                      Matrix forwardMovement = Matrix.CreateRotationY(angle.Y);
                      Vector3 v = new Vector3(0, 0, -forwardSpeed);
                      v = Vector3.Transform(v, forwardMovement);

                       
                          position.Z += v.Z;
                          position.X += v.X;
                 }


angle.Y - поворот персонажа вокруг оси oY.

Так вот, так же у меня описаны BoundingSphere вокруг моего здания (полукруглый бункер) и моего персонажа. Но как просчитать столкновение? Если использовать код:

Code
if (bunker.Sphere.Intersects(player.Sphere))


то персонаж остановится сразу, как только коснется здания, и не сдвинуть его тогда никак. А мне нужно, чтобы происходило "трение" персонажа о стену, т.е. если по оси X ходу нет, то он начинает двигаться по оси Z и т.д. Но как реализовать сие чудо сообразить не могу.

Вообще, можно, конечно, попробовать физ. движок, но ставить его только для столкновения со стеной... Думаю, что это не разумно...

За ранее благодарен!


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...


Сообщение отредактировал Stalker_Shooter - Суббота, 28 Апреля 2012, 21:53
ArchidoДата: Воскресенье, 29 Апреля 2012, 07:35 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Ну, столкновения сферы со сферой тебе мало чем помогут, т.к. едва ли много объектов, которые можно достаточно точно описать сферой. Обычно делается проверка столкновения сферы (игрок) с треугольником (карта).
В целом суть таких столкновений заключается в том, чтобы сначала определить сам факт столкновения и самую близкую точку, в которой это произошло. Далее определяют "глубину проникновения" и нормаль в той самой точке, после остается "отодвинуть" сферу по направлению нормали на величину "проникновения". В результате это выглядит так, как будто ты упираешься в стену biggrin
В целом там нет ничего сложного, ну немного математики... smile . Поэтому если нет желания с этим возиться, то проще взять физ. движок.

Added:
Ммм, для простоты можно и приведенный код использовать:
Code
if (bunker.Sphere.Intersects(player.Sphere))

Чтобы не "застревать" можно по идее делать итерацию движения игрока и запоминать предыдущее его положение. Далее проверять с помощью этого кода факт столкновения и если он имеет место быть, то перемещать игрока в его предыдущее положение. Таким образом будет происходить некое столкновение, но вдоль стены "ездить" все равно не выйдет таким способом smile


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 29 Апреля 2012, 07:55
Stalker_ShooterДата: Воскресенье, 29 Апреля 2012, 11:15 | Сообщение # 3
3D XNA'шник
Сейчас нет на сайте
Archido, спасибо за пояснение! happy Но, думаю, что действительно разумней будет взять физ. библиотеку.

Тогда, можете посоветовать какой-нибудь бесплатный физический движок (3D) для XNA 4.0? За ранее благодарен!

P.S.

Quote (Archido)
Чтобы не "застревать" можно по идее делать итерацию движения игрока и запоминать предыдущее его положение. Далее проверять с помощью этого кода факт столкновения и если он имеет место быть, то перемещать игрока в его предыдущее положение.


Увы, но так не получится. Проверено опытным путем happy Изображение будет дико дергаться, ибо за секунду игрок несколько раз будет касаться стены и его несколько раз будет откидывать назад...


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
ArchidoДата: Воскресенье, 29 Апреля 2012, 11:55 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Quote (Stalker_Shooter)
Тогда, можете посоветовать какой-нибудь бесплатный физический движок (3D) для XNA 4.0?

Ну, конкретно, что использовать для XNA не могу быть точно уверен, ибо не работал с ним. Можно попробовать использовать PhysX, для него существовал враппер под .Net . Вот тут можно посмотреть.

Quote (Stalker_Shooter)
Увы, но так не получится. Проверено опытным путем


А вот так не пробовал примерно? :
Code

   if (keyboardState.IsKeyDown(Keys.W))   
                    {   
                        Matrix forwardMovement = Matrix.CreateRotationY(angle.Y);   
                        Vector3 v = new Vector3(0, 0, -forwardSpeed);   
                        v = Vector3.Transform(v, forwardMovement);   

                        position.Z += v.Z;   
                        position.X += v.X;   

                        if (bunker.Sphere.Intersects(player.Sphere)) {
                     position.Z -= v.Z;   
                     position.X -= v.X;   
                        }
                   }


Тут, по идее, если сфера прямо не зависит от position player'a, то ее наверняка нужно ручками обновить перед проверкой.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 29 Апреля 2012, 12:04
Stalker_ShooterДата: Воскресенье, 29 Апреля 2012, 16:18 | Сообщение # 5
3D XNA'шник
Сейчас нет на сайте
Спасибо за совет. Сейчас пробую BEPUphysics. Если ничего не получится, тогда попробую прикрутить PhysX.NET

*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
Stalker_ShooterДата: Вторник, 01 Мая 2012, 17:22 | Сообщение # 6
3D XNA'шник
Сейчас нет на сайте
С физическим движком все работает отлично! Зря я его сразу не подключил)

*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг