【问题标题】:Spritekit - Rotate a SK3dNode along its y axisSpritekit - 沿 y 轴旋转 SK3dNode
【发布时间】:2017-04-01 01:21:57
【问题描述】:

我在 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)
}

【问题讨论】:

  • 如果您在 z 轴上旋转,是否还需要 SK3Dnode?你的意思是你在y轴上旋转?
  • 啊,是的,在 y 轴上旋转。我会换个问题。谢谢

标签: ios sprite-kit scenekit


【解决方案1】:

您已将star3d.pointOfView 正确设置到相机,但您尚未将cameraNode 添加到场景中。

starScene.rootNode.addChildNode(cameraNode)

这是一个完整版本,位于 macOS 游乐场。交换最后两行 (current.liveView) 以查看原始 SceneKit 渲染或组合的 SpriteKit 渲染。

进口可可 导入场景套件 导入 SpriteKit 导入游乐场支持 让 spritekitView = SKView(frame: CGRect(x: 0, y: 0, width: 800, height: 500)) 让 scenekitView = SCNView(frame: CGRect(x: 0, y: 0, width: 800, height: 500)) 让 spriteKitScene = SKScene(大小:CGSize(宽度:480,高度:320)) spritekitView.showsFPS = true spritekitView.presentScene(spriteKitScene) PlaygroundSupport.PlaygroundPage.current.liveView = spritekitView // 让 starScene = SCNScene.init(named: "star.dae") 让starScene = SCNScene() starScene.rootNode.addChildNode(SCNNode(几何:SCNBox(宽度:1,高度:2,长度:3,倒角半径:0.2))) 让star3d = SK3DNode(viewportSize:CGSize(宽度:330,高度:330)) star3d.position = CGPoint(x: spriteKitScene.frame.midX, y: spriteKitScene.frame.midY) star3d.scnScene = starScene star3d.isPlaying = true spriteKitScene.addChild(star3d) 让相机 = SCNCamera() 相机.xFov = 60 camera.yFov = 60 var cameraNode = SCNNode() cameraNode = SCNNode() cameraNode.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 让 rotateVector = SCNVector4Make(0, 0, 1, CGFloat(2 * M_PI)) 让旋转 = SCNAction.repeatForever(SCNAction.rotateBy(x: 0.0, y: 0, z: CGFloat(2 * M_PI), 持续时间: 10.0)) cameraNode.runAction(旋转) 让 rotationAnimation = CABasicAnimation(keyPath: "rotation") rotationAnimation.toValue = NSValue(scnVector4: rotateVector) 旋转动画.duration = 6 旋转动画.repeatCount = FLT_MAX //cameraNode.addAnimation(rotationAnimation, forKey: nil) PlaygroundPage.current.liveView = spritekitView //PlaygroundPage.current.liveView = scenekitView

【讨论】:

  • 好的,我可以在模拟器 iPhone 6 中看到星星的运动,但是在 iPhone 6 设备上,没有运动。知道为什么吗?
  • 对,所以我不得不将 PrefersOpenGL = Yes 添加到 project.plist 列表中,并且设备上的动画可以正常工作。最后一个问题。星星没有正确旋转。需要垂直旋转,所以它看起来像一颗旋转的星星。我以为只要改变 y 轴就可以了....
  • 在 SceneKit 中,您正在查看 -Z 轴。围绕 Z 轴旋转相机。
  • 试过但没有做任何事情。 rotationAnimation.toValue = NSValue(scnVector4: SCNVector4Make(0, 0, 3, 0))
  • 这是围绕 Z 轴的 0 旋转。试试 SCNVector4Make(0, 0, 3, M_PI)。
【解决方案2】:

感谢哈尔·穆勒。 通过下面的代码在 spritekit 中添加一个 sk3dnode 可以实现下面的旋转星效果。

media0.giphy.com/media/rOhH4D15SlWCc/giphy.gif

如果动画没有在您的设备上运行。 在您的项目 .plist 文件中添加以下行。 首选OpenGL = YES

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多