Как разместить виртуальный объект на реальном объекте, используя координаты пикселей и лучевую передачу? - PullRequest
0 голосов
/ 07 июня 2019

Как разместить виртуальный объект на реальном объекте, используя координаты пикселей и raycast. Я застрял на этой проблеме в течение месяца. T ^ T

Исходя из вопроса отсюда https://forums.hololens.com/discussion/3117/pixel-coordinates-to-world-coordinates

Я делаю аналогичную вещь, но я пытаюсь использовать живую камеру на Hololens, чтобы обнаружить объект на камере, а не делать снимок. Я смог получить координаты пикселя (x, y) центра объекта, который появляется на камере, с помощью OpenCV. Я пытался использовать screenToWorldPoint в Unity и использовал этот вектор для радиопередачи, но виртуальный объект не был помещен в реальный объект. После того, как я нашел веб-сайт выше, я думаю, что screenToWorldPoint может не работать для достижения моей цели.

Из ответа на веб-сайте он / она предложил нарисовать луч из COP камеры через объект изображения, используя координаты пикселей, фокусное расстояние камеры и projectionMatrix, но я понятия не имею, как мне это сделать. Это. Не могли бы вы помочь мне, объяснив более подробно, или дайте мне несколько советов, которые мне нужно понять, прежде чем я это сделаю?

Вот часть моего кода. X и Y - это пиксели, которые я получил от камеры. Разрешение камеры 896х504. Я установил проекцию камеры в Unity на орфографию. Размер 0,14. Расстояние ближней плоскости равно 0,8, а расстояние дальней плоскости равно 1000.

    Vector3 PosFar = new Vector3(896-X, Y, Camera.main.farClipPlane);
    Vector3 PosNear = new Vector3(896-X, Y, Camera.main.nearClipPlane);
    Vector3 PointPosFar = Camera.main.ScreenToWorldPoint(PosFar);
    Vector3 PointPosNear = Camera.main.ScreenToWorldPoint(PosNear);
    var headPos = PointPosNear;
    var gazeDirection = PointPosFar - PointPosNear;
    RaycastHit hit;
    if (Physics.Raycast(headPos, gazeDirection, out hit, 30.0f, SpatialMappingManager.Instance.LayerMask)){......Generate object....}

1 Ответ

1 голос
/ 07 июня 2019

Вы используете MRTK? Если да, то FocusManager имеет значение bool для debugDrawPointingRays. Если вы установите это значение true, вы должны увидеть луч в режиме сцены. Может быть, способ, которым это реализовано, может помочь вам ...

Что я тоже нашел: https://gamedev.stackexchange.com/questions/150602/how-can-i-draw-a-line-of-the-raycast-hit-in-game-view-while-the-game-is-running/150616

...