使用相对于相机方向的可变轴在X,Z平面上平移

时间:2013-10-28 00:09:06

标签: c# rotation unity3d translation axis

我在世界X,Z轴上有一块板。 我有一个可以旋转向下或向上看的相机,并使用世界Y轴从左向右旋转。

这是相机旋转代码:

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World);

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self);

使用鼠标按钮和鼠标位置输入(拖放)我翻译了世界上的相机。它接收包含鼠标(拖放)操作的X和Y值的2D矢量。这是我使用的方法的代码:

private void CameraOnPlaneTranslation(Vector2 myVector)
{

   float cameraYPos = Camera.main.transform.position.y;

   Camera.main.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1]));

   Camera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z);
}

问题:当我的相机没有直接朝向Z轴(0.0f,Z,0.0f)时,我计算的平移向量是不正确的。我需要更改矢量的Y值,以便相机不会在世界Y轴上移动。

由于

2 个答案:

答案 0 :(得分:1)

我对Unity并不熟悉,但是假设它与这些点上的其他3D系统类似,我会尝试回答,希望不要让自己难堪。

看起来你/翻译/摄像机位置,然后立即/设置/摄像机位置,从而覆盖翻译完成的工作。如果是这种情况,您应该尝试设置camera.main.transform.position一次(在创建相机后的行中)。然后只需通过翻译调用myVector(就像你拥有它一样)。因此,您应该删除方法Camera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z);

的第三行

尝试此操作后,如果仍未达到预期效果,请查看是否需要更新视图或Flush或ApplyTransform。 。 。任何能让它理解你完成变换的东西,你已准备好再次使用更新的变换进行处理。

答案 1 :(得分:0)

我通过添加另一个仅受相机左/右旋转(世界向上矢量)和相机翻译影响的GameObject来解决这个问题。

在Awake方法中

cameraOrientation = new GameObject("cameraOrientation");
cameraOrientation.transform.position = Camera.main.transform.position;
cameraOrientation.transform.localEulerAngles = new Vector3(0.0f, Camera.main.transform.localEulerAngles.y, 0.0f);

在旋转方法

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World);
cameraOrientation.transform.Rotate(0.0f, angle, 0.0f, Space.World);

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self);

最后是翻译方法

cameraOrientation.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1]));
Camera.main.transform.position = cameraOrientation.transform.position;