C # XNA - Расчет следующей точки в направлении вектора - PullRequest
0 голосов
/ 01 июня 2011

допустим, у меня есть две точки A & B в моем 3D-пространстве

enter image description here

Теперь я хочу начать вычисление точек от A до B в направлении B , и я хочу продолжить вычисление дальше от B на той же линии.

Как это сделать?

Я работаю над пулями с самолета.

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Если я правильно понял ваш вопрос, вы должны сначала получить вектор направления, рассчитав

dir = B - A

, а затем продолжить движение по

C = B + dir

В противном случае, пожалуйста, уточните свойвопрос, например, что вы подразумеваете под «вычислить точки от А до В», потому что математически существует бесконечное количество точек между А и В.


Редактировать: Если вы хотите отследить пулюПуть у вас есть два варианта:

1) Вы реализуете его как hitcan оружие, как сделано во многих FPS;любые выпущенные пули сразу же попадут туда, куда они были направлены.Лучше всего этого добиться, используя трассировку лучей через Ray.Intersects , и, вероятно, это самый простой и наименее вычислительный способ сделать это.Конечно, это также не очень реалистично.

2) Вы делаете пулю физической сущностью в своем мире и перемещаете ее во время вашего вызова Update() с помощью «нормальной» комбинации вектора текущей позиции и движения / скорости.вектор, делая ручное обнаружение столкновения с любыми хитбольными поверхностями и объектами.Преимущество этого состоит в том, что вы можете реализовать правильную физику, такую ​​как время в пути, падение, трение и т. Д., Однако это также на несколько порядков сложнее реализовать надежным способом.Если вы хотите пойти по этому пути, я предлагаю использовать либо готовый физический API (например, Bullet , но я не уверен, есть ли версия для XNA), либо, по крайней мере, провести обширное исследование Google пообъекта, так что вы можете избежать многих ловушек обнаружения столкновений с быстро движущимися объектами.

0 голосов
/ 01 июня 2011

это попытка реализовать 2D-технику в 3D, я вычисляю следующее один раз

position = start;
dx = destination.X - start.X;
dy = destination.Y - start.Y;
dz = destination.Z - start.Z;

distance = (float)Math.Sqrt( dx * dx + dy * dy + dz * dz );
scale = 2f / distance;

тогда я продолжаю вычислять

position.X += dx * scale;
position.Y += dy * scale;
position.Z += dz * scale;

но результат по-прежнему не работает в 3D-пространстве, я получаю результат только для 2 измерения, третья ось не изменяется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...