ARKit - 如何在SceneKit编辑器中设置操纵器位置与节点的中心

Raj*_*Raj 6 ios 3d-model scenekit swift arkit

我从Sketchfab下载了两个不同的3D模型.我在ARKit 3D对象放置中导入了两个模型.在放置3D模型时,节点没有正确地与其中一个模型的操纵器对齐..我已附上截图. 在此输入图像描述

左侧是所选节点(视口)和操纵器正确对齐的位置.但右侧所选节点(视口)和操纵器未正确对齐.如何使节点和操纵器像左侧3D模型一样对齐中心.请指导我.谢谢

@Josh罗宾斯

我已经尝试过你的代码,但我仍然遇到同样的问题.

box.firstMaterial?.emission.contents = UIColor.green

                    box.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPoint.surface: sm]

                    box.firstMaterial?.isDoubleSided = true
                    let boxNode = SCNNode(geometry: box)
                    boxNode.position = SCNVector3(node.position.x,(node.position.y + Float((proheights * 0.0234)/2)),node.position.z)

                    let minimum = float3(treenode.boundingBox.min)
                    let maximum = float3(treenode.boundingBox.max)

                    let translation = (maximum - minimum) * 0.5

                    //3. Set The Pivot
                    treenode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)
                    boxNode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)

                    self.addChildNode(boxNode)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

更新的代码

let treenode = SCNNode()
                    let box = SCNBox(width: (prowidths * 0.0234), height: (proheights * 0.0234), length: (prolenght * 0.0234), chamferRadius: 0)

                    box.firstMaterial?.emission.contents = UIColor.green

                    box.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPoint.surface: sm]

                    box.firstMaterial?.isDoubleSided = true
                    let boxNode = SCNNode(geometry: box)
                    boxNode.position = SCNVector3(treenode.position.x,(treenode.position.y + Float((proheights * 0.0234)/2)),treenode.position.z)

                    let minimum = float3(treenode.boundingBox.min)
                    let maximum = float3(treenode.boundingBox.max)

                    let translation = (maximum - minimum) * 0.5

                    //3. Set The Pivot
                    treenode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)
                    boxNode.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)

                    self.addChildNode(boxNode)

                self.addChildNode(treenode)
                return treenode
Run Code Online (Sandbox Code Playgroud)

Bla*_*orz 1

看看你的模型,似乎枢轴设置在你的树的左侧。

您可以使用“SCNNode”的“Pivot”属性以编程方式更改枢轴,该属性是一个“SCNMatrix4MakeTranslation”。

假设您的模型称为树,您可以像这样更改它:

tree.pivot = SCNMatrix4MakeTranslation(0,0,0)
Run Code Online (Sandbox Code Playgroud)

或者你可以尝试这个:

//1. Get The Bounding Box Of The Tree
let minimum = float3(tree.boundingBox.min)
let maximum = float3(tree.boundingBox.max)

//2. Set The Translation To Be Half Way Between The Vector
let translation = (maximum - minimum) * 0.5

//3. Set The Pivot
tree.pivot = SCNMatrix4MakeTranslation(translation.x, translation.y, translation.z)
Run Code Online (Sandbox Code Playgroud)

更新: 在 Scenekit 编辑器中,您还可以创建“空节点”。然后将树放置在其中的中心。如果上述方法不起作用,这可能是您最好的选择。