如何围绕多个轴旋转 SCNNode?

Posted

技术标签:

【中文标题】如何围绕多个轴旋转 SCNNode?【英文标题】:How to rotate a SCNNode around multiple axes? 【发布时间】:2020-04-07 14:34:53 【问题描述】:

我在 SceneKit 的 SCNView 中有一个 SCNCylinder。我的目标是将圆柱体在不同的旋转轴上分别旋转 90° 和 180°。我正在使用 SwiftUI 输入要旋转的角度。我已经制作了这个达到同样效果的游乐场。但我遇到错误:“运行此游乐场时遇到问题。请检查您的代码是否有错误。”不知道为什么我会收到这个错误。我相信我已经以编程方式正确地完成了所有事情。

这是我的代码:

import SwiftUI
import SceneKit
import PlaygroundSupport

struct ContentView: View 
    @State var rotationAngle: Angle = .zero
    @State var rotationAngle2: Angle = .zero
    var body: some View 
        
        VStack
            
            Text("180°").onTapGesture 
                self.rotationAngle = .degrees(180)
                self.rotationAngle2 = .degrees(0)
            
            
            Divider()
            
            Text("90°").onTapGesture 
                self.rotationAngle = .degrees(0)
                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)
        
        cylindernode.runAction(rotation)
        cylindernode.runAction(rotation2)
    


PlaygroundPage.current.setLiveView(ContentView())


     

【问题讨论】:

【参考方案1】:

在我添加 4 行后测试代码(只需导入 + setLiveView),当我启动它时没有错误。

【讨论】:

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

SceneKit - 旋转和动画SCNNode

如何将 SCNNode 旋转多个角度?

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

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

SCNNode 枢轴位置

如何旋转具有固定锚点的 SCNNode?