頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


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なのかってのが。


PythonのPILで日足チャートを描く

機械学習で株価予測、チャート画像に対する画像認識ってことでPythonのPIL使ってチャート画像を作成、それをCNNでやってみる計画(内部的にはver4)。

お手本は楽天証券のiSPEEDというアプリのチャート。
{
    img = Image.new('RGB',imgSize , (0,0,0))
    imgDraw = ImageDraw.Draw(img)

    imgDraw.line(((x1,y1),(x2,y2)),lineColor,lineWidth)
    imgDraw.rectangle((boxLeftTop,boxRightBottom),rectColor)
}
↑PILには線も四角形を描く関数もあるのでこれを駆使して描く。面倒だけど特に難しくはない。
ImageDrawオブジェクトからTensorFlowのデータセット用を作成、tfrecordファイルに書き込んでいく。

PILで作成した日足チャート画像

iSpeedのチャート

↑チェックのため、tfrecordファイルを読み込んで、そのデータを元に描いたチャート(上)と、同じところのお手本のチャート(下)。
処理時間の点からなるべく画像のサイズは小さい方がいいだろうということで許せる範囲で小さくしてみた(160 x 120 px)。アルファチャンネルなしのカラー画像で作成。
ちなみに短期平均線は5日、中期は25日、長期は75日で計算してる。
まずは日足と3種の平均線だけでやってみる。ここに為替とかも描くというアイデアはあるよな。

なお、今回から解答の選択肢を陽線か陰線かの2択にした。何パーセントの上げ下げかって縦の値幅も画像によって異なるので判断させるのは酷かと。

ちなみに当初は300 x 160 px画像で試してみたところ恐ろしく時間とメモリを食ったためなるべく画像を小さくした。


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




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