如何在Scenekit中将节点的位置限制为自定义平面的曲面



我是Swift和SceneKit的新手,我正在尝试实现一个解决方案,用户可以将3D对象添加到场景中,并将其放置在平面表面的边缘。

我尝试使用平面节点的边界框值来假设其边和对象的潜在位置,但由于平面是自定义几何体,对象通常会出现在平面曲面之外。

最重要的是,如果平面的特定边是对角线,我还需要对象旋转,使其始终与平面的边平行。

以下是我的代码片段和一张图片,说明了问题和期望的结果:

//creating plane out of custom geometry values
let surfaceNode = SCNNode(geometry: surfaceGeometry)
//defining plane’s bounding box & center point
let minimum = SIMD3<Float>(surfaceNode.boundingBox.min)
let maximum = SIMD3<Float>(surfaceNode.boundingBox.max)
let translation = (maximum - minimum) * 0.5
//fixing pivot point
surfaceNode.pivot = SCNMatrix4MakeTranslation(surfaceNode.boundingBox.min.x + translation.x, 0, surfaceNode.boundingBox.min.z + translation.z)
//adding custom plane to the scene
surfaceNode.position = SCNVector3(0, 0 ,0)
sceneView.scene.rootNode.addChildNode(surfaceNode)
//creating object
let object = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)
let objectNode = SCNNode(geometry: object)
objectNode.pivot = SCNMatrix4MakeTranslation(0, -0.1, 0)
//positioning object on top of the plane’s surface
objectNode.position = SCNVector3(surfaceNode.position.x, surfaceNode.position.y, surfaceNode.position.z - translation.z)
//adding object to scene
sceneView.scene.rootNode.addChildNode(objectNode)

我希望看到一个很酷的基于数学的解决方案,因为这将是一个巧妙的技巧,但由于我没有。。。

  1. 你没有说这必须有多动态,2(我猜你脑子里有某种拖放,所以为了避免一些数学问题,这将是我的方法

我要做的是获取平面的曲面,并计算一些捕捉到的位置,其中包括放置对象所需的旋转。我建议这样做,因为有些弯角不合适,而且你不能允许过圈。所以,找到你的下降位置,找到最接近的";"可接受";可以说是slot;捕捉到";最近的位置。

如果你想允许很大的灵活性,比如基本上一次移动1个像素,那么我会创建一个可接受的位置范围阵列和每个位置范围所需的旋转。如果有人拖到了这个范围之外,那么要么不允许,要么把它移到最接近的可接受的"范围";点";。

设置多个几何图形有点痛苦,但取决于你试图实现的目标,它将是准确的,尽管有点";硬编码";。

另一种更容易的可能性是,如果你给你的移动盒子一个实体,并放置不可见的"墙壁";在你平面的所有边缘都有实体,还有碰撞面具,让scenekit为你做这项工作。

最新更新