Yosemite Xcode 6.1 になって正式に SceneKit の物理モデル関連の Swift 向け API が公開になりましたね。 さっそく動かしてみましたのでサンプルを。前々回の記事のように、"Game" プロジェクトテンプレートの GameViewController を書き換える形で実装。 SCNPhysicsShape, SCNPhysicsBody を生成するところ以外は前々回の記事とあまり変わっていませんが、 物が落ちて反発するように床面の SCNFloor を加えています。
以下 GameViewController のコード。
床の生成
25行目
let floorNode = SCNNode()
let floor = SCNFloor() floor.reflectivity = 0.25 floorNode.geometry = floor
reflectiv は床面の光の反射率
let floorShape = SCNPhysicsShape(geometry: floor, options: nil) let floorBody = SCNPhysicsBody(type: .Static, shape: floorShape)
floorNode.physicsBody = floorBody;
ここで先ほどの floor geometry から SCNPhysicsShape を生成します。 SCNPhysicsBody から SCNPhysicsShape を生成し floorNode の physicsBody プロパティにセットします。 重力で落ちてきたものを跳ね返す床面になります。
boxの生成
70行目
let boxShape = SCNPhysicsShape(geometry: box, options: nil) let boxBody = SCNPhysicsBody(type: .Dynamic, shape: boxShape)
node.physicsBody = boxBody;
落とす方の box も同じように SCNPhysicsBody, SCNPhysicsShape を生成して SCNNode の physicsBody プロパティに割り当てます。 床面の時と大体同じです。
わずかなコードで物理モデルを加えられるようになったので、いろいろ表現の幅が広がると良いですね。
前回の投稿で SCNProgram によってフレーム毎の計算をバインドする方法があると書きましたが、
今回はその方法で SCNShabable を使ってみましょう。
なぜか OSX の 10.9 SDK で SCNProgramDelegate がうまく動かなかったので、iOS の SDK でコンパイルする事にしました。
iOSアプリのテンプレートの方で同じく GameViewController を書き換える方法で行きます。
File > Project.. で OS X ではなく iOS の Application > Game プロジェクトテンプレートを準備します。
シェーダー用のコードの用意 今回はリソースファイルとして Vertex Shadeer / Fragmental Shader をロードするので、
myShader.vert / myShader.frag の二つのファイルを用意して、
プロジェクトの左のインスペクタ>ファイル追加で二つのファイルをビルドアプリのターゲットに追加します。
以下 myShader.vert / myShader.frag の内容
GameViewController.swiftの書き換え 以下 GameViewController.swift の内容
テクスチャーを貼っていないためか、Fragmental Shader を空にしているためか分かりませんが、
表面が赤と青の面になってしまっています...。
18行目
let program = SCNProgram() SCNProgram インスタンスを作り、ここにシェーダープログラムをセットしていきます。
21行目
let vertexShader = NSString(contentsOfURL: vertexShaderURL!, encoding: NSUTF8StringEncoding, error: nil) program.vertexShader = vertexShader let fragmentalShader = NSString(contentsOfURL: fragmentalShaderURL!, encoding: NSUTF8StringEncoding, error: nil) program.fragmentShader = fragmentalShader program インスタンスに
バンドルリソースとしてロードした vertex / fragmental それぞれのコード(NSString)を渡します。
25行目
program.setSemantic(SCNModelViewTransform, forSymbol: "position", options: nil) program.setSemantic(SCNModelViewProjectionTransform, forSymbol: "modelViewProjection", options: nil) setSemanticでシェーダーコードの方で宣言した attribute と uniform をバインドします。
引数に使う Constants ですが、Vertex Shader に渡すデータセットとして SCNGeometrySource が用意されていて、
自動でバインドしてくれます。詳しくは Appleのドキュメントを参照してください。
67行目
material.handleBindingOfSymbol("time") { programID, location, renderedNode, renderer in glUniform1f(GLint(location), GLfloat(CFAbsoluteTimeGetCurrent() - startTime)) } 最後に SCNMaterial にフレームレンダリング毎に呼ばれるブロックを handleBindingOfSymbol でセットします。
ここで uniform / Attribute をバインドします。
これで 'time' Attributeには CFAbsoluteTimeGetCurrent でアプリ起動時からの差分のカウントが渡されると思います。
本来であれば SCNProgramDelegate を使ってバインドしたかったのですが現在の SDK でなぜかコンパイルできなかったので後で試します。
以上
SceneKit は GLSL のシェーダープログラミングをサポートしていて Shader Modifier で簡易的にGLSLのスニペットを適応させる事ができます。
以下サンプル、
Atsushi Tadokoro 氏のこちらの記事の Xcode の 'Game' プロジェクトテンプレートを書き換える方法で SceneKit を導入します。
material 宣言部分以外はだいたい Atsushi Tadokoro 氏のコードをまるっと借用しています..。
40行目material.shaderModifiers = [...] SCNMaterial の ShaderModifire プロパティにシェーダーのスニペットを key, value のセットの配列としてセットします。 key には Shader Modifire Entry Point Keys が用意されていて目的に応じたものを使います。今回は SCNShaderModifierEntryPointSurface で表面のライティングを縞状にしています。 これはshaderModifiersによってGLSLのスニペットをStirigでごそっと渡してしまう簡易的な方法で、
もう少し詳しく行いたい場合は SCNProgram クラスが用意されていてデリゲートによってフレーム描画毎の計算できるので 各 Uniform や Attributes のバインディングなどが必要な場合はこちらを使うようです。
そちらの方法は後ほど。
昨年夏、山口情報芸術センターycamにてシステムのお手伝いさせてもらった「コロガルパビリオン」 ですが、こどもたちの署名運動によりなんと今年も期間限定で復活するそうです。
http://www.ycam.jp/art/2014/08/korogaru-pavilion.html
8/1日より31日までの一ヶ月。夏休みのお出かけの際は是非!
[ライブのお知らせ] 名古屋の栄にある spazio rita で HyperCollider というイベントがあります。 ライブ出演します。お近くの方は是非!
フリーウェアの音響合成プログラミング言語『SuperCollider』を使ったライブイベント『HyperCollider』。東京より音響プログラマとして活躍するmoxus (Koichiro Mori) 、ドイツよりベルリン芸大教授でありジェネレーティブ・アーティストのAlberto de Campoをゲストに迎えます。ポップからエクスペリメンタル、スタティックからダイナミックまで、全出演者のコーディングにより生成され、紡ぎだされる音楽をお楽しみください。
guest live :
moxus (Koichiro Mori) from Tokyo
Alberto de Campo from Berlin
Live performance :
イワキジュンコ (sora to ao)
宇佐美理
koutaro fukui
小林雅典
HyperCollider : www.oll-korrect-firm.info/?page_id=91
hc.date : 2014.7.13(sun) hc.time open 18:30 / start 19:00 hc.charge : adv/door 2000(1d.inc) / 1500(1d.inc) hc.venue : spazio rita http://spazio-rita.com/ hc.hosted.by(oll_korrect.firm)