iPhoneアプリ開発:AR 目次

 
 てなわけでバケット(bucket)は省略。
 これまでに紹介したやり方で作れるからね。
 
これね
 
 ブーム、アーム、バケットはそれぞれローカル空間で、次のような原点にしておくと、ARKit側では読み込んで親子関係結ぶだけで済みます。
 ピボット調整(光あれでやったpivotプロパティね)しなくていいわけです。
 
 
 ちなみに各オブジェクトのローカル空間での素の状態(グローバル側でトランスフォームされてない)を確認するには、オブジェクトモードでオブジェクト選んでおいて、3Dビューのボトムバーからオブジェクト>クリア>位置オブジェクト>クリア>回転オブジェクト>クリア>拡大縮小を選べばいいんだけど、これって一時的にクリアするとかできないもんなのか?
 めんどくさいんだが…
 マニュアルに何か書いてるかもしれんが未確認。
 ちゃんとクリアされてるかはnキー打ちでサイドバー出してトランスフォームグループの位置や回転が0.0に、拡大縮小が1.0になってるのを確認すればよくってよ。
 プロパティビューのオブジェクトタブのトランスフォームグループ側でもOK。どっちも連動してます。
 上記のクリアメニュー使わずに、ここで直接値を入れるってのもありです。
 
 
 確認して思ってた位置とずれてたら編集モードで調整。オブジェクトモードのまま移動させても、ローカル空間での位置調整にはならんでな。
 調整できたらオブジェクトモードに戻る。
 オブジェクトモードでは見やすい位置に配置しても問題ナッシング。さっき言ったようにローカル空間での形状の位置には影響しない。
 実際「見た目が大事」ではグローバル側の位置をずらしてるのを読み込ませてる。別に重なったままでもいいけどね。
 
 
 COLLADAでの書き出しは「親子関係を確認」を参考にしましょう。今回はモディファイアーを適用にチェックだ!
 何の指定かはもうわかるよね。
 
 「親子関係を確認」でやったようにブーム、アーム、バケット、3つのオブジェクトを別々に読み込んで、その後親子関係結ぶのもいいんですが、Blender側で親子関係結んでおくってのも有りです。
 
 
 この場合、AR側ではブームだけを探して、土台と親子関係結んでおしまい。アームやバケットの連結作業は不要になる。
 
Excavator.swift
class Excavator {

