我正在尝试使用用户控件旋转球体。
void RotateGlobe() {
SetLock();
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
userInput.x = Input.GetAxis("Mouse X");
userInput.y = Input.GetAxis("Mouse Y");
if (userInput.magnitude > 0 & Physics.Raycast(ray, Mathf.Infinity, LayerMask.NameToLayer("UI")))
{
Vector2 movement = new Vector2(Mathf.Sign(userInput.x), Mathf.Sign(userInput.y));
globe.transform.rotation =
Quaternion.Slerp(globe.transform.rotation,
Quaternion.Euler(0, movement.y * 90, movement.x * 180 + globe.transform.rotation.eulerAngles.x),
Time.time * speed);
}
}
RemoveLock();
}
我不太了解Quaternions(然后再次,谁真的这么做),但不仅是地球没有正确响应用户输入,它还会卡在x轴上。我知道它可能是通过不移动从180到-180的最短路径。
我想在这一点上,我完全愿意改变这个代码,转而采用更好的方法(而不是slerp),但我完全陷入困境,以前的方法同样困难且不稳定。
你怎么建议我去旋转这个球体?
作为奖励,如果我可以约束一个我们很棒的轴。我真的不想超过90或-90。
答案 0 :(得分:2)
简单的解决方案 - 您可以使用Unity的RotateAround,这是他们最有用的电话之一
http://docs.unity3d.com/ScriptReference/Transform.RotateAround.html
请注意,网上有一些令人困惑的评论,不推荐使用RotateAround;实际上它只是一个被弃用的旧版本。这是您在Unity中使用的最常见的呼叫之一。享受!
其次
请注意,您确实在计算欧拉角度!或者可能是localEulerAngles。 你可以简单地在他们之间徘徊!!!!
像......那样......Vector3 fromEulers = blah;
Vector3 toEulers = blah;
transform.localEulerAngles = .. slerp .. fromEulers toEulers;
最后。请注意,“lerp-like”函数具有类似MoveTowards的等价物,您可以“在自己的步骤中”使用。
SmoothStep实际上是关于所有团结中最有用的召唤!