玩家在Y轴上不必要的旋转

时间:2019-05-12 18:25:24

标签: c# visual-studio unity3d

任何四元数天才都能告诉我我的代码有什么问题吗?我有这个PlayerRotation脚本,它执行两件事:

旋转玩家的Y轴位置

将播放器对准表面的法线

PlayerMovement仅使播放器在transform.forward轴上前进。问题是,当我开始玩游戏并在一段时间后在某些颠倒的表面上移动时,玩家的Y轴会随机地与操纵杆偏移,例如将操纵杆笔直向前倾斜会使玩家向右稍微旋转

input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
Vector2 inputDir = input.normalized;
//Angle part
if (inputDir != Vector2.zero)
{
    targetAngle = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg + cam.eulerAngles.y;
    Quaternion localRotation = Quaternion.Euler(0f, targetAngle - lastTargetAngle, 0f);
    transform.rotation = transform.rotation * localRotation;
    lastTargetAngle = targetAngle;
}
//Raycast part
if (Physics.Raycast(transform.position - transform.up * start, -transform.up, out hit, end))
{
    Quaternion targetRotation = Quaternion.FromToRotation(transform.up, hit.normal);
    transform.rotation = targetRotation * transform.rotation;
}         

经过多次调整后得出的结论是,问题似乎出在光线投射部分,但我不明白为什么

1 个答案:

答案 0 :(得分:0)

我对Quaternions的经验几乎仅限于使用FromToRotationLookRotation并反复试验,直到我开始使用它为止,所以我对Quaternions的了解不是最深,但是我的想法是正在发生:

您正在检测表面法线和向上矢量之间的旋转,而不是将其添加到当前旋转中。问题在于,即使当前旋转已经与曲面法线对齐,您仍然会添加该旋转,从而导致旋转过度。

enter image description here

您应该做的是要么计算从当前向上方向到表面法线的旋转,要么做下面类似的事情,这很容易理解:

使用您当前的旋转角度来确定要看的方向

lookDirection = transform.rotation * Vector3.forward

并使用targetRotation确定要向上的方向

upDirection = targetRotation * Vector3.up

然后使用Quaternion.LookRotation

计算最终轮换
  

LookRotation(Vector3向前,Vector3向上)

导致您的raycast块如下所示:

Quaternion targetRotation = Quaternion.FromToRotation(transform.up, hit.normal);
transform.rotation = Quaternion.LookRotation(transform.rotation * Vector3.forward, targetRotation * Vector3.up);

编辑:我正在使用我的便携式计算机在Uni上,所以我还没有实际测试过。