FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


daeファイルから作成したオブジェクトのcullMode設定ができない

Blenderで3Dのオブジェクトを作成してdaeファイルで出力、それをSceneKitで使うというのはずっとやってきたんだけど、、、
そのオブジェクトの裏面を表示させようとしたらえらいはまった。

裏面を表示させるにはSCNMaterialのcullModeプロパティを SCNCullModeFront(デフォはSCNCullModeBack)にセットすればOK。
{
    SCNMaterial *material = targetNode.geometry.firstMaterial;
    material.cullMode = SCNCullModeFront;
}
cullModeセット

↑SCNBoxから作成した立方体なら意図通り右側のオブジェクトだけ裏面表示はできた(ちょっとわかりにくいけど)。

ところが、、、

Blenderでオブジェクト作成

↑Blenderで作成したオブジェクト(立方体をSculpt Modeで適当に変形、なので下の方でオブジェクト名が’Cube’になってる)。これをdaeファイルで出力。

cullMode不具合

↑そのdaeファイルから作成したオブジェクトだとうまくいかない。右は裏面指定してるのにどちらも表面を描いてるやん?!なんでだ〜?とかなり悩んでいたけどようやく原因が判明。
{
    SCNScene *daeScene = [SCNScene sceneNamed:@"art.scnassets/objects.dae"];

    //SCNNode *targetNode = daeScene.rootNode;//—(1)
    SCNNode *targetNode = [daeScene.rootNode childNodeWithName:@"Cube" recursively:NO];//—(2)
}
↑daeファイルからオブジェクトを作成する部分のコードを(1)→(2)のように変更した。
そもそも(1)でも普通に表示されるんだが、どうも階層があるようで(2)のように daeScene.rootNode の下にある子供nodeを指定するとうまくいった。
確認すると(2)で取得したnodeのparentNodeのポインタを見ると(1)で取得したnodeのそれと同じだったし。

Xcodeで示される構成

↑ただXcodeでdaeファイルのオブジェクトの構成を確認すると、こうなってるから階層があるように見えないんだよな、、、実際にはrootNodeの下に’Cube’があるってことか。

cullMode有効

↑うまくいった場合。ちゃんと裏面が表示されてる。


なお、cullModeが設定できなくて調べてたけど、結局nodeへのアクセスが正しくいできていないわけで、確認すると
targetNode.geometry
targetNode.geometry.firstMaterial
どちらもポインタの値がゼロだった。なのでカリングの話だけでなく色を設定できない?!なんて場合もあったかもしれない。
{
    material.diffuse.contents = [NSColor redColor];
}
↑(1)のコードだとmaterialはカラなので色の変更はできないが(2)だと有効だった。


{
    SCNMaterial *material = targetNode.geometry.firstMaterial;
    NSAssert(material, @"material is nil”);
}
↑こういう記述してればわかるだろうけど、まさかこれが、、、というノーマークの部分だったな。書けねえわ。

<< SceneKitのshaderModifiersで輪郭線を描く  TopPage  KerasをMacにインストール >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1176-24b81dd7




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad