如何围绕多个轴和不同角度旋转 SCNNode?

Posted

技术标签:

【中文标题】如何围绕多个轴和不同角度旋转 SCNNode?【英文标题】:How to rotate a SCNNode around multiple axes and with different angles? 【发布时间】:2020-04-08 02:56:10 【问题描述】:

我在 SwiftUI 的框架内的“SCNView”中有一个“SCNCylinder”。我的目标是围绕不同的轴和不同的角度旋转圆柱体。我有两个(某种)按钮,它们以 180° 或 90° 的角度接收用户的输入。我想在不同的轴上旋转它们中的每一个。我想将圆柱体围绕“SCNVector3(1,0,0)”旋转 180°,围绕“SCNVector3(0,0,1)”旋转 90°。我已经制作了一个能够做到这一点的游乐场。真正的问题是用相同的方法进行多次旋转。假设用户先敲击 180°,然后敲击 90°,我希望圆柱体也这样做。但目前它可以旋转 180°,但是当用户点击 90° 按钮时会随机旋转。

这是我的代码:

struct ContentView: View 

@State var rotationAngle: Angle = .degrees(0)
@State var rotationAngle2: Angle = .degrees(0)
var body: some View 

    VStack

        HStack
        Text("180°").onTapGesture 
            self.rotationAngle = .degrees(180)

        

        Divider()

        Text("90°").onTapGesture 
            self.rotationAngle2 = .degrees(90)
        
        

        SceneKitView(radius: 0.02, height: 2, angle: $rotationAngle, angle2: $rotationAngle2)
            .position(x: 225.0, y: 175)
            .frame(width: 300, height: 300, alignment: .center)
          
     
  

struct SceneKitView: UIViewRepresentable 

@Binding var angle: Angle
@Binding var angle2 : Angle


let cylindernode: SCNNode

init(radius: CGFloat, height: CGFloat, angle: Binding<Angle>, angle2: Binding<Angle>) 

    let cylinder = SCNCylinder(radius: radius, height: height)
    cylinder.firstMaterial?.diffuse.contents = UIColor.green
    self.cylindernode = SCNNode(geometry: cylinder)
    self.cylindernode.position = SCNVector3(0, 0, 0)
    cylindernode.pivot = SCNMatrix4MakeTranslation(0, -1, 0)
    self._angle = angle
    self._angle2 = angle2



func makeUIView(context: UIViewRepresentableContext<SceneKitView>) -> SCNView 

    let sceneView = SCNView()
    sceneView.scene = SCNScene()
    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true
    sceneView.scene?.rootNode.addChildNode(cylindernode)
    return sceneView


func updateUIView(_ sceneView: SCNView, context: UIViewRepresentableContext<SceneKitView>) 

    let rotation = SCNAction.rotate(by: CGFloat(angle.radians), around: SCNVector3(1, 0, 0), duration: 3)        

    let rotation2 = SCNAction.rotate(by: CGFloat(angle2.radians), around: SCNVector3(0, 0, 1), duration: 3)

    print(angle.degrees)
    print(angle2.degrees)

    cylindernode.runAction(rotation)
    cylindernode.runAction(rotation2)

请帮我解决这个问题。

【问题讨论】:

【参考方案1】:

我不确定如果你在同一个节点上运行两次Action 会发生什么,但你可以通过这些函数“控制”你的动画:

例如

1.) 如果您希望动画并行运行

cylindernode.runAction(SCNAction.group([rotation, rotation2]))

2.) 如果您希望动画按顺序运行

cylindernode.runAction[SCNAction.sequence([rotation, rotation2]))

【讨论】:

我不确定您的问题是否正确。旋转顺序不是问题。真正的问题是我得到了用户给出的第二个输入的随机旋转。 你确定结果是随机的吗? 我相信是的。至少我找不到任何线索为什么它会这样旋转。

以上是关于如何围绕多个轴和不同角度旋转 SCNNode?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SCNNode 旋转多个角度?

如何在 SceneKit 中移动旋转的 SCNNode?

变形--扭曲 skew()

当提供轴和四元数时,我如何获得 GLM 的角度?

如何在“func renderer(SCNSceneRenderer, nodeFor: ARAnchor) -> SCNNode?”中旋转 SCNNode?

如何使用MATLAB围绕不是图像中心点的点旋转图像?