Vector2网格方向基于相机旋转而没有对角线?

时间:2018-02-02 20:35:05

标签: c# unity3d vector camera

在Unity中,我有一个围绕Vector2构建的2D网格。我想要做的就是获得真正的"对" (或任何方向)基于相机旋转。

例如,如果相机面向90度,则Vector2.right需要为Vector2.up。我在Vector3中看到了很多这样的例子,但我似乎无法将相同的逻辑应用于Vector2。特别是当相机为40度时,右侧突然变为向上和向右。如何将其夹在最近的"方向?我不想要"光标"对角移动 - 始终只在最近的方向基于相机和按下的键。我有一些代码片段,所以人们可以看到我有多接近:

if (Input.GetKey(KeyCode.RightArrow))
{
    CameraDirection = CameraTransform.TransformDirection(Vector3.right);
}

Vector2 GridDelta = new Vector2((int)Mathf.Round(CameraDirection.x), (int)Mathf.Round(CameraDirection.z));

不幸的是,GridDelta有时会出现(1,1),而我每次都只是一个方向。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我认为这个问题正在发生,因为在45度时,归一化向量不等于(.5, .5),而是来自1 /(2 ^ .5)的(.7071, .7071)。在40deg时,归一化向量将类似于(.72, .62),这就是为什么舍入为您提供(1,1)
解决这个问题的一种方法是首先除以2 * .7071,然后舍入到最接近的整数。这基本上为您提供了一个新的中间点来比较您的非线性矢量分量。这有点像黑客,你可能不得不处理相机正好在45度(也许是一些舍入问题)的特殊情况。但否则这会奏效。

    Vector3 CameraDirection = Camera.main.transform.forward; // normalized directional vector of camera.

    Vector2 GridDelta = new Vector2((int)Mathf.Round(CameraDirection.x/1.414f), (int)Mathf.Round(CameraDirection.z/1.414f));