gpt4 book ai didi

ios - 如何围绕多个轴并以不同角度旋转 SCNNode?

转载 作者:行者123 更新时间:2023-11-29 05:14:17 24 4
gpt4 key购买 nike

我在 SwiftUI 框架内的“SCNView”中有一个“SCNCylinder”。我的目标是围绕不同的轴并以不同的角度旋转圆柱体。我有两个(某种意义上的)按钮,它们接受用户的 180° 或 90° 输入。我想在不同的轴上旋转它们。我想将圆柱体围绕“SCNVector3(1,0,0)”旋转 180°,并围绕“SCNVector3(0,0,1)”旋转 90°。我已经制作了一个能够做到这一点的 Playground 。真正的问题是用相同的方法进行多次旋转。假设用户先点击 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.) 如果您希望动画并行运行

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

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

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

关于ios - 如何围绕多个轴并以不同角度旋转 SCNNode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59343169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com