Тревожный вращающийся вектор внутри единицы - PullRequest
0 голосов
/ 27 февраля 2020

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

Линия 1 (Quaternion.FromToRotation) работает полностью, пока сила тяжести не уменьшится (gravityDir (0, -1, 0)) или up (gravityDir (0, 1, 0)), и в этом случае компонент y элемента motionInput будет инвертирован.

Я не могу просто проверить, является ли он одним из два и переверните его обратно, потому что мне нужно, чтобы он мог постепенно переходить от одного значения к другому или иным образом находиться между различными углами (например, (1, 1, 0))

MoveInput is is только что был помещен в вектор (где x, ad - z).

gravityDir - это вектор для гравитации (0, -1, 0) для восходящего (0, 1, 0), когда вверх (1, 0, 0) положительное направление x и т. Д. 1013 *.

headAttach - это GameObject, который управляет головой игрока, я получаю его значение y в коде, чтобы повернуть вектор motionInput, чтобы я мог "двигаться в направление я смотрю ".

movementInput = Quaternion.FromToRotation(gravityDir, Vector3.up) * movementInput;
movementInput = Quaternion.AngleAxis(headAttach.transform.localRotation.eulerAngles.y, transform.up) * movementInput;

rb.AddForce(movementInput * 5 * movementSpeed);

1 Ответ

0 голосов
/ 27 февраля 2020

Не используйте FromToRotation в этом случае, потому что вы заботитесь не только о направлении вверх. Вы также заботитесь о направлениях вперед / вправо.

Вместо этого используйте LookRotation. Вам нужно найти ближайшее направление к направлению, на которое смотрит игрок (я полагаю, это headAttach.transform.forward), которое перпендикулярно направлению гравитации. Вы можете использовать перекрестные продукты для этого. Затем используйте это направление для прямого параметра LookRotation и направление, противоположное гравитации для увеличения:

Vector3 movementInput = Vector3.forward * Input.GetAxis("Vertical") 
        + Vector3.right * Input.GetAxis("Horizontal");

Vector3 upDir = -gravityDir;
Vector3 lookDir = headAttach.transform.forward;

Vector3 rightDir = Vector3.Cross(upDir, lookDir);
Vector3 forwardDir = Vector3.Cross(rightDir, upDir);

movementInput = Quaternion.LookRotation(forwardDir, upDir) * movementInput;

rb.AddForce(movementInput * 5 * movementSpeed);
...