【问题标题】:Vector2 grid direction based on Camera rotation without diagonals?Vector2网格方向基于没有对角线的相机旋转?
【发布时间】:2018-02-02 20:35:04
【问题描述】:

在 Unity 中,我有一个围绕 Vector2 构建的 2D 网格。我要做的是根据相机旋转获得真正的“正确”(或任何方向)。

例如,如果相机面向 90 度,则 Vector2.right 需要为 Vector2.up。我在 Vector3 中看到了很多这样的例子,但我似乎无法将相同的逻辑应用于 Vector2。尤其是当Camera是40度的时候,right突然变成了up and right。如何将其夹在“最近”方向?我不希望“光标”沿对角线移动 - 始终只是根据相机和按下的键在最近的方向上移动。我有一些代码 sn-ps,所以人们可以看到我有多接近:

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),我宁愿每次都是一个方向。

任何帮助将不胜感激!

【问题讨论】:

    标签: c# unity3d vector camera


    【解决方案1】:

    我相信这个问题正在发生,因为在 45 度时,归一化向量不等于 (.5, .5),而是来自 1/(2^.5) 的 (.7071, .7071)。在 40 度时,归一化向量将类似于 (.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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多