C# Unity3D调整立方体“;“结束旋转”;在右(x或z)轴上

C# Unity3D调整立方体“;“结束旋转”;在右(x或z)轴上,c#,unity3d,quaternions,C#,Unity3d,Quaternions,我是Unity3D脚本的新手,尤其是当涉及到变换、四元数、矢量3的细节时。 下面有一个脚本。当我滚动立方体时,它会朝正确的方向翻转。但是,当立方体的局部轴与世界轴不匹配时,立方体的endRotation将在错误的轴上执行。 有人能帮我解决这个问题吗?:“endRotation”将在右轴上翻转立方体,而不管本地轴和世界轴之间的关系如何。 我花了一周的时间试图解决这个问题。当然没有成功。 下面是代码和视频 if (Input.GetAxis("Horizontal")

我是Unity3D脚本的新手,尤其是当涉及到变换、四元数、矢量3的细节时。 下面有一个脚本。当我滚动立方体时,它会朝正确的方向翻转。但是,当立方体的局部轴与世界轴不匹配时,立方体的
endRotation
将在错误的轴上执行。 有人能帮我解决这个问题吗?:“endRotation”将在右轴上翻转立方体,而不管
本地轴和世界轴之间的关系如何。
我花了一周的时间试图解决这个问题。当然没有成功。
下面是代码和视频

      if (Input.GetAxis("Horizontal") > buttonDown)
        {
            StartCoroutine(FlipTheCube(Vector3.right));
            return
        }...
。 .

public IEnumerator翻转立方体(矢量3方向)
{
startFliping=false;
浮动rollStartTime=0;
浮动辊倾角=90;
float halfWidth=transform.localScale.z/2;
Vector3 pointAround=transform.position+(Vector3.down*半宽)+(方向*半宽);
Vector3 rollAxis=Vector3.交叉(Vector3.向上,方向);
四元数旋转=transform.rotation;
四元数**结束旋转**=旋转*四元数.Euler(滚动轴*滚动角度);
Vector3 endPlacement=变换位置+方向;
浮动角度=0;
while(rollStartTime

我建议您使用DoTween资产():

DORotate(矢量3到,浮动持续时间)


使用tweeners将为您节省大量时间编写自己的动画。

您的问题在于以下几行:

Vector3 rollAxis=Vector3.Cross(Vector3.up,方向);
四元数旋转=transform.rotation;
四元数endRotation=旋转*四元数.Euler(滚动轴*滚动角度);
// ...
transform.RotateAround(点环绕、旋转轴、旋转穿过);

第一个问题是Euler与角度/轴的使用。 如果你只是对着
Vector3.right
Vector3.forward
,以及它们的负片旋转,你可能还没有注意到这一点

在第一部分中,使用
滚动轴
作为Euler角度表示,在第二部分中使用轴

问题是,对于旋转,其轴通常与该旋转的Euler表示形式不同!例如,通过围绕(0.7,0.0,0.7)旋转90°进行的旋转与欧拉旋转(63°、0°、63°)完全不同

相反,只需一致使用
rollAxis
作为角度/轴表示。您可以使用获取四元数形式


第二个问题是全局旋转和局部旋转。 这是一个你肯定已经注意到的问题

在第一部分中,将应用
rollAxis
作为局部旋转。这是因为
rollAxis
*
运算符的第二项

在第二部分中,
RotateAround
围绕由
rollAxis
定义的全局轴旋转

无论是全球还是本地。全局更简单,这似乎是您正在尝试做的(从
transform.position+direction
判断),因此您应该将
rotation
作为
*
操作符的第二项


总之,只要更改
Quaternion endRotation=rotation*Quaternion.Euler(rollAxis*rollAngle),就可以解决这些问题行:

Vector3 rollAxis=Vector3.Cross(Vector3.up,方向);
四元数旋转=transform.rotation;
四元数endRotation=四元数角度轴(rollAngle,rollAxis)*旋转;
// ...
transform.RotateAround(点环绕、旋转轴、旋转穿过);


有关四元数
*
运算符的更多信息。

Asker询问如何获取将用作
to
参数的四元数。所以很不幸,这个答案并没有真正的帮助。谢谢你,只是我没有那么丰富的经验。不管多大,谢谢你…谢谢你发布关于*运营商的参考链接
    public IEnumerator FlipTheCube(Vector3 direction)
{
    startFliping = false;

    float rollStartTime = 0;
    float rollAngle = 90;
    float halfWidth = transform.localScale.z / 2;
    Vector3 pointAround = transform.position + (Vector3.down * halfWidth) + (direction * halfWidth);
    Vector3 rollAxis = Vector3.Cross(Vector3.up, direction);

    Quaternion rotation = transform.rotation;
    Quaternion **endRotation** = rotation * Quaternion.Euler(rollAxis * rollAngle);
    Vector3 endPlacement = transform.position + direction;

    float oldAngle = 0;

    while (rollStartTime < rollDurtnTime)
    {
        yield return new WaitForEndOfFrame();
        rollStartTime += Time.deltaTime;
        float newAngle = (rollStartTime / rollDurtnTime) * rollAngle;
        float rotateThrough = newAngle - oldAngle;
        oldAngle = newAngle;

        transform.RotateAround(pointAround, rollAxis, rotateThrough);
    }

    transform.position = endPlacement;
    transform.rotation = **endRotation**;

    startFliping = true;
}