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

本文关键字:方向 相机 平面 相对于 | 更新日期: 2023-09-27 18:37:14

我在世界 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);

使用鼠标按钮向下和鼠标位置输入(拖放)我平移世界上的相机。 它接收一个 2D 向量,其中包含鼠标(拖放)操作的 X 和 Y 值。这是我使用的方法的代码:

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 轴上移动。

谢谢

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

我不

熟悉Unity,但假设它在这些方面与其他3D系统相似,我将尝试回答,希望不会让自己尴尬。

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

尝试此操作后,如果它仍然没有达到您的预期,请查看它是否需要您更新视图或刷新或应用转换......任何能让它明白你已经完成了对转换的更改,并且你已准备好使用它使用更新的转换再次处理。

我通过添加另一个仅受摄像机右/左旋转(世界向上矢量)和摄像机平移影响的游戏对象来解决此问题。

在唤醒方法中

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;