頭と尻尾はくれてやる!

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


SceneKitのカメラのprojectionTransformにやられた

SceneKitを使っているとSCNViewのallowsCameraControlを真にしてカメラをジェスチャーで動かせるようにしておき、描いたオブジェクトを確認できたりする。
そのままリリースすることは少ないと思うがデバッグ時には重宝する。

この場合の視点のSCNNodeオブジェクトはscnView.pointOfViewでアクセスでき、カメラの位置や姿勢を得ることができる。
また、scnView.pointOfView.cameraでSCNCameraクラスのプロパティにもアクセスできる。

ところが、だ。




↑SceneKitで描いたオブジェクトのある頂点(赤い点)の座標を画面上ではどこに相当するか?というのを計算していた。薄い正方形(UIViewオブジェクト)のセンターを計算した座標にセットしてるのにいくらやっても計算があわない。ツイートの画像はあわなくて泣いてるところの絵だ。

不思議なことにy座標だけはあっている。
y座標だけはあうのでprojection matrixあたりなんだろうな、とその辺りを調べててようやく気付いた。

allowsCameraControlを真にしてジェスチャーでカメラを移動させた時、projection matrixの値も変わっている!

と書くと誤解を招くかもしれない。
allowsCameraControlのジェスチャーでカメラを移動させた時、ピンチすると拡大、縮小しあたかもカメラがオブジェクトに近くなったり遠くなったりしたように見えるのだが、これ、値を確認してわかったのだが、SCNCameraのfieldOfViewの値が変わっていた。
この値が変わるということはprojection matrixの値が変わることになる。

ところが、、、
scnView.pointOfView.camera.projectionTransform
でカメラのprojection matrixを得ることができるが、この行列はずっと変わらないのだ。

ふっ、こりゃまたバグレポ書いて出さないとダメだなあ、なんて思ってたが、

リファレンスのスクショ

↑リファレンスにわざわざImportantと注意書きしてあった。
projectionTransformはfieldOfViewなどのプロパティを変更しても書き換えられないらしい、、、
なんだそれ?と思ったがリファレンスに書いてあるんだから、もっと早く気付けよ、俺!

そんなわけで視点を動かすたびにprojection matrixを都度計算してやるとようやく計算があい、赤い点と薄い正方形のセンターが一致するようになった。
喜びの表情が↓これだ。


スポンサーサイト

<< SCNGeometryからMDLMeshを作成する  TopPage  ARKitのARFaceGeometryでのメッシュの切られ方を確認する >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1283-1562b7a3




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

FC2Ad