繁体   English   中英

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

[英]How to restrict position of a node to the surface of a custom plane in 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)我猜你有某种拖放的想法,所以为了避免一些数学,这将是我的方法。

我要做的是获取平面的表面并计算一些对齐位置,其中包括放置对象所需的旋转。 我推荐这个,因为有些角落不适合,因为你不能允许重叠。 因此,获取您的放置位置并找到最近的“可接受”插槽,可以这么说并“对齐”到最近的位置。

如果你想允许很大的灵活性,比如一次移动一个基本的像素,那么我会创建一个可接受的位置范围和每个所需的旋转的数组。 如果有人拖到该范围之外,则要么不允许,要么将其移动到最近的可接受“位置”。

设置多个几何图形有点痛苦,但根据您要完成的任务,它会是准确的,尽管有点“硬编码”。

另一种更简单的可能性是,如果您为移动的盒子提供一个实体,并在平面的所有边缘放置带有实体的不可见“墙”,并使用碰撞遮罩让 Scenekit 为您完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM