gpt4 book ai didi

objective-c - 从 CGPoint 获取 SCNVector3

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:37 26 4
gpt4 key购买 nike

我正在尝试从 CGPoint 获取 SCNVector3。我正在使用手势识别器来获取触摸位置(作为 CGPoint)。

问题是当我点击测试时,触摸并不总是击中某些东西,因为并不总是有物体被触摸。 (触摸一个空白区域将您的船移动到那个空白点)。

我发现的其他 Stack Overflow 问题使用 SCNHitTestResult 获取 worldCoordinates 但这对我不起作用。

有人知道怎么找吗?鉴于我当然知道 z 坐标。移动的船总是以 1 的 z 位置移动。

我需要 worldCoordinates 才能使用将 SCNNode 移动到具有 CGPoint 的触摸点的操作。谢谢!

最佳答案

那么,您想将 View 空间中的一个点变成场景空间中的一个点吗?当然,要注意的是场景空间有三维空间而 View 空间没有。您使用 SCNView(或其他渲染器)方法 projectPointunprojectPoint在场景空间(3D)和 View 空间(也是……也是 3D)之间进行转换?是的 — 屏幕 像素 点的二维和归一化深度之一:近裁剪平面上的点的 z 坐标为 0,远裁剪平面上的点的 z 坐标为 1。

无论如何,您有一个有用的约束,因为您希望将 View 空间点映射到场景空间中的特定平面 (z=1)。如果你的场景空间是定向的,那么你有一个更有用的约束,使得所述平面与 View 方向正交——即相机直接指向 +z 或 -z 方向。

如果要将视空间点映射到特定场景空间深度,则需要知道该平面的视空间深度是多少。为此使用 projectPoint:

SCNVector3 projectedPlaneCenter = [view projectPoint:planeNode.position];
float projectedDepth = projectedPlaneCenter.z;

现在,捕获它,只要您需要将触摸位置映射到该平面上,就可以使用它:

CGPoint vp = [recognizer locationInView:view];
SCNVector3 vpWithDepth = SCNVector3Make(vp.x, vp.y, projectedDepth);
SCNVector3 scenePoint = [view unprojectPoint:vpWithDepth];

如果您的场景不是以平行于相机的 z 轴为导向,那就有点困难了——您必须计算出您的 z=1 平面在任何 View 空间中的独立位置点你进程。在这种情况下,您可能会发现向场景中添加一个不可见的 SCNPlane 并使用 hitTest/worldCoordinates 方法来定位其上的点会更容易飞机。

关于objective-c - 从 CGPoint 获取 SCNVector3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com