Вопрос Unity: Преобразование координат мира в координаты моего радара для 3D-радара - PullRequest
1 голос
/ 11 марта 2019

Я изучаю Unity3D и у меня проблемы с моим 3D-радаром. Мой радар является дочерним объектом моего игрового объекта Player, который вращается вокруг меня, когда я летаю. Сам радар повернут на 45 градусов, так что он обращен к пользователю. Есть Куб, который должен быть радарным вражеским самолетом. Куб является дочерним элементом радара, поэтому должен наследовать его вращение. На Cube есть скрипт для обновления себя при каждом обновлении (). Вот иерархия:

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

Проблема в том, что, хотя сам Куб вращается вместе с Радаром, его движение не происходит. Когда я подхожу ближе к вражескому самолету, Куб становится все ближе к камере (что хорошо), но я ожидаю, что его движение будет следовать за поворотом 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 Ответ

1 голос
/ 11 марта 2019

Для полного решения, вы должны сначала определить местоположение цели относительно корабля, а затем воссоздать ее в контексте всплеска и радара.

В качестве быстрого исправления вы можете попробовать изменить свою последнюю строку следующим образом:

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);

Этот получает позицию в пространстве Игрока и применяет ее в пространстве радара.

Первый и третий пытаются сделать то же самое. Поскольку вы преобразовывали направление в координатную рамку блипа, любые повороты, которые имеют его родители, отменяются .Вместо этого, правильное решение - сначала получить позицию относительно игрока.Тогда примените это к вспышке в радаре.Третья строка кода, которую я здесь имею, пытается это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...