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