如何限制物体旋转到一定程度?
How to constraint object rotation to certain degree?
我有一个由物理 Daydream 控制器控制的方向盘(它的工作原理类似于 wii 控制器)。我使用这段代码来做到这一点:
void Update() {
transform.localRotation = GvrController.Orientation;
transform.localRotation = new Quaternion(0.0f, 0.0f, -transform.localRotation.y, transform.localRotation.w);
}
我需要弄乱轴,因为控制器的默认位置不适合方向盘。
但在 3 轴中,最大向左和向右旋转之间的角度为 180 度。在这个范围内,一切都很好,但如果我再旋转一点,这个值就会变成负数,一切都会变得一团糟。我该怎么做才能让玩家只在这个范围内旋转(3 轴旋转的 z 轴上的 0 - 180)?
编辑:主要问题是旋转值在超过 0 或 180 后变为负值,两者相同,但顺序不同。越过 0 后,它的形式为 -1 到 -180,对于 180,它的形式为 -180 到 -1。
试试这个:
If (transform.rotation > 180)
transforn.rotation = 180;
试试这个:
if (transform.eulerAngles.z > 180)
transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 180);
else if (transform.eulerAngles.z < 0)
transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 0);
首先,我们需要一个可以实际限制的值。我们将从 eulerAngles.z 字段中获取(因为典型的屏幕滚轮围绕 z 旋转 - 您可能需要根据控制器将其更改为其他字段):
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);
}
如果有人想知道我根据 Luke 的回答中的脚本找到了解决方案。我意识到变为负数的值很好,唯一的问题是它们是负数。所以这是工作脚本:
transform.localRotation = GvrController.Orientation;
float angle = -transform.localRotation.y;
if (angle < 0.0f) {
angle = Mathf.Abs(angle);
}
transform.localRotation = new Quaternion(0.0f, 0.0f, angle, transform.localRotation.w);
我有一个由物理 Daydream 控制器控制的方向盘(它的工作原理类似于 wii 控制器)。我使用这段代码来做到这一点:
void Update() {
transform.localRotation = GvrController.Orientation;
transform.localRotation = new Quaternion(0.0f, 0.0f, -transform.localRotation.y, transform.localRotation.w);
}
我需要弄乱轴,因为控制器的默认位置不适合方向盘。
但在 3 轴中,最大向左和向右旋转之间的角度为 180 度。在这个范围内,一切都很好,但如果我再旋转一点,这个值就会变成负数,一切都会变得一团糟。我该怎么做才能让玩家只在这个范围内旋转(3 轴旋转的 z 轴上的 0 - 180)?
编辑:主要问题是旋转值在超过 0 或 180 后变为负值,两者相同,但顺序不同。越过 0 后,它的形式为 -1 到 -180,对于 180,它的形式为 -180 到 -1。
试试这个:
If (transform.rotation > 180)
transforn.rotation = 180;
试试这个:
if (transform.eulerAngles.z > 180)
transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 180);
else if (transform.eulerAngles.z < 0)
transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 0);
首先,我们需要一个可以实际限制的值。我们将从 eulerAngles.z 字段中获取(因为典型的屏幕滚轮围绕 z 旋转 - 您可能需要根据控制器将其更改为其他字段):
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);
}
如果有人想知道我根据 Luke 的回答中的脚本找到了解决方案。我意识到变为负数的值很好,唯一的问题是它们是负数。所以这是工作脚本:
transform.localRotation = GvrController.Orientation;
float angle = -transform.localRotation.y;
if (angle < 0.0f) {
angle = Mathf.Abs(angle);
}
transform.localRotation = new Quaternion(0.0f, 0.0f, angle, transform.localRotation.w);