頭と尻尾はくれてやる!

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


SCNFloorの床にオブジェクトが映らない

SCNFloorの床1

↑床(SCNFloorオブジェクト)に映るのと映らないのがある、、、
赤い立方体が床に映ってないけど、shipの方も床に接触しなかったら映らなくなったりしてた。
なんだよ、これ、、、
けどもういいわ。深入りするのはやめよう。だってSceneKitだもの。

SCNFloorの床2

↑最初のはコードで書いてたんだが素直に(?)Scene Editorで床を作成したらいけた。



macOS High Sierra 10.13.4


SCNFloorの床が逆さま?

SceneKitで物理エンジンを試そうと”床”を作ったんだ。
{
    SCNFloor *floorGeometry = [SCNFloor floor];
    SCNNode *floorNode = [SCNNode nodeWithGeometry:floorGeometry];
    floorGeometry.firstMaterial.diffuse.contents = [NSColor lightGrayColor];//—(1)
    floorNode.physicsBody = [SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeStatic shape:nil];//—(2)
    [mainScene.rootNode addChildNode:floorNode];
    
//    floorNode.orientation = rotationQuaternion;//—(3)
}
↑こんな感じで(1)床に色付けて、(2)物理エンジンで処理できるように設定。
最初(3)の回転はなしとする。

SCNFloorデフォルト

↑これで実行するとどういうわけか床に色が付かない。物理演算は期待通りには動いてるけど。

そこで(3)のようにして床をx軸周りに180度回転させた。そうすると、、、

SCNFloorを180度回転

↑床の色は見えた。やっぱりさっきは裏を見ていたのか、と思ったのだが今度は物理演算の挙動がおかしい。180度回転させたのでxz平面より上側に質量があるような挙動になってる(平面上部より立方体を落とそうとするのだが生成と同時に平面の下へ追い出されそこから自由落下する)。

まあSCNBoxとか使えばなんとかなるからいいけどさ、、、


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オブジェクトを作成、シェーダに渡すというのができた(何それ?って画像だけど)。




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

FC2Ad