我目前正在Unity for Oculus中实现收音机。玩家可以扭动旋钮来改变音量。但是,在360度旋转时,任何eulerangle或旋转都不能返回唯一值。
以下代码与eulerangle存在同样的问题。
void Start ()
{
oldRight = Vector3.right;
angle = 0.0f;
}
void Update ()
{
Vector3 right = transform.right;
float tempAngle = Vector3.SignedAngle(oldRight,right,transform.forward);
if (right.y < oldRight.y)
{
angle += tempAngle;
}
else
{
angle -= tempAngle;
}
oldRight = right;
}
答案 0 :(得分:1)
答案 1 :(得分:1)
首先,我们不知道无线电游戏对象和旋钮游戏对象之间的关系是什么,这很重要。
我将举例说明如何在不管这种关系的情况下如何旋转旋钮。
在下图中,收音机是立方体,其变换全部重置为0。
这是用作旋钮的圆柱体:
这里的重要部分是我旋转并放置圆柱体,使变换的X轴平行到立方体的X轴。
这是旋转圆柱体并报告旋转角度的脚本:
using UnityEngine;
public class RotateKnob : MonoBehaviour {
public float m_Speed;
void Update() {
if (Input.GetKey(KeyCode.RightArrow)) {
transform.Rotate(Vector3.up, Time.deltaTime * m_Speed, Space.Self);
}
if (Input.GetKey(KeyCode.LeftArrow)) {
transform.Rotate(Vector3.down, Time.deltaTime * m_Speed, Space.Self);
}
var angle = Vector3.SignedAngle(transform.right, transform.parent.right, transform.up);
Debug.Log(angle);
}
}
注意旋转是如何相对于Y轴和Space.Self
完成的。
相对于圆柱体的Y轴(我们旋转圆柱体的轴)取angle
,因此transform.up
为SignedAngle
第三参数,并且我们测量transform.right
和transform.parent.right
(圆柱体的多维数据集的transform.right
)之间的角度。
使用此代码,您不必担心世界中立方体的变换,结果将始终相对于旋转圆柱体时的立方体。
请务必记住,angle
将在[-180,180]
范围内报告,而不是[0,360]
。