创建RTS摄像机时,TransformDirection的行为不符合预期

时间:2014-11-01 22:23:09

标签: c# unity3d

我正在尝试使用Unity引擎从头开始创建RTS游戏。我从这个Unity RTS game tutorial开始,我正在设置相机。基本上我所做的是,我生成[x,0,z]向量用于移动。然后我需要在相机上应用它。

如果相机没有旋转,它可以很好地工作 - 但它通常是旋转的,必须可以旋转。

根据教程and the docs,我可以使用Camera.main.transform.TransformDirection(MyVector)将矢量转换为相机的视角。我在做什么:

    //Get mouse position
    float xpos = Input.mousePosition.x;
    float ypos = Input.mousePosition.y;
    //Create vector for movement
    Vector3 movement = new Vector3(0, 0, 0);

    //horizontal camera movement
    if (xpos >= 0 && xpos < ResourceManager.ScrollWidth)
    {
        movement.x -= ResourceManager.ScrollSpeed;
    }
    else if (xpos <= Screen.width && xpos > Screen.width - ResourceManager.ScrollWidth)
    {
        movement.x += ResourceManager.ScrollSpeed;
    }
    //vertical camera movement
    if (ypos >= 0 && ypos < ResourceManager.ScrollWidth)
    {
        movement.z -= ResourceManager.ScrollSpeed;
    }
    else if (ypos <= Screen.height && ypos > (Screen.height - ResourceManager.ScrollWidth))
    {
        movement.z += ResourceManager.ScrollSpeed;
    }

    //make sure movement is in the direction the camera is pointing
    //but ignore the vertical tilt of the camera to get sensible scrolling
    movement = Camera.main.transform.TransformDirection(movement);
    //Up/down movement will be calculated diferently
    movement.y = 0;

但是,如果我这样做,垂直移动对于初始相机旋转不起作用,当我旋转相机时,移动以奇怪的速度发生。

如何在相机上正确应用运动矢量?

1 个答案:

答案 0 :(得分:2)

嗯,这里的问题是TransformDirection将保留向量的长度。因此,如果向下倾斜相机,则整个长度将分布在y,x和z轴之间。由于您只是消除了y部分,因此矢量会变短。相机倾斜的越多,其他两个轴的损失就越多。

通常更容易旋转单位矢量,根据需要进行修改,并在完成后将其标准化。然后可以通过实际运动矢量来缩放此单位矢量。这样的事情:

// [...]
Vector3 forward = Camera.main.transform.forward;
Vector3 right = Camera.main.transform.right;
forward.y = 0f;
right.y = 0f;  // not needed unless your camera is also rotated around z
movement = forward.normalized * movement.z + right.normalized * movement.x;
// [...]

另一种方法是分离你的两个旋转。因此,通过使用仅围绕y旋转并且使相机成为该游戏对象的孩子的空GameObject。现在,相机只会围绕局部x轴旋转,以便按照您想要的方式倾斜。要将摄像机视线调整到不同的方向,您可以围绕y旋转空的GameObject。这样你就可以使用空GameObject的变换来改变你在代码中的方向,因为相机的倾斜并不重要。