Unity: Как найти значение вектора 3 по всей оси c? - PullRequest
2 голосов
/ 08 марта 2020

Например, вы можете использовать что-то вроде:

 public Vector3 Inertia = new Vector3();
 void Update()
 {
     Inertia += transform.TransformDirection(Vector3.forward) * Input.GetAxis("Thrust") ;
     transform.Translate(Inertia * Time.deltaTime);
 }

Если вы хотите управлять космическим кораблем в трехмерном пространстве со всеми степенями свободы. Инерция отслеживает импульс в мировом пространстве, в то время как элементы управления добавляют его по осям ориентации игроков.

Но теперь я хочу проверить, какова скорость игроков по его текущим «передним» осям. Как извлечь значение из вектора3 вдоль произвольных осей?

Ответы [ 2 ]

3 голосов
/ 08 марта 2020

Если у вас есть произвольная ось (назовите ее axis) и произвольный вектор (назовите ее vector), и вы хотите найти векторную составляющую vector в направлении axis, вы можете сделать это только с помощью точечного произведения. (см. векторная проекция ).

Скалярная проекция Компонент vector в направлении axis имеет вид:

float component = Vector3.Dot(vector, axis.normalized);

Например: если бы ось была осью z, это была бы составляющая z вектора. Абсолютное значение component является величиной проецируемого вектора.

Векторная проекция Проекция vector на axis составляет:

Vector3 proj = axis.normalized * component;
1 голос
/ 09 марта 2020

Я хочу проверить, какова скорость игроков по его текущему «форварду»

Прежде всего

Inertia += transform.TransformDirection(Vector3.forward) * Input.GetAxis("Thrust") ;
transform.Translate(Inertia * Time.deltaTime);

можно просто записать как

Inertia += transform.forward * Input.GetAxis("Thrust");
transform.position += Inertia * Time.deltaTime;

Тогда вы можете Project общий вектор Inertia на вектор transform.forward

Проецирование вектора на другой вектор.

Чтобы понять векторную проекцию, представьте, что onNormal лежит на линии, указывающей в ее направлении. Где-то вдоль этой линии будет ближайшая точка к вершине вектора. Проекция просто onNormal масштабируется таким образом, что достигает этой точки на линии.

enter image description here

, а затем принимает magnitude

Возвращает длину этого вектора (только чтение).

Длина вектора является квадратной root из (x*x+y*y+z*z).

Затем вы можете умножить его на Dot

Для нормализованных векторов Dot возвращает 1, если они указывают точно в одном направлении, -1, если они указывают в совершенно противоположных направлениях и ноль, если векторы перпендикулярны.

var forwardSpeed = Vector3.Project(Inertia, transform.forward).magnitude * Vector3.Dot(Interia.normalized, transform.forward));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...