blog

  • [Swift SceneKit] 物理モデルシミュレーションメモ

    d1YdcMs3To

    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 プロパティに割り当てます。 床面の時と大体同じです。

    わずかなコードで物理モデルを加えられるようになったので、いろいろ表現の幅が広がると良いですね。  

  • [Swift SceneKit] SCNShadableでシェーダープログラムメモ(2)

    IuMwB2ZqUk

    前回の投稿で 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 の二つのファイルを用意して、

    プロジェクトの左のインスペクタ>ファイル追加で二つのファイルをビルドアプリのターゲットに追加します。

    icFsJq-t_s

    以下 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 でなぜかコンパイルできなかったので後で試します。

    以上

  • [Swift SceneKit] SCNShadableでシェーダープログラムメモ(1)

    SceneKit は GLSL のシェーダープログラミングをサポートしていて Shader Modifier で簡易的にGLSLのスニペットを適応させる事ができます。

    Appleのドキュメント

    xEfteAm4io

    以下サンプル、

    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日までの一ヶ月。夏休みのお出かけの際は是非!

  • HyperCollider@spazio rita Nagoya

    ライブのお知らせ 名古屋の栄にある 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)