Unity问题:将世界坐标转换为3D雷达的我的雷达坐标

时间:2019-03-11 08:10:02

标签: unity3d

我正在学习Unity3D,但在3D雷达上遇到了一些麻烦。我的雷达是我的Player游戏对象的子代,当我飞行时它会旋转。雷达本身旋转了45度,因此面向用户。有一个立方体,它应该是敌机的雷达信号。多维数据集是Radar的子级,因此应继承其旋转。多维数据集上有一个脚本,可以在每个update()自身进行更新。这是层次结构:

Enemy Plane
Player
-- Camera
-- Radar
------ Cube (radar representation of Enemy Plane)

问题在于,当多维数据集本身通过雷达旋转时,其运动却没有。当我靠近敌机时,魔方刚好靠近相机(这很好),但是我希望它的运动跟随父Radar对象的45度旋转吗?

public class RadarGlyph : MonoBehaviour
{
    GameObject radarSource;
    GameObject trackedObject;
    Vector3 radarScaler;

    void Start()
    {
        this.radarSource = GameObject.Find("Radar");
        this.trackedObject = GameObject.Find("Enemy Fighter");
        this.radarScaler = new Vector3(0.001f, 0.001f, 0.001f);
    }

    void Update()
    {
        Vector3 vDelta = this.trackedObject.transform.position - this.radarSource.transform.position;
        vDelta.Scale(this.radarScaler);
        this.transform.localPosition = this.transform.InverseTransformDirection(vDelta);
    }
}

1 个答案:

答案 0 :(得分:1)

要获得完整的解决方案,您必须首先获得目标在船上的位置,然后在blip和雷达的背景下重新创建目标。

作为快速解决方案,您可以尝试像这样更改最后一行:

this.transform.localPosition = this.parent.localRotation * this.transform.InverseTransformDirection(vDelta);

或(显然不如您提到的那样)

this.transform.localPosition = Quaternion.Inverse(this.parent.localRotation) * this.transform.InverseTransformDirection(vDelta);

其中之一必然有效。 (第一个做到了)

编辑:这是第三个替代方法

this.transform.localPosition = this.transform.parent.parent.InverseTransformDirection(vDelta);

这将获得玩家空间中的位置并将其应用于雷达空间中。

第一个和第三个正在尝试做同样的事情。 自将方向转换为Blip的坐标系以来,其父级的所有旋转都被抵消。相反,正确的做法是首先获取相对于玩家的位置。然后将其应用到雷达中的斑点。我在这里编写的第三行代码试图这样做。