Is it normal for an SCNNode pivot to change the nodes position? 这里也提出了同样的问题……但在网上搜索了几个小时后,我找不到任何解决此问题的编码解决方案。这是如何在不移动节点的情况下使节点的枢轴居中。
所以最后我今天大部分时间都花在了下面这个编码的答案上。
我发现局部轴的方向决定了您是减去还是加法校正因子。
在下面骑这辆自行车。右侧踏板曲柄枢轴 z 轴(蓝色)指向上方,而在另一张照片中,左侧踏板曲柄枢轴 z 轴(蓝色)指向下方。这些轴不同的原因是当人们在 SketchUp 中绘制自行车模型时,他们只是将第一个踏板曲柄复制并翻转到另一侧。所以不幸的是,获得具有特定枢轴方向和位置的导入 DAE 模型是很常见的!
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
}
我只在上面显示的两个不同的 z 轴方向上测试了上面的代码,完整的代码还必须使用这两个条件来处理 x、y 轴。
node.convertVector(SCNVector3(0,1,0), from: parentNode).z < 0
node.convertVector(SCNVector3(1,0,0), from: parentNode).z < 0
如果有更好的方法...请分享?