Spritekit - 沿其 y 轴旋转 SK3dNode
Spritekit - Rotate a SK3dNode along its y axis
我在 spritekit 中有一个 3D 星星,它沿着 z 轴旋转,所以它看起来像在旋转。
但是我无法让它旋转。
该文件是一个 .dae
文件,我已将其导入到我的项目中。
星星本身加载但没有任何反应。有人知道吗?
import SpriteKit
override func didMove(to view: SKView) {
let starScene = SCNScene.init(named: "star.dae")
let star3d = SK3DNode(viewportSize: CGSize(width: 330, height: 330))
star3d.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
star3d.scnScene = starScene
star3d.zPosition = 3
star3d.isPlaying = true
star3d.scnScene = starScene
let camera = SCNCamera()
camera.xFov = 60
camera.yFov = 60
var cameraNode = SCNNode()
cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
let rotationAnimation = CABasicAnimation(keyPath: "rotation")
rotationAnimation.toValue = NSValue(scnVector4: SCNVector4Make(1, 2, 3, .pi * 2))
rotationAnimation.duration = 6
rotationAnimation.repeatCount = FLT_MAX
starScene?.rootNode.addChildNode(cameraNode)
star3d.pointOfView = cameraNode
self.addChild(star3d)
cameraNode.addAnimation(rotationAnimation, forKey: nil)
}
您已正确设置star3d.pointOfView
到相机,但您还没有cameraNode
添加到场景。
starScene.rootNode.addChildNode(cameraNode)
这是 macOS 游乐场中的完整版本。交换最后两行 (current.liveView
) 以查看原始 SceneKit 渲染或组合的 SpriteKit 渲染。
import Cocoa
import SceneKit
import SpriteKit
import PlaygroundSupport
let spritekitView = SKView(frame: CGRect(x: 0, y: 0, width: 800, height: 500))
let scenekitView = SCNView(frame: CGRect(x: 0, y: 0, width: 800, height: 500))
let spriteKitScene = SKScene(size: CGSize(width: 480, height: 320))
spritekitView.showsFPS = true
spritekitView.presentScene(spriteKitScene)
PlaygroundSupport.PlaygroundPage.current.liveView = spritekitView
// let starScene = SCNScene.init(named: "star.dae")
let starScene = SCNScene()
starScene.rootNode.addChildNode(SCNNode(geometry: SCNBox(width: 1, height: 2, length: 3, chamferRadius: 0.2)))
let star3d = SK3DNode(viewportSize: CGSize(width: 330, height: 330))
star3d.position = CGPoint(x: spriteKitScene.frame.midX, y: spriteKitScene.frame.midY)
star3d.scnScene = starScene
star3d.isPlaying = true
spriteKitScene.addChild(star3d)
let camera = SCNCamera()
camera.xFov = 60
camera.yFov = 60
var cameraNode = SCNNode()
cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 3, z: 15)
starScene.rootNode.addChildNode(cameraNode)
star3d.pointOfView = cameraNode
scenekitView.scene = starScene
scenekitView.autoenablesDefaultLighting = true
scenekitView.pointOfView = cameraNode
let rotateVector = SCNVector4Make(0, 0, 1, CGFloat(2 * M_PI))
let rotate = SCNAction.repeatForever(SCNAction.rotateBy(x: 0.0, y: 0, z: CGFloat(2 * M_PI), duration: 10.0))
cameraNode.runAction(rotate)
let rotationAnimation = CABasicAnimation(keyPath: "rotation")
rotationAnimation.toValue = NSValue(scnVector4: rotateVector)
rotationAnimation.duration = 6
rotationAnimation.repeatCount = FLT_MAX
//cameraNode.addAnimation(rotationAnimation, forKey: nil)
PlaygroundPage.current.liveView = spritekitView
//PlaygroundPage.current.liveView = scenekitView
感谢 Hal Mueller。
下面的代码在spritekit中添加一个sk3dnode可以实现如下旋转的星星效果。
media0.giphy.com/media/rOhH4D15SlWCc/giphy.gif
如果您的设备上没有动画 运行。
在您的项目 .plist 文件中添加以下行。
首选OpenGL = 是
let starScene = SCNScene.init(named: "Round_CStar_obj.obj.dae")
let star3d = SK3DNode(viewportSize: CGSize(width: 300, height: 300))
star3d.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
star3d.scnScene = starScene
star3d.name = "star3d"
star3d.zPosition = 3
star3d.zRotation = 6
star3d.isPlaying = true
star3d.scnScene = starScene
self.addChild(star3d)
let camera = SCNCamera()
camera.usesOrthographicProjection = true
camera.orthographicScale = 9
camera.zNear = 0
camera.zFar = 200
var cameraNode = SCNNode()
cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: 0)
cameraNode.eulerAngles = SCNVector3(x: 0, y: 0, z: 0)
starScene?.rootNode.addChildNode(cameraNode)
star3d.pointOfView = cameraNode
let rotationAnimation = CABasicAnimation(keyPath: "rotation")
rotationAnimation.toValue = NSValue(scnVector4: SCNVector4Make(0, 1, 0, .pi * 2))
rotationAnimation.duration = 2
rotationAnimation.repeatCount = FLT_MAX
cameraNode.addAnimation(rotationAnimation, forKey: nil)
我在 spritekit 中有一个 3D 星星,它沿着 z 轴旋转,所以它看起来像在旋转。
但是我无法让它旋转。
该文件是一个 .dae
文件,我已将其导入到我的项目中。
星星本身加载但没有任何反应。有人知道吗?
import SpriteKit
override func didMove(to view: SKView) {
let starScene = SCNScene.init(named: "star.dae")
let star3d = SK3DNode(viewportSize: CGSize(width: 330, height: 330))
star3d.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
star3d.scnScene = starScene
star3d.zPosition = 3
star3d.isPlaying = true
star3d.scnScene = starScene
let camera = SCNCamera()
camera.xFov = 60
camera.yFov = 60
var cameraNode = SCNNode()
cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
let rotationAnimation = CABasicAnimation(keyPath: "rotation")
rotationAnimation.toValue = NSValue(scnVector4: SCNVector4Make(1, 2, 3, .pi * 2))
rotationAnimation.duration = 6
rotationAnimation.repeatCount = FLT_MAX
starScene?.rootNode.addChildNode(cameraNode)
star3d.pointOfView = cameraNode
self.addChild(star3d)
cameraNode.addAnimation(rotationAnimation, forKey: nil)
}
您已正确设置star3d.pointOfView
到相机,但您还没有cameraNode
添加到场景。
starScene.rootNode.addChildNode(cameraNode)
这是 macOS 游乐场中的完整版本。交换最后两行 (current.liveView
) 以查看原始 SceneKit 渲染或组合的 SpriteKit 渲染。
import Cocoa import SceneKit import SpriteKit import PlaygroundSupport let spritekitView = SKView(frame: CGRect(x: 0, y: 0, width: 800, height: 500)) let scenekitView = SCNView(frame: CGRect(x: 0, y: 0, width: 800, height: 500)) let spriteKitScene = SKScene(size: CGSize(width: 480, height: 320)) spritekitView.showsFPS = true spritekitView.presentScene(spriteKitScene) PlaygroundSupport.PlaygroundPage.current.liveView = spritekitView // let starScene = SCNScene.init(named: "star.dae") let starScene = SCNScene() starScene.rootNode.addChildNode(SCNNode(geometry: SCNBox(width: 1, height: 2, length: 3, chamferRadius: 0.2))) let star3d = SK3DNode(viewportSize: CGSize(width: 330, height: 330)) star3d.position = CGPoint(x: spriteKitScene.frame.midX, y: spriteKitScene.frame.midY) star3d.scnScene = starScene star3d.isPlaying = true spriteKitScene.addChild(star3d) let camera = SCNCamera() camera.xFov = 60 camera.yFov = 60 var cameraNode = SCNNode() cameraNode = SCNNode() cameraNode.camera = camera cameraNode.position = SCNVector3(x: 0, y: 3, z: 15) starScene.rootNode.addChildNode(cameraNode) star3d.pointOfView = cameraNode scenekitView.scene = starScene scenekitView.autoenablesDefaultLighting = true scenekitView.pointOfView = cameraNode let rotateVector = SCNVector4Make(0, 0, 1, CGFloat(2 * M_PI)) let rotate = SCNAction.repeatForever(SCNAction.rotateBy(x: 0.0, y: 0, z: CGFloat(2 * M_PI), duration: 10.0)) cameraNode.runAction(rotate) let rotationAnimation = CABasicAnimation(keyPath: "rotation") rotationAnimation.toValue = NSValue(scnVector4: rotateVector) rotationAnimation.duration = 6 rotationAnimation.repeatCount = FLT_MAX //cameraNode.addAnimation(rotationAnimation, forKey: nil) PlaygroundPage.current.liveView = spritekitView //PlaygroundPage.current.liveView = scenekitView
感谢 Hal Mueller。 下面的代码在spritekit中添加一个sk3dnode可以实现如下旋转的星星效果。
media0.giphy.com/media/rOhH4D15SlWCc/giphy.gif
如果您的设备上没有动画 运行。 在您的项目 .plist 文件中添加以下行。 首选OpenGL = 是
let starScene = SCNScene.init(named: "Round_CStar_obj.obj.dae")
let star3d = SK3DNode(viewportSize: CGSize(width: 300, height: 300))
star3d.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
star3d.scnScene = starScene
star3d.name = "star3d"
star3d.zPosition = 3
star3d.zRotation = 6
star3d.isPlaying = true
star3d.scnScene = starScene
self.addChild(star3d)
let camera = SCNCamera()
camera.usesOrthographicProjection = true
camera.orthographicScale = 9
camera.zNear = 0
camera.zFar = 200
var cameraNode = SCNNode()
cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: 0)
cameraNode.eulerAngles = SCNVector3(x: 0, y: 0, z: 0)
starScene?.rootNode.addChildNode(cameraNode)
star3d.pointOfView = cameraNode
let rotationAnimation = CABasicAnimation(keyPath: "rotation")
rotationAnimation.toValue = NSValue(scnVector4: SCNVector4Make(0, 1, 0, .pi * 2))
rotationAnimation.duration = 2
rotationAnimation.repeatCount = FLT_MAX
cameraNode.addAnimation(rotationAnimation, forKey: nil)