统一内部旋转矢量的问题

Trouble rotating vector inside unity

我正在制作一款游戏,您可以在其中旋转玩家并改变重力。我遇到的问题是将玩家的旋转、玩家的键盘输入和当前重力放在一起。

第 1 行(Quaternion.FromToRotation)在重力向下(gravityDir(0,-1,0))或向上(gravityDir(0,1,0))之前完全正常工作,在这种情况下,y movementInput 的分量将被反转。

我不能只检查它是否是两者之一然后将其翻转回来,因为我需要它能够逐渐从一个值变为另一个值或者处于不同角度之间(例如(1, 1, 0) 例如)

movementInput 只是被放入一个向量中(w-s 是 x,a-d 是 z)。

gravityDir 是重力向量(0, -1, 0) 向下 (0, 1, 0) 向上 (1, 0, 0) 是正 x 方向等

headAttach 是一个控制玩家头部的游戏对象,我在代码中获取它的 y 值来旋转 movementInput 矢量,这样我就可以 "move in the direction i'm facing"。

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

rb.AddForce(movementInput * 5 * movementSpeed);

在这种情况下不要使用FromToRotation,因为您关心的不仅仅是向上的方向。您还关心 forward/right.

的方向

改为使用 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);