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”);
}
↑こういう記述してればわかるだろうけど、まさかこれが、、、というノーマークの部分だったな。書けねえわ。


KerasをMacにインストール

強化学習をいろいろ試しているんだけど、サンプルコードでKerasが使われてることが多い。そんなわけでKerasをインストールすることにした。
ちなみにこういうのは苦手なので以下の手順でやってみたところ動くようになったがたまたま動いただけだ。上級者はなんちゃらenv(たくさんあって理解不能)とかで環境作ってやるみたいよ、知らんけど。

pip install keras
↑ターミナルでこの呪文を唱えた。すると、、、ごにょごにょ表示されてる。ダウンロードとかしてんのかな。

Installing collected packages: keras-applications, keras-preprocessing, keras
Successfully installed keras-2.2.2 keras-applications-1.0.4 keras-preprocessing-1.0.2
↑あっという間に終わった?!えらい早くないか?

[Keras/TensorFlow] Keras(Tensorflow)の環境構築
↑こちらにあるMNISTのコードを自分のいつもTensorFlowを動かしてる環境にコピペし実行させてみた。
インストール前は当然
import keras
のところでエラー吐いてたけど、、、

KerasでMNIST実行結果

↑なんか計算してるー!

KerasでMNIST実行結果グラフ

↑グラフまで出て来たー!
TensorFlowとかの指定もなにもしてないんですけどね。

ともかく動くようになったので、これからKerasの勉強していこう。



macOS High Sierra 10.13.6
Python 3.5.2 :: Anaconda 4.1.1 (x86_64)
TensorFlow 1.7.0-rc1
Keras 2.2.2
pip 9.0.3 ←今回のインストール時にアップデートせえやと言われたので指示通りアプデ。
pipアップデート指示
→18.0になった。


iPhoneのメッセージ(SMS)で送信失敗の原因

最近自治会関連で電話番号しか知らない人とのやりとりをするため、SMSを使うことが多くなった。ちょっとした連絡には便利なので。

ところが、どういうわけか相手様に届かない時がたまに発生してた。

iOSのメッセージ画像

↑送信しても「未配信」となりいくら再送信してもダメ。

最初は送信先の携帯の電源が切れてるからか?とか送信先の携帯でセキュリティ上はじかれてる、Wi-Fiがおかしい?とかそういうのかと思っていたんだけど、電話したらすぐ繋がるし、この前は送信できた人へ今回はダメだったり。
それで調べてみたところ、ようやく解決した。

原因は文字数が多かったためのようだ。

iPhoneのメッセージアプリだと4行程度がMAXっぽい。
今まで送信失敗したメッセージをみると、どれも長い。
なので長くなる場合は分割するようにしたら問題なくなった。そういうことだったのかよっ!


Blenderのマテリアル・テクスチャ設定画面がいつもと違う

Blenderのマテリアル設定

↑Blender(2.79)でオブジェクトにマテリアルを設定する時、デフォだとこんな画面が右の方に出る。

Blenderのテクスチャ設定

↑テクスチャ設定だとこんなの。この画面のType:ってところはNoneになってるけど、俺の場合たいていImage or Movieにして画像を割り当てる。


ある日、どういうわけかこの画面と違う画面になってたんだ。

Blenderのマテリアル設定

↑マテリアル設定画面。

Blenderのテクスチャ設定

↑テクスチャ設定画面。

えー?なんでー?マテリアルの割り当て手順とか違うことやってしまったのか?とか悩みつつごまかしてきたんだけど、どうしようもなくなってきたのでよくよく調べてみたら、、、

モード設定部分

↑画面中央上部にあるモード設定みたいなのが変わっていたためと判明。
デフォだと Blender Render なんだけど、なんぞショートカットでも押してしまったのか、Cycles Render となっていたみたい。
そういうことだったのかあ、、、!



macOS High Sierra 10.13.6
Blender 2.79


SCNProgramのシェーダー記述を shader modifiers で置換えできる?

shader modifiersでバグ回避
↑この絡みでshader modifiersをいじってたんだけど、、、

従来の vertex shader と fragment shader を使っていた(SCNProgramを使うやつね)のを、shaderModifiersに置き換えたい。
それぞれ
vertex shader に関しては SCNShaderModifierEntryPointGeometry
fragment shader に関しては SCNShaderModifierEntryPointFragment
で置き換えられるのかな、と思ってたけどどうもそんな感じではない。

SCNShaderModifierEntryPointGeometry での計算結果を
SCNShaderModifierEntryPointFragment に渡す、というのができそうにない。

ただ例えば phong shader を作ろうとしたら、計算に必要な法線や視線ベクトルどうすんのよ!となるけどそんな場合には SCNShaderModifierEntryPointSurface ってのがある。
SCNShaderModifierEntryPointSurface - SceneKit | Apple Developer Documentation
↑本家のリファレンス。
これだと
vec3 view;
vec3 position;
vec3 normal;
などなどたくさん使えるのがある(フラグメントでの法線なんかがすでにある!)のでこれだけで大抵のことはできそう。


ただ、自分がやってたのは vertex shader に頂点ごとのあるデータを与えて、その計算結果を fragment shader に渡して描いてたんだが、こういう処理は shaderModifiers じゃできそうにない、多分。もし可能なら方法教えてください!




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

FC2Ad