    init() {
        ・・・
        //  ブーム
        guard let boomNode = yumboScene.rootNode.childNode(・・・
            return
        }
        shoulderNode.addChildNode(boomNode)
        //  アーム
        guard let armNode = yumboScene.rootNode.childNode(・・・
            return
        }
        boomNode.addChildNode(armNode)
        //  バケット
        guard let bucketNode = yumboScene.rootNode.childNode(・・・
            return
        }
        armNode.addChildNode(bucketNode)
        //  土台はpositionの示す位置が底辺になるようにする
        baseNode.pivot = SCNMatrix4MakeTranslation(・・・
        //  肩である球体は土台の最上部が、球の中心位置になるように配置
        shoulderNode.position = SCNVector3(・・・
        //  ブームはpositionの示す位置が底辺になるようにし・・・
        boomNode.position = SCNVector3(・・・
        //  アームはpositionの示す位置が底辺になるようにし・・・
        armNode.position = SCNVector3(・・・
        //  バケットはアームの最上部に配置
        bucketNode.position = SCNVector3(・・・
        base.firstMaterial?.diffuse.contents = UIColor.red
        shoulder.firstMaterial?.diffuse.contents = UIColor.yellow
        root = baseNode
    }
 
サンプル:
 
Blenderファイル:
 ただ、これを試してみて気づいたんだけど、XcodeではCOLLADAファイルのオブジェクトの名前にスペースが入ってると、そこで名前が確定するみたいっす。
 
 arm line 1
 arm line 2
 arm line 3
 
は、どれもarmの後ろにスペースがあるんで、全部armになっちゃう。
 なんで、あっちゃこっちゃの階層にarmってオブジェクトができて、検索に支障をきたすんですな。boomも同じ。
 
 
 最上位のワールド空間に3つのオブジェクトを配置したい場合は、最初に見つかるのは最上位のboom、arm、bucketなんで問題なかったんだけど、階層構造にしておくと、boomからのarm、bucketの検索になるんで具合悪い。
 何言ってるかわからん人は「ムーブムーブムーブ」のchildNodeメッセージの話を読みましょう。
 なので、さっきのサンプルのyumbo.blendは「arm line 1」てのを「arm-line-1」て風にスペースを - (ハイフン)に置き換えてます。
 実際使ってみると色々あるわな。
 形状についてはこんなところで。
 
 最後にマテリアルについて。
 ブームやアーム作って気づいたと思うけど、Blenderは新規作成のオブジェクトの色は白色にしてるんですよ。これを油圧ショベルっぽく、各パーツを黄色にするって話っす。

マテリアル

 「光あれ」で説明したように3Dの場合、単純に色を指定するって話にはなりません。金属っぽいとかザラついてるとか、いくつかのパラメータで表面の質感を指定することになるんですな。
 これがマテリアルの指定。
 このマテリアルの指定、Blender自体はオブジェクトといわず、面の1つ1つに個別のマテリアルを指定できるんだけど、ARKitがどこまで対応してるかは不明。
 オブジェクト単位では対応してるみたいなので、今回はオブジェクトごとの指定方法を説明します。
 なのでまずはオブジェクトを選択。
 bucketあたりを選択しちゃってください。
 
 
 選択したら、プロパティビューのマテリアルタブを選択。表示される画面がマテリアルの設定画面っす。

マテリアルタブ

 bucketにはすでにbodyてマテリアルを作って設定してるんで、こんな感じの画面になる。
 
 
 
 見ての通りSCNMaterialでも扱えそうな名前が並んどります。SCNMaterialのプロパティ名と関連させるとこんな感じかな。
 
 ベースカラー:diffuse
 メタリック:metalness
 粗さ:roughness
 
 スペキュラーは、どうなるか不明。
 ちなみに「ノードを使う」は今のところ使わない方向で。
 めちゃめちゃ、きめ細やかなパラメータ指定ができるんだけど、ARKit側で対応してないっす。対応する場合、自分でカスタムシェーダーを用意する必要がある。
 カスタムシェーダーについてはいずれ。
 

 
 とりま、ベースカラーをいじりゃ色が変わります。
 金属っぽくしたけりゃメタリックを1.0よりにすればいいし、ツルツルの鏡面仕上げにしたけりゃ粗さを0.0寄りにすればいい。
 で、その結果がどうなるかがプレビューで確認できるんだけど、いまいち分かりずらいっす。
 
あんま効果がわかりずらいんだ、これが
 
 こんな時は、もう、直接3Dビューで確認しちゃっていんじゃないかと思われ。
 3DビューのボトムバーのシェーディングをLookDevに変えましょう。
 注意)見えない場合、ボトムバー上にマウスを合わせて右にスクロール
 
 
 でマテリアルbodyのパラメータ、メタリックを1.0、粗さを0.0にしてから、3Dビューで視点をグリグリ動かしてみる。
 

 

 

 
 めちゃめちゃ、金属っぽいっしょ。
 色々パラメータ変えて変化の具合をみてください。
 ちなみにマテリアルbodyは、ブームやアームにも設定されてるんで、一緒に変化してます。
 で、例えばbucketだけのマテリアルを用意したい場合は、新規にマテリアルを作成する必要がある。
 その場合は、マテリアル名の横にある「×」マークをクリック。
 これでbucketだけ、割り当てられたマテリアルbodyが解除され、新規ボタンが表示されることになる。
 
 
 で、新規ボタンをクリックすれば、新しくマテリアルが作成されてbucketに割り当てられます。
 
 
 redとかつけてみる。 
 
 
 で、こうなる。
 
 
 で、まあ、ここまで書いててなんだけど、残念な知らせがあります。
 
 バージョン2.90βのBlenderで設定したマテリアル、ARKitで理解できないみたいっす。
 
 頭痛い。
 注意)「ダンスダンスダンス後編」で使ったscntoolでSCNファイルにコンバートしてもダメでした。しかも冗長指定で変換処理を細かくレポートさせても特に何も言ってこない
 
 
 
 まあ、ベータ版だしね。
 今はXcode側でマテリアル設定するしかないです。
 ちなみに、今回の元凶はマテリアルのパラメータTransparentに設定されてる色っぽい。
 Xcodeのナビゲーションエリアでyumbo.daeを選んで、インスペクターエリアのMaterial inspectorタブ選んで、Transparentを変更します。
 
 不透明の白に変更。
 
 
 あとはShadingをPhygically based(こっちも読み込み時に、判定できてないみたい)にして、MetalnessやRoughnessを調整しておしまい。
 
 
 ふう。
 ただ、これ指定しても、Blenderの時みたいにピカピカにはなりません。
 何でかというと、金属面が反射するべき周りの風景を何も指定してないから。そこらへんは次回。