如何通过使用像素坐标和光线投射将虚拟物体放置在真实物体上?

时间:2019-06-07 10:16:27

标签: c# unity3d hololens

如何通过使用像素坐标和光线投射将虚拟对象放置在真实对象上。 我在这个问题上坚持了一个月。 T ^ T

基于此处的问题https://forums.hololens.com/discussion/3117/pixel-coordinates-to-world-coordinates

我做类似的事情,但是我尝试在Hololens上进行实时摄影,以检测摄影机上的物体,而不是拍照。通过使用OpenCV,我已经能够获取出现在相机上的对象中心的像素坐标(x,y)。我试图在Unity中使用screenToWorldPoint并使用该矢量进行光线投射,但是虚拟对象并未放置在真实对象上。找到上述网站后,我认为screenToWorldPoint可能无法实现我的目标。

从网站上的答案中,他/她建议通过使用像素坐标,相机的焦距和projectionMatrix从相机COP穿过图像对象绘制光线,但我不知道该怎么做。它。您能否通过详细解释来帮助我,或者给我一些建议,以便在我开始做之前应了解它们?

这是我的一些代码。 X和Y是我从相机获得的像素。相机分辨率为896x504。我将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 个答案:

答案 0 :(得分:1)

您在使用MRTK吗?如果是,则FocusManager具有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