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 |
Сэнсэй
Сейчас нет на сайте
| Ну, столкновения сферы со сферой тебе мало чем помогут, т.к. едва ли много объектов, которые можно достаточно точно описать сферой. Обычно делается проверка столкновения сферы (игрок) с треугольником (карта). В целом суть таких столкновений заключается в том, чтобы сначала определить сам факт столкновения и самую близкую точку, в которой это произошло. Далее определяют "глубину проникновения" и нормаль в той самой точке, после остается "отодвинуть" сферу по направлению нормали на величину "проникновения". В результате это выглядит так, как будто ты упираешься в стену В целом там нет ничего сложного, ну немного математики... . Поэтому если нет желания с этим возиться, то проще взять физ. движок.
Added: Ммм, для простоты можно и приведенный код использовать: Code if (bunker.Sphere.Intersects(player.Sphere)) Чтобы не "застревать" можно по идее делать итерацию движения игрока и запоминать предыдущее его положение. Далее проверять с помощью этого кода факт столкновения и если он имеет место быть, то перемещать игрока в его предыдущее положение. Таким образом будет происходить некое столкновение, но вдоль стены "ездить" все равно не выйдет таким способом
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Воскресенье, 29 Апреля 2012, 07:55 |
|
| |
Stalker_Shooter | Дата: Воскресенье, 29 Апреля 2012, 11:15 | Сообщение # 3 |
3D XNA'шник
Сейчас нет на сайте
| Archido, спасибо за пояснение! Но, думаю, что действительно разумней будет взять физ. библиотеку.
Тогда, можете посоветовать какой-нибудь бесплатный физический движок (3D) для XNA 4.0? За ранее благодарен!
P.S.
Quote (Archido) Чтобы не "застревать" можно по идее делать итерацию движения игрока и запоминать предыдущее его положение. Далее проверять с помощью этого кода факт столкновения и если он имеет место быть, то перемещать игрока в его предыдущее положение.
Увы, но так не получится. Проверено опытным путем Изображение будет дико дергаться, ибо за секунду игрок несколько раз будет касаться стены и его несколько раз будет откидывать назад...
*Не убегай от снайпера, умрешь уставшим. *Мои статьи...
|
|
| |
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'шник
Сейчас нет на сайте
| С физическим движком все работает отлично! Зря я его сразу не подключил)
*Не убегай от снайпера, умрешь уставшим. *Мои статьи...
|
|
| |
|