ここから本文です

SceneKitの使い方についてです。

slu********さん

2017/5/2514:59:46

SceneKitの使い方についてです。

最初から入っているshipの代わりに自作の3dオブジェクトを使いたいのですがobj形式では使えないのですか?

閲覧数:
333
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

mag********さん

2017/5/2802:00:22

obj形式のファイルはそのまま読み込めるはずですよ。

ship.scnと同じフォルダ(art.scnassets)にobjファイル一式(mtlファイルやテクスチャ等)を入れて、

let scene = SCNScene(named: "art.scnassets/path/to/file.obj")

で読み込めます。読み込んだモデルは、

let node = scene.rootNode.childNodes.first!

で取り出せます。
なので、サンプルコードの GameViewController を2行修正すれば良いだけです。

修正後のコード(Swift、iOS版)はこんな感じです。他のOSやObjective-Cでも同様です。


import UIKit
import QuartzCore
import SceneKit

class GameViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

// create a new scene
//let scene = SCNScene(named: "art.scnassets/ship.scn")! // 修正1
let scene = SCNScene(named: "art.scnassets/myOwnShip.obj")!

// create and add a camera to the scene
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)

// place the camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)

// create and add a light to the scene
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .omni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scene.rootNode.addChildNode(lightNode)

// create and add an ambient light to the scene
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = .ambient
ambientLightNode.light!.color = UIColor.darkGray
scene.rootNode.addChildNode(ambientLightNode)

// retrieve the ship node
//let ship = scene.rootNode.childNode(withName: "ship", recursively: true)! // 修正2
let ship = scene.rootNode.childNodes.first!

// animate the 3d object
ship.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))

// retrieve the SCNView
let scnView = self.view as! SCNView

// set the scene to the view
scnView.scene = scene

// allows the user to manipulate the camera
scnView.allowsCameraControl = true

// show statistics such as fps and timing information
scnView.showsStatistics = true

// configure the view
scnView.backgroundColor = UIColor.black

// add a tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
scnView.addGestureRecognizer(tapGesture)
}

func handleTap(_ gestureRecognize: UIGestureRecognizer) {
// retrieve the SCNView
let scnView = self.view as! SCNView

// check what nodes are tapped
let p = gestureRecognize.location(in: scnView)
let hitResults = scnView.hitTest(p, options: [:])
// check that we clicked on at least one object
if hitResults.count > 0 {
// retrieved the first clicked object
let result: AnyObject = hitResults[0]

// get its material
let material = result.node!.geometry!.firstMaterial!

// highlight it
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5

// on completion - unhighlight
SCNTransaction.completionBlock = {
SCNTransaction.begin()
SCNTransaction.animationDuration = 0.5

material.emission.contents = UIColor.black

SCNTransaction.commit()
}

material.emission.contents = UIColor.red

SCNTransaction.commit()
}
}

override var shouldAutorotate: Bool {
return true
}

override var prefersStatusBarHidden: Bool {
return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
if UIDevice.current.userInterfaceIdiom == .phone {
return .allButUpsideDown
} else {
return .all
}
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}

}

この回答は投票によってベストアンサーに選ばれました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる