如何使用SceneKit的unprojectPoint将2D点转换为3D而没有深度值?

CAM*_*CAM 5 3d ios scenekit

是否可以使用SceneKit的unprojectPoint将2D点转换为3D而不具有深度值?我只需要在XZ平面上找到3D位置.Y可以始终为0或任何值,因为我没有使用它.

我正在尝试为iOS 8 Beta做这个.

我有类似于JavaScript和Three.js(WebGL)的东西,如下所示:

function getMouse3D(x, y) {
    var pos = new THREE.Vector3(0, 0, 0);
    var pMouse = new THREE.Vector3(
        (x / renderer.domElement.width) * 2 - 1,
       -(y / renderer.domElement.height) * 2 + 1,
       1
    );
    //
    projector.unprojectVector(pMouse, camera);

    var cam = camera.position;
    var m = pMouse.y / ( pMouse.y - cam.y );

    pos.x = pMouse.x + ( cam.x - pMouse.x ) * m;
    pos.z = pMouse.z + ( cam.z - pMouse.z ) * m;

    return pos;
};
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用unprojectVector将部件转换为SceneKit.


我想要做的是只能在XZ平面中拖动一个对象.垂直轴Y将被忽略.

由于对象需要沿着平面移动,因此一种解决方案是使用hitTest方法,但我认为在每次触摸/拖动事件中都不能很好地执行此操作.此外,它也不允许物体移动到飞机外.

我试着根据公认的答案的解决方案在这里,但它并没有奏效.对unprojectPoint使用一个深度值,如果在+/- Z方向上拖动对象,则对象不会在手指下停留太长时间,而是会远离它移动它.我需要让拖动的物体留在手指下,无论它在XZ平面中移动到哪里.

ric*_*ter 2

首先,您实际上是在 xz 平面还是 xy 平面中寻找位置?默认情况下,相机朝向 -z 方向,因此 3D Scene Kit 坐标系的 x 轴和 y 轴方向与 2D 视图坐标系中的方向相同。(嗯,在 UIKit 中默认情况下 y 是翻转的,但它仍然是垂直轴。)然后 xz 平面与屏幕平面正交。

\n\n

其次,深度值是从 2D 转换为 3D 的必要部分。我不是 Three.js 方面的专家,但通过查看他们的库文档(显然无法链接到),他们unprojectVector仍然需要Vector3. 这就是您pMouse在 \xe2\x80\x94 上面的代码中构建的向量,其 z 坐标和 y 坐标来自 2D 鼠标位置,并且 z 坐标为 1。

\n\n

SceneKit 的unprojectPoint工作方式与 \xe2\x80\x94 相同,它采用 z 坐标指的是剪辑空间中的深度的点,并将其映射到场景的世界空间中的点。

\n\n

如果您的世界空间是定向的,您关心的唯一变化是 x 轴和 y 轴,您可以传递任何您想要的 z 值unprojectPoint,并忽略您返回的向量中的 z 值。否则,传递-1映射到远剪裁平面、1近剪裁平面或0\xe2\x80\x94 之间 z 坐标(在相机空间中)为 的平面0。如果您使用未投影点在场景中定位节点,最好的建议是尝试不同的 z 值(-1 到 1 之间),直到获得所需的行为。

\n\n

然而,如果您接下来要做的事情是测试与场景几何体的相交,那么考虑一下您正在为 \xe2\x80\x94 使用未投影向量是一个好主意,请查看命中测试:相反。

\n