【问题标题】:Unity v. 4: Rotation Causing JumpingUnity v. 4:旋转导致跳跃
【发布时间】:2015-04-02 18:03:18
【问题描述】:

我有一个非常简单的飞机模型,它可以在 x 和 y 方向上四处移动,而海洋会滚动以使其看起来好像飞机在飞行。每当飞机移动时,我都会调整它的滚动和俯仰。

我在对象脚本中计算并维护位置、滚动和俯仰。每个更新步骤我都会将它们重新分配给对象的 Unity 属性。

问题出现在我尝试添加滚桶效果的地方。此代码工作正常:

    transform.Translate(position - transform.position);

    Vector3 rotChange = new Vector3 (-pitch, 0, -roll) -                 
                    transform.rotation.eulerAngles;

    transform.Rotate (rotChange);

只要我将所有旋转保持在 +- 30 度以内。当飞机进行滚桶滚动时,它会使用以下内容更新每个步骤:

    velocity = new Vector3 (barrelRollDirections.x * barrelRollXSpeed,        
                barrelRollDirections.y * barrelRollYSpeed, 0);

    roll += barrelRollTurnSpeed * Time.deltaTime;
    if (roll < -(fullRotation/2)) {
        roll += fullRotation;
    }
    if (roll > (fullRotation/2)) {
        roll -= fullRotation;
    }

有趣的是,如果我在旋转时飞机没有沿 x 或 y 轴移动,那么旋转飞机实际上可以正常工作。但如果是,它会到处跳跃,只有在滚动结束后才会重新出现在正确的最终位置。

我尝试了多种方法来解决这个问题:

-使用 Quaternion.Euler 将我想要的方向转换为四元数并将其直接分配给 transform.rotate。这并没有解决任何问题,而且还会导致飞机在其运动范围内抖动和摇晃。

-将平面的初始方向保存在四元数中,然后,在每个更新步骤中,将初始旋转重新分配给平面,然后调用 Transform.Rotate(new Vector3(-pitch,0,-roll))。我认为如果它是万向节锁之类的东西,这将解决我的问题,从那时起,我只会在每一步都应用小于 180 度的旋转。但没有骰子。

【问题讨论】:

    标签: c# unity3d rotation


    【解决方案1】:

    编辑:我找到了!问完这个问题后,我想我会去研究不同的对象,因为我在等待答案。在那里我发现 transform.Translate 函数根据对象的旋转将对象移动到不同的方向。当我改为简单地重新分配职位时,它工作得很好。按照惯例,与其他人交谈有助于解决问题。

    【讨论】:

    • (抱歉随机回复!希望关闭。请原谅。)根据documentationpublic void Translate(Vector3 translation, Space relativeTo = Space.Self);,因此如果您不指定Space.World,它将假定您正在尝试在本地空间中翻译。
    猜你喜欢
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多