首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SceneKit基础

SceneKit基础
EN

Stack Overflow用户
提问于 2014-10-03 00:46:20
回答 1查看 1.9K关注 0票数 2

我刚刚开始用SceneKit做实验。尝试一个非常简单的代码来创建一个物体,给它分配物理,用一个抽头给它一个速度。到目前为止,我能够创造它,应用物理学。我可以给它速度,但不能实现这一点与点击。我做错了什么?我使用的技术与在SpriteKit中使用的技术相同,但在SceneKit中不起作用。请帮帮忙。

代码语言:javascript
复制
class GameViewController: UIViewController, SCNSceneRendererDelegate, SCNPhysicsContactDelegate {
let scene = SCNScene()

let shipNode = SCNNode()

let sceneView = SCNScene()

var cameraNode = SCNNode()
var floor = SCNFloor()
var floornod = SCNNode()

override func viewDidLoad() {
    super.viewDidLoad()

    let sceneView = self.view as SCNView
    sceneView.scene = scene
    sceneView.backgroundColor = SKColor.blueColor()
    sceneView.showsStatistics = true


    sceneView.scene?.physicsWorld.gravity = SCNVector3Make(0, -70, 0)
    sceneView.scene?.physicsWorld.speed = 1.0
    sceneView.delegate = self
    sceneView.jitteringEnabled = true
    sceneSetup()
    sceneView.pointOfView = cameraNode


    let ship = SCNScene(named: "art.scnassets/sphere.dae")!

    let shipNode = ship.rootNode.childNodeWithName("Sphere", recursively: true)!

    shipNode.position = SCNVector3Make(0, 50, 300)
    shipNode.scale = SCNVector3Make(10, 10, 10)
    shipNode.geometry?.firstMaterial?.diffuse.contents = UIImage(named: "ball.jpg")
    shipNode.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Dynamic, shape: nil)
    shipNode.physicsBody?.restitution = 0.9
    shipNode.physicsBody?.velocity = SCNVector3Make(0, 100, 10)
    scene.rootNode.addChildNode(shipNode)
    println(shipNode.physicsBody?.velocity.y)
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    shipNode.physicsBody?.velocity = SCNVector3Make(0, 200, 20) // code not working
    println(shipNode.physicsBody?.velocity.y) // prints nil instead of 200.00
}

    func sceneSetup() {

    cameraNode.camera = SCNCamera()
    cameraNode.camera?.zNear = 0.01
    cameraNode.camera?.zFar = 800
    cameraNode.camera?.xFov = 45
    cameraNode.camera?.yFov = 75


    cameraNode.rotation = SCNVector4Make(1, 0, 0, -25 * 0.017453293)
    cameraNode.position = SCNVector3Make(0, 150, 500)
    scene.rootNode.addChildNode(cameraNode)

    floornod.geometry = floor
    floornod.geometry?.firstMaterial?.diffuse.contents = "wood1.png"
    floornod.geometry?.firstMaterial?.locksAmbientWithDiffuse = true
    floornod.geometry?.firstMaterial?.diffuse.wrapS = SCNWrapMode.Repeat
    floornod.geometry?.firstMaterial?.diffuse.wrapT = SCNWrapMode.Repeat
    floornod.geometry?.firstMaterial?.diffuse.mipFilter = SCNFilterMode.Linear
    floornod.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Static, shape: nil)
    floornod.position = SCNVector3Make(0, 0, 0)

    scene.rootNode.addChildNode(floornod)

}

}

第一个println给出的结果是100.00。touchesBegan中的println在每次点击时都会给出零的结果。

任何帮助都是非常感谢的。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-03 01:13:36

viewDidLoad方法中使用let shipNode = ...定义一个新的局部变量。这个人得到了一个物理的身体,然后被放到了场景中。

这与您定义为类的一部分的实例变量shipNode是分开的。因此,当您在touchesBegan中访问它时,它没有物理体,并且可选的链接会导致查询其返回速度的整个表达式为零。

想必您希望摆脱viewDidLoad中的viewDidLoad,这样您就可以配置实例变量而不是跟踪它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26171783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档