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

问题描述 投票:1回答:1

我正在学习Unity3D并且在我的3D雷达上遇到了一些麻烦。我的雷达是我的玩家游戏对象的孩子,它在我飞行时旋转。雷达本身旋转45度,因此它面向用户。有一个立方体应该是敌机的雷达点。 Cube是Radar的孩子,所以应该继承它的轮换。多维数据集上有一个脚本可以自动更新每个update()。这是层次结构:

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

问题是,当立方体本身旋转时,雷达的运动不是。随着我越接近敌机,Cube越来越接近摄像机(这很好)但是我希望它的运动跟随父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);
    }
}
unity3d
1个回答
1
投票

对于完整的解决方案,您必须首先获得目标的位置,然后在光点和雷达的上下文中重新创建它。

作为快速解决方案,您可以尝试更改最后一行,如下所示:

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的坐标系,因此其父项所具有的任何旋转都将被取消。相反,正确的做法是首先获得相对于玩家的位置。然后将它应用于雷达中的光点。我在这里的第三行代码试图这样做。

© www.soinside.com 2019 - 2024. All rights reserved.