user5349223
user5349223

Reputation:

How to Added objects in SceneKit SWIFT

I have 2 files that I imported from Blender(3D design program) they are both .dae specifically they are "CampusField1.dae" CampusField is the ground/floor of the game and "Bob.dae" is the Man/character. My question is when I set CampusField1 as the scene how do I get "Bob" in the scene too. And the other question is lets say I export the .dae from blender now I put the file in the game... every things good but then is the animation for Bob already attached to the Bob.dae file or do I have to export something else from blender so that I can run the animation because I don't know what the animation ID would be or how to actually make it run and to actually make Bob do something.

Code:

import UIKit
import QuartzCore
import SceneKit

class GameViewController: UIViewController {
override func viewDidLoad() {
    super.viewDidLoad()

    let scene = SCNScene(named: "art.scnassets/CampusField1.dae")!

    let src = SCNSceneSource(URL: yourSceneURL, options: nil)
    let node = src.entryWithIdentifier("Bob", withClass: SCNNode.self) as SCNNode
    let animation = node.entryWithIdentifier("yourAnimationID", withClass: CAAnimation.self) as CAAnimation

Full GameController Below!:

  import UIKit
  import QuartzCore
  import SceneKit

   //============================================================
  class GameViewController: UIViewController {
override func viewDidLoad() {
    super.viewDidLoad()
    //-------------------------
    let scene = SCNScene(named: "art.scnassets/CampusField1.dae")!

    let src = SCNSceneSource(URL: yourSceneURL, options: nil)
    let node = src.entryWithIdentifier("Bob", withClass: SCNNode.self) as SCNNode
    let animation = node.entryWithIdentifier("yourAnimationID", withClass: CAAnimation.self) as CAAnimation
    //--------------------------
    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    scene.rootNode.addChildNode(cameraNode)
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
    //-----------------------------------------------
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light!.type = SCNLightTypeOmni
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
    scene.rootNode.addChildNode(lightNode)
    //-----------------------------------------------
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = SCNLightTypeAmbient
    ambientLightNode.light!.color = UIColor.darkGrayColor()
    scene.rootNode.addChildNode(ambientLightNode)
    //----------------------------------------------
    //_ = scene.rootNode.childNodeWithName("Bob", recursively: true)!
    // _ = scene.rootNode.childNodeWithName("CampusField1", recursively: true)!

    //--------------------------------------------------------
    // Bob.runAction(SCNAction.repeatActionForever(SCNAction.rotateByX(0, y: 2, z: 0, duration: 1)))

    let scnView = self.view as! SCNView

    scnView.scene = scene

    scnView.allowsCameraControl = true
    scnView.showsStatistics = false
    scnView.backgroundColor = UIColor.whiteColor()

    let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
    scnView.addGestureRecognizer(tapGesture)
    }

func handleTap(gestureRecognize: UIGestureRecognizer) {
    let scnView = self.view as! SCNView
    let p = gestureRecognize.locationInView(scnView)
    let hitResults = scnView.hitTest(p, options: nil)
    if hitResults.count > 0 {
        let result: AnyObject! = hitResults[0]
        let material = result.node!.geometry!.firstMaterial!
        SCNTransaction.begin()
        SCNTransaction.setAnimationDuration(0.5)
        SCNTransaction.setCompletionBlock {
            SCNTransaction.begin()
            SCNTransaction.setAnimationDuration(0.5)
            material.emission.contents = UIColor.blackColor()
            SCNTransaction.commit()
        }
        material.emission.contents = UIColor.yellowColor()
        SCNTransaction.commit()
    }
}
    //==================================================
override func shouldAutorotate() -> Bool {
    return true
}
 //============================
    override func prefersStatusBarHidden() -> Bool {
       return true
   }
 //==========================
   override func supportedInterfaceOrientations() ->    UIInterfaceOrientationMask {
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
        return .AllButUpsideDown
        } else {
           return .All
      }
     }
      //=============================
       override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
     }

   }

Upvotes: 4

Views: 5587

Answers (1)

Kusal Shrestha
Kusal Shrestha

Reputation: 1673

The first thing to tell you is you have got two SCNScene; CampusField and Bob. Therefore you need to take out the character node from the Bob scene.

enter image description here

You need to name the node as like from the above figure. And extract that node from the scene as:

let bobScene = SCNScene(named: "Bob.dae") 
let bobNode = personScene?.rootNode.childNodeWithName("person", recursively: true) 
let campusFieldScene = SCNScene(named: "CampusField1.dae") 
campusFieldScene.rootNode.addChildNode(bobNode)

Upvotes: 2

Related Questions