頭と尻尾はくれてやる!

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


SceneKitでシェーダにSCNMatrix4を渡す

SceneKitなら通常SCNMatrix4を渡すなんてことしなくてもいいんだけど、デバッグ用にやろうとした。これがえらくはまったのでメモ。

SceneKitでシェーダに値(配列)を渡す
↑ここではfloat値およびfloat値の配列を渡しているけど、今回はSCNMatrix4。
同じように
{
    SCNMatrix4 matrix = _matrix;
    NSData *buffer = [NSData dataWithBytes:&matrix length:sizeof(SCNMatrix4)];
    [node.geometry.firstMaterial setValue:buffer forKey:@"matrix"];	
}
って書いたらなぜかシェーダに渡らない(警告もエラーもなし)。

おっかしいなあ?とさんざん悩んだあげくにたどり着いたのが、、、
{
    SCNMatrix4 matrix = _matrix;
    NSValue *buffer = [NSValue valueWithSCNMatrix4:matrix];
    [node.geometry.firstMaterial setValue:buffer forKey:@"matrix"];	
}
不思議や、、、でも時々あるんやわ。NSDataなのかNSValueなのかってのが。


SceneKitでdaeファイル内のテクスチャ画像のリンクを得る

Blenderでテクスチャ付きのオブジェクトをdaeファイルで出力する
↑こんな感じでBlenderでテクスチャを設定してそれをdaeファイルとして出力。それをSceneKitで使う時に、テクスチャのURLはどうやって取得できるのかなと思って調べた。

Xcode上でのdaeファイル

↑daeファイル内にあるテクスチャ画像のリンク先があっていれば、Xcodeに持って来てオブジェクトを確認したらテクスチャが適用されているはず。
なので、通常テクスチャのURLなんて不要かもしれない。ただ、今回はテクスチャ画像のリンク先からNSImageオブジェクトを作成、シェーダに教えたいので調べる必要があった。

{
	SCNScene *daeScene = [SCNScene sceneNamed:@"art.scnassets/frog.dae”];//—(1)
	SCNNode *node = daeScene.rootNode;//—(2)

	if ([node.geometry.firstMaterial.diffuse.contents isKindOfClass:[NSURL class]]) {//—(3)
		NSURL *textureURL = node.geometry.firstMaterial.diffuse.contents//—(4)
            }
}
(1) daeファイルをどこに置くのかにもよるけど、ともかくSCNSceneオブジェクトを作成。

(2) daeファイルの構成によってはrootNodeではないかもしれない。ボーンがあれば上記のでは動かないと思う。

(3)リファレンスだとcontentsはid型で、↓このように画像ファイルの場合はどちらか、とあるので一応確認してる。
An NSString or NSURL object specifying the location of an image file

(4) 俺がやったらNSURLだったのでNSURLオブジェクトを取得してる。
テクスチャをシェーダに渡して表示

↑これを使いNSImageオブジェクトを作成、シェーダに渡すというのができた(何それ?って画像だけど)。


Blenderでテクスチャ付きのオブジェクトをdaeファイルで出力する

Blenderでテクスチャ付きのオブジェクトをdaeファイルで出力する、という前からやってたことがなんだかうまくいかなくて整理してみた。Blenderのバージョンは現時点で最新の2.79。
ここでTexture PaintするのはLayout画像のメッシュがどこ部分かを色を手がかりに把握するため(最終的な塗りはドロー系アプリで行う)。


(1) unwrap
画面を二分割して左にUV/Image Editorにしておく
editモードで’u’で’Smart UV Project’を使うことが多い。

unwrapで表示されるlayout

↑UV/Image Editor側に展開図みたいなのが表示される。

(2) Texture Paint モードで Add Paint Slot / Diffuse Color

Missing Data warning

↑画面右(3D View)をTexture PaintにするとMissing Dataって警告が出てるので指示通りAdd Paint Slot でDiffuse Colorを選択、名前は適当に作成しOKをクリック。

(3) 画面左で対応する画像を選択、保存

画像選択

↑画面左(UV/Image Editor)で画像っぽいアイコン(?)をクリックするとさっき付けた名前のがあるのでそれを選択。

テクスチャ画像保存

↑色を塗ったら’Image’のところに※マークがる。画像を保存できるで!ってことなのでsave as imageで保存。このファイルとLayoutの画像(※1)があればドロー系アプリで正確なテクスチャ画像の作成ができる。

(4) daeファイルで出力

dae出力オプション

↑出力時のオプションだが基本このままでOKのはず(たいていはSelection Onlyだけど)。

daeファイル出力

↑daeファイルとテクスチャが指定フォルダに出力された。
上のcopyのチェックを外すとsaveした画像へリンクされる(daeファイルをテキストエデイタで確認すると見える)。


以前はやってたMaterialの設定もUV Mapsの設定もよきにはからってくれてるみたい、、、


※1 Layoutはeditモードで UV/Image Editor のUVsってところにあるExport UV Layoutで出力できる



Blender 2.79
macOS High Sierra 10.13.4


TensorFlowを1.7にアップデート

最近ほったらかしだったので、、、ようやくTensorFlowのアップデートした。

Installing TensorFlow on macOS  |  TensorFlow
↑ここにあるように、
sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.7.0rc1-py3-none-any.whl
でやってみた。

tf.__version__ で確認すると
version 1.7.0-rc1
になった。
動かすとなにやらdeprecatedだよ!などの警告とか出たけどまあ動くのは確認した。ふー。こういうの妙に緊張する。


macOS 10.13.4


SceneKitのチェック用カメラの位置などを得る

SceneKitのSCNViewクラスに allowsCameraControl ってプロパティがあってこれをtrueにするとカメラの位置や方向をトラックパッドやマウスで簡単に変えられるのでデバッグにすごく便利で重宝する。

カメラのオブジェクトやプロパティ(位置やfovとか)は自分で設定し、実行時にカメラ位置などは当然それに従う。allowsCameraControl でカメラ位置を動かしたとしてもカメラオブジェクトの位置などを調べても値は変化しない。
移動した後の位置を取得できたらいいのになあ〜と思って調べたことがあったんだがそんな方法はなさそうで無理なんだろうなとずっと思っていたんだけど、先日再度調べたら方法が見つかった。

ios - Can I get the SCNView camera position when using allowsCameraControl? - Stack Overflow

↑単にSCNViewオブジェクトのpointOfViewで読み込んだのがカメラに相当するとか。
{
    SCNNode *cameraNode = scnView.pointOfView;
    SCNVector3 currentCameraPosition = cameraNode.position;//などなど
}
pointOfViewは視点を切り替える時に使ってはいたけど、これで取得できたとは!




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

FC2Ad