Unity中的transform.Rotate问题

时间:2017-08-05 02:24:14

标签: c# unity3d rotation google-cardboard

我一直致力于在Unity中编程基于头部运动旋转的图形。我在旋转方面遇到了很多问题。

Autowalk类的示例,我用它来根据用户所面对的位置找到图表需要旋转的角度:

public class AutoWalk : MonoBehaviour { 
//VR head
private Transform vrHead;
//angular displacement from normal
public float xAng, yAng, zAng;
//previous values
public float xOrig, yOrig, zOrig;

// Use this for initialization
void Start () {
//Find the VR head
    vrHead = Camera.main.transform;
    //finding the initial direction
    Vector3 orig = vrHead.TransformDirection(Vector3.forward);
    xOrig = orig.x;
    yOrig = orig.y;
    zOrig = orig.z;
}
// Update is called once per frame
void Update () {
    //find the forward direction
    Vector3 forward = vrHead.TransformDirection(Vector3.forward);
    float xForward = forward.x;
    float yForward = forward.y;
    float zForward = forward.z;
    //find the angle between the initial and current direction
    xAng = Vector3.Angle(new Vector3(xOrig, 0, 0), new Vector3(xForward, 0, 0));
    yAng = Vector3.Angle(new Vector3(0, yOrig, 0), new Vector3(0, yForward, 0));
    zAng = Vector3.Angle(new Vector3(0, 0, zOrig), new Vector3(0, 0, zForward));
    //set new original angle
    xOrig = xAng;
    yOrig = yAng;
    zOrig = zAng;
}

从那里我进入ReadingPoints类,其中包含图形(球体)和轴(伸出的立方体)上的所有点:

public class ReadingPoints : MonoBehaviour {
// Update is called once per frame
void Update () {
    float xAngl = GameObject.Find("GvrMain").GetComponent<AutoWalk>().xAng;
    float yAngl = GameObject.Find("GvrMain").GetComponent<AutoWalk>().yAng;
    float zAngl = GameObject.Find("GvrMain").GetComponent<AutoWalk>().zAng;
    if ((xAngl != prevXAngl) || (yAngl!=prevYAngl) || (zAngl!=prevZAngl))
    {
        //rotate depending on the angle from normal
        foreach (GameObject o in allObjects)
        {
            o.transform.Rotate(new Vector3(xAngl, yAngl, zAngl), Space.World);
            prevXAngl = xAngl;
            prevYAngl = yAngl;
            prevZAngl = zAngl;
        }
    } 

allObjects,顾名思义,包含点和轴。

无论如何,运行程序时的第一个问题是图表似乎被撕裂了。 图表是如何supposed to look的(这是当o.transform.Rotate(...)被注释掉时的样子) 这是它actually looks :(另外,当我移动时图形不旋转,我不知道为什么(我以为我可能不正确地使用旋转功能但也许我也找不到正确的角度?)。对于出了什么问题的任何想法都非常感谢,谢谢!

1 个答案:

答案 0 :(得分:0)

首先,我认为你应该开始使用四元数(https://docs.unity3d.com/ScriptReference/Quaternion.html) 其次;当您使用相机附加旋转对象时,其视线将发生变化,最终对象(图形)将不在视野范围内。如果您希望尽可能多的完整图形尽可能长时间保持在相机视野中。您应该使图形的四元数与应用于相机或其附加对象的旋转相反。

确保图表中的所有元素都是图表中心游戏对象的子元素,并且只能操纵该点。