簡體   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