The same question was asked here. Is changing the position of nodes normal for the SCNNode axis? ... but after searching the Internet for several hours, I could not find any encoded solution to this problem. Which means how to center the w630 axis without moving the node .
So in the end, I spend most of today on this encoded answer below. I found that the orientation of the local axis determines whether you subtract or make an addition for the correction factor.
Take this bike below. The right axis of rotation of the pedal grip (blue) is directed upward, and in another photograph the left rotation axis of the rotation axis (blue) is directed downward. For this reason, this axis is different from when a person drew a bike model in SketchUp, they just copied and turned the first pedal handle to the opposite side. Unfortunately, it is very common to import DAE models with special orientations and positions!


func centerPivotWithOutMoving(for node: SCNNode) -> SCNNode { let initialPos = activeNode.presentation.position var min = SCNVector3Zero var max = SCNVector3Zero node.__getBoundingBoxMin(&min, max: &max) node.pivot = SCNMatrix4MakeTranslation( min.x + (max.x - min.x)/2, min.y + (max.y - min.y)/2, min.z + (max.z - min.z)/2 ) let correctX = Float(min.x + (max.x - min.x)/2) let correctY = Float(min.y + (max.y - min.y)/2) let correctZ = Float(min.z + (max.z - min.z)/2) if node.convertVector(SCNVector3(0,0,1), from: parentNode).z < 0 { // if blue local z-axis is pointing downwards node.position = SCNVector3(initialPos.x - correctX, initialPos.y - correctY, initialPos.z - correctZ) } else { // if blue local z-axis is pointing upwards node.position = SCNVector3(initialPos.x + correctX, initialPos.y + correctY, initialPos.z + correctZ) } return node }
I just checked the code above on the two different z-axis orientations shown above, the full code would also have to deal with the x, y axis using these two conditions.
node.convertVector(SCNVector3(0,1,0), from: parentNode).z < 0 node.convertVector(SCNVector3(1,0,0), from: parentNode).z < 0
If there is a better way to do this ... please share?