Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Rigidbody.MoveRotation:四元数相乘会导致恒定旋转_C#_Unity3d_Quaternions - Fatal编程技术网

C# Rigidbody.MoveRotation:四元数相乘会导致恒定旋转

C# Rigidbody.MoveRotation:四元数相乘会导致恒定旋转,c#,unity3d,quaternions,C#,Unity3d,Quaternions,我尝试在3D场景中使用两个四元数一起旋转和移动对象,以便对象保持垂直于其下方的地形(q1),并且对象的前部面对目标变换(q2) 在FixedUpdate中,使用Rigidbody.MoveRotation(q1)或Rigidbody.MoveRotation(q2)使对象旋转到所需的旋转,并保持指向该方向。如果我使用Rigidbody.MoveRotation(q1*q2)它在其上轴上旋转一圈又一圈 我已经尝试了所有我能想到的方法来生成q1和q2,不管我如何得出这些角度,它们相乘会导致旋转问题

我尝试在3D场景中使用两个四元数一起旋转和移动对象,以便对象保持垂直于其下方的地形(q1),并且对象的前部面对目标变换(q2)

FixedUpdate
中,使用
Rigidbody.MoveRotation(q1)
Rigidbody.MoveRotation(q2)
使对象旋转到所需的旋转,并保持指向该方向。如果我使用
Rigidbody.MoveRotation(q1*q2)
它在其上轴上旋转一圈又一圈

我已经尝试了所有我能想到的方法来生成q1和q2,不管我如何得出这些角度,它们相乘会导致旋转问题

我们是否需要缓存某种旋转增量或其他东西来跟踪它自上一帧以来的旋转距离&调整


交叉张贴。

LookRotation
生成的四元数都可以从标识旋转旋转到参数指定的旋转。应用非身份旋转的第二个旋转(这是
q1*q2
所做的)可能会使其无法满足创建
q2
时使用的
LookRotation
参数中的一个或两个

用于查找与
法线
正交的向量,该向量最接近
target.position-transform.position
。你必须处理法线和方向平行的情况

然后,使用获得将变换的
向前
向上
指向这些方向的旋转:

Quaternion q1 = Quaternion.LookRotation(Vector3.Cross(transform.right, normal), normal);
Quaternion q2 = Quaternion.LookRotation(target.position - transform.position, normal);
另一种方法是使用
LookRotation
正常方向查看,并尽可能接近指向远离目标的方向。首先定位,然后向下倾斜90度:

Vector lookDirection = target.position - transform.position;
if (Mathf.Approximately(1f, Vector3.Dot(normal, lookDirection)))
{
    // normal and lookDirection are parallel
    // Do something reasonable about look direction here.
    // That may mean doing nothing at all!
    return;
}


Vector3.OrthoNormalize(ref normal, ref lookDirection);
Quaternion newRotation = Quaternion.LookRotation(lookDirection, normal);

Rigidbody.MoveRotation(newRotation);

你找到这个问题的答案了吗?谢谢你的回答,你的回答很有道理,但实际上与问题无关,事后看来,我本可以解释得更好。总之,不能每帧计算一个新角度,这会增加额外的旋转;最好以周期性间隔计算所需的旋转和lerp to/coroutine。
Vector lookDirection = target.position - transform.position;
if (Mathf.Approximately(1f, Vector3.Dot(normal, lookDirection)))
{
    // normal and lookDirection are parallel
    // Do something reasonable about look direction here.
    // That may mean doing nothing at all!
    return;
}

Quaternion bottomTowardsTarget = Quaternion.LookRotation(normal, -lookDirection);
Quaternion newRotation = bottomTowardsTarget * Quaternion.Euler(-90f,0,0);

Rigidbody.MoveRotation(newRotation);