Ios SceneKit:围绕节点自身旋转节点
我想绕其x轴旋转一个节点(更具体地说,我想转动一个轮子) 车轮是汽车的一个子节点。我在stackoverflow上发现了几个关于此问题的线程,例如,但没有一个解决方案适合我: 我尝试了以下代码:Ios SceneKit:围绕节点自身旋转节点,ios,swift,3d,scenekit,arkit,Ios,Swift,3d,Scenekit,Arkit,我想绕其x轴旋转一个节点(更具体地说,我想转动一个轮子) 车轮是汽车的一个子节点。我在stackoverflow上发现了几个关于此问题的线程,例如,但没有一个解决方案适合我: 我尝试了以下代码: if let wheel = sceneView.scene.rootNode.childNode(withName: "WheelRearL", recursively: true) { // also tried: // wheel.pivot = SCNM
if let wheel = sceneView.scene.rootNode.childNode(withName: "WheelRearL", recursively: true) {
// also tried:
// wheel.pivot = SCNMatrix4MakeTranslation(0.5, 0.5, 0.5)
let (minVec, maxVec) = (wheel.boundingBox)
wheel.pivot = SCNMatrix4MakeTranslation(-25, (maxVec.y - minVec.y) / 2 + minVec.y, (maxVec.z - minVec.z) / 2 + minVec.z)
}
但是车轮仍然绕着整个汽车的中心转动
以下代码用于旋转本身,但我认为与解决方案无关:
let spin = CABasicAnimation.init(keyPath: "rotation")
spin.fromValue = NSValue(scnVector4: SCNVector4(x: 25, y: 0, z: 0, w: 0))
spin.toValue = NSValue(scnVector4: SCNVector4(x:25, y: 0, z: 0, w: Float(CGFloat(2 * M_PI))))
spin.duration = 3
spin.repeatCount = .infinity
let wheel = sceneView.scene.rootNode.childNode(withName: "WheelRearL", recursively: true)
wheel?.addAnimation(spin, forKey: "spin around")
(顺便说一句:我需要在代码中更改pivot,而不必在SceneKit interface builder中设置额外的容器节点并将其移动到节点中心)好吧,不知怎么地,我找到了一个可行的解决方案:(不知道这是否是最好的方法-但它确实对我有效。)
节点的局部轴通常不在几何体的中心,就像心脏的情况一样 有两个选项可以重新设置轴的中心。您可以向代码中添加函数
func centerPivot(for node: SCNNode) {
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
)
}
调用函数
centrePivot(for: wheelNode)
将其应用于节点,如下所示。这将使轴位于节点边界框的中心。但我发现你有时需要修改这个函数,这取决于你需要从哪里开始旋转。。。它可以是一个反复试验的过程,直到它的位置完美为止
另一种方法是在3D创作工具(例如)中打开collada(dae文件),并在本例中将(每个车轮几何体)制作为零部件(如果尚未)。从中可以重置零部件轴,并将轴重新定位到每个车轮几何图形的中心
在许多情况下,汽车、直升机和其他要设置动画的模型等的自由dae模型不是由作者使用“意图设置动画”创建的,因此设置动画的几何体的几何体分组和轴不在正确的轴位置。您可能还希望轴位于旋转门等的铰链上,因此它将偏离中心,可以通过小提琴来获得正确的方向。因此,我认为最好知道如何在3D模型本身中进行轴调整(对于轴点) 我知道现在回答已经很晚了。但我找到了一种绕节点自身轴旋转节点的方法。关键点是:创建父节点并将目标节点添加为子节点。 您可以使用以下代码绕X轴旋转“hudNode”:
let containerNode = SCNNode()
containerNode.addChildNode(hudNode)
let roteAction = SCNAction.rotate(by: 3.14, around: SCNVector3(1,0,0), duration: 0)
hudNode.runAction(roteAction)
然后你可以将containerNode放在你喜欢的任何地方。检查此选项可能会对你有所帮助。恐怕这并没有真正的帮助,因为旋转本身是有效的,我认为真正的问题在于轴…尝试使用
SCNAction.rotate(by:value-around:scInvector3Make(1,0,0),持续时间:0.2)
尝试我发布的答案并让我知道,但请尝试一下
let containerNode = SCNNode()
containerNode.addChildNode(hudNode)
let roteAction = SCNAction.rotate(by: 3.14, around: SCNVector3(1,0,0), duration: 0)
hudNode.runAction(roteAction)