Unity WorldToViewPortPoint не дает правильную позицию - PullRequest
0 голосов
/ 30 августа 2018

У меня есть скрипт, который помещает элемент пользовательского интерфейса в то место, где трехмерный объект находится в трехмерном пространстве. Я делаю это следующим образом:

public class test : MonoBehaviour {

public Camera MainC;
public GameObject testc;

// Use this for initialization
void Start () {
    var ui = Object.Instantiate((GameObject)Resources.Load("uit"), Vector2.zero, Quaternion.identity);
    ui.transform.SetParent(GameObject.FindObjectOfType<Canvas>().gameObject.transform, false);

    var vertexs = testc.GetComponent<MeshFilter>().mesh.vertices;
    var trs = testc.GetComponent<Transform>();
    var cdc = new Vector2(GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().sizeDelta.x , GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().sizeDelta.y); 

    Object.Instantiate((GameObject)Resources.Load("pinksphere"), trs.transform.TransformPoint(vertexs[6]), Quaternion.identity); //bottomright
    Object.Instantiate((GameObject)Resources.Load("pinksphere"), trs.transform.TransformPoint(vertexs[5]), Quaternion.identity); //topleft

    var tl = MainC.WorldToViewportPoint(trs.transform.TransformPoint(vertexs[5]));

    var topleft = new Vector2(tl.x * cdc.x, tl.y * -(cdc.y) );
    ui.GetComponent<RectTransform>().anchoredPosition = topleft;
}

}

Но это не помещает элемент пользовательского интерфейса в желаемое положение. Смотрите следующие изображения для более подробного объяснения.

enter image description here

в этом случае я хочу, чтобы угол TOPLEFT элемента пользовательского интерфейса находился поверх розовой точки в верхнем углу белого куба. Но, как вы можете видеть, ось Y не совсем совпадает ..

Некоторая дополнительная информация об условиях, таких как используемый холст и предварительные настройки. Смотрите изображения ниже:

enter image description here это настройки холста.

enter image description here это основные настройки камеры.

enter image description here и это предустановленные настройки пользовательского интерфейса.

Если вам нужна дополнительная информация или что-то неясно, дайте мне знать, чтобы я мог уточнить!
код действительно неэффективен и уродлив, но это только для целей тестирования:)

1 Ответ

0 голосов
/ 31 августа 2018

Минимальное редактирование вашего кода, которое дает желаемый эффект:

public class Test : MonoBehaviour
{

    public Camera MainC;
    public GameObject testc;

    // Use this for initialization
    void Start()
    {
        var ui = Object.Instantiate((GameObject)Resources.Load("uit"), Vector2.zero, Quaternion.identity);
        ui.transform.SetParent(GameObject.FindObjectOfType<Canvas>().gameObject.transform, false);
        var uiRT = ui.GetComponent<RectTransform>();
        // Ensure uiRT's pivot and anchors are set to the bottom left preset.
        uiRT.anchorMin = Vector2.zero;
        uiRT.anchorMax = Vector2.zero;
        uiRT.pivot = Vector2.zero;

        var vertexs = testc.GetComponent<MeshFilter>().mesh.vertices;
        var trs = testc.GetComponent<Transform>();
        var cdc = new Vector2(GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().sizeDelta.x, GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().sizeDelta.y);

        Object.Instantiate((GameObject)Resources.Load("pinksphere"), trs.transform.TransformPoint(vertexs[6]), Quaternion.identity); //bottomright
        Object.Instantiate((GameObject)Resources.Load("pinksphere"), trs.transform.TransformPoint(vertexs[5]), Quaternion.identity); //topleft

        var tl = MainC.WorldToViewportPoint(trs.transform.TransformPoint(vertexs[5]));

        var offset = new Vector2(0, uiRT.sizeDelta.y);
        var topleft = tl * cdc - offset;
        uiRT.anchoredPosition = topleft;
    }
}

Поворот и привязки изображения вашего пользовательского интерфейса должен быть установлен в нижний левый угол, чтобы это работало:

UI Image pivot and anchors set to bottom left

Я добавил код, который будет гарантировать, что ось и якоря установлены таким образом. Вы можете удалить его, если убедитесь, что у префабов есть предустановка слева внизу, но так безопаснее.

Причина, по которой вы делаете это следующим образом:

Координаты области просмотра имеют исходную точку 0,0 в левом нижнем углу, поэтому, если вы установите там опорные точки и якоря, все они выстроятся в линию, и вам не нужно будет выполнять какой-либо перевод координат - это просто избавит от головной боли , Осталось только вычесть высоту изображения пользовательского интерфейса, чтобы он выровнялся вертикально с трехмерным кубом.

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