c# - 如何限制物体旋转到一定程度?

标签 c# unity3d quaternions

我有一个由物理 Daydream Controller 控制的方向盘(它的工作原理类似于 Wii Controller )。我使用这段代码来做到这一点:

void Update() {
    transform.localRotation = GvrController.Orientation;
    transform.localRotation = new Quaternion(0.0f, 0.0f, -transform.localRotation.y, transform.localRotation.w);
}

我需要弄乱轴,因为 Controller 的默认位置不适合方向盘。

但在 3 轴中,最大向左和向右旋转之间的角度为 180 度。在这个范围内,一切都很好,但如果我再旋转一点,这个值就会变成负数,一切都会变得一团糟。我该怎么做才能让玩家只在这个范围内旋转(3 轴旋转的 z 轴上的 0 - 180)?

编辑:主要问题是旋转值在超过 0 或 180 后变为负值,两者相同,但顺序不同。越过 0 后,它从 -1 到 -180,对于 180,它从 -180 到 -1。

最佳答案

首先,我们需要一个可以实际限制的值。我们将从 eulerAngles 中得到它.z 字段(因为典型的屏幕滚轮围绕 z 旋转 - 您可能需要根据 Controller 将其更改为其他字段):

void Update() {

    // Get the angle:
    float angle = GvrController.Orientation.eulerAngles.z;

    // The magic - clamp it:
    if(angle < -180f){
        angle = -180f;
    }
    else if(angle > 180f){
        angle = 180f;
    }

    // Apply it as a new rotation:
    transform.localRotation = Quaternion.Euler(0f,0f,angle);
}

关于c# - 如何限制物体旋转到一定程度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265177/

相关文章:

c# - 如果有其他对象指向它,Dispose 真的可以释放内存吗?

c# - 图像打印的宽高比不正确?

opengl - 四元数数学旋转?

c# - 统一四元数,保持 x 和 z 旋转不变

c# - 如何附加到 Visual Studio Code 中的特定进程

c# - 检查一个 IList 改变了吗?

c# - ExecuteReader(CommandBehavior.CloseConnection) 会始终关闭连接吗?

c# - 线程化依赖于 C# 中另一个类的函数 (Unity)

c# - 在 Unity 中将图层和位掩码与光线转换一起使用

javascript - JavaScript 中的关键事件