Ren’Pyの3Dステージ機能について4 xyzrotateとorientation, poiについて

 matrixtransformを使用した三次元空間の操作は自由度が高い反面ややこしくて万人向けでなく、自由度が高すぎて拙作のActionEditor上で扱いづらいです。そこで簡単化したプロパティーを追加するパッチを本家に送りましたところ、無事採用されました。本ページでは追加プロパティーの紹介とそれらではカバーできないより細かいmatrixtransformでの操作の紹介を行います。追加プロパティーはv8.1またはv7.6以上から使用可能になります。

{x/y/z}rotate と orientation, poi

 追加したプロパティーは {x/y/z}rotate と orientation, poiの3つです。これらは回転順がAfterEffectとは逆順である以外はAfterEffectと同様に動作します。AfterEffectが分かっている人は、次の見出しまで読み飛ばして良いです。

 xrotate, yrotate, zrotateはそれぞれ、displayableとカメラを現在の位置を中心にその場でx,y,z方向に回転させるプロパティーです。正確にはzpos=z, matrixanchor=(x, y)のオブジェクトを(x, y, z)中心に回転させます。matrixtransformのRotateMatrixだとカメラは(0, 0, 0), displayableは(x, y, 0)を中心に回転するのでその辺を考えずにその場で回転させられます。

230326 追記 ちなみにRen’Pyの回転系は基本的にxyz順の固定回転(つまりzyx順のオイラー回転)です。しかし、カメラについては逆にzyx順の固定回転になります。これはカメラを動かすときは実際にはカメラ以外を動かしてそれっぽく見せているためです。カメラ以外をxyz順に回転させると、第三者から見るとカメラがzyx順に逆符号で回転しているように見えます。なんとなく落ち着きませんが、修正すると後方互換性が崩れるので仕方ないです。

 orientationもx,y,zrotateと同じ座標を中心に回転するプロパティーですが、こちらはx,y,zrotateと違い、最短距離で回転します。以下のサイトに解説と動画があるので参照してください。

 最後にpoiです。こちらも上記同様に同じ座標を中心に回転するプロパティーですが、回転角度ではなく方向を指定します。例えばcameraのpoiに(x, y, z)と指定すると、常に座標(x,y,z)を向き続けるように回転されます。これにより、常に特定の画像へ向けながらカメラを動かしたり、逆にカメラを向きながら画像を動かしたり出来ます。本当は座標ではなく画像タグやカメラを直接指定できるようにしたかったのですが難しかったので座標指定になっています。カメラや特定の画像に向けたいときはその座標と同期するように手動指定しください。

230326 追記 画像をカメラに向ける機能も追加されました。逆は色々面倒なので出来ませんが、なくてもそこまで不自由はないでしょう。

 これらと既存のx,y, zposとを合わせれば、固定座標上での回転と移動が簡単に出来るようになるので相対座標で今どっち向いているのかとかと考えるよりはわかりやすいかと思います。

 ちなみに、これらを採用した理由はAfterEffectが採用していたからです。自分は動画編集経験はなく、実際の三次元空間の座標指定方法がどうであればやりやすいかが分からないため、業界標準のソフトが採用していた者をそのまま流用しました。業界標準なのだから間違ってはないはず。多分

より細かいmatrixtransformでの操作の紹介

 もしも回転中心を任意の座標にしたり、回転後の座標で移動したい場合はmatrixtransformを使用してください。例えばカメラを(x, y, z)オフセットした座標中心で(r1, r2, r3)回転し、回転後の座標系で(x2, y2, z2)移動したいときは次のようにmatrixtransformに指定します。

OffsetMatrix(x,y,z)*RotateMatrix(r1,r2,r3)*OffsetMatrix(-x,-y,-z)*OffsetMatrix(x2,y2,z2)

 Matrixは右から順に適用されます。注意して欲しいのはカメラに対するmatrixtransformはカメラではなくステージの方を動かしている点です。上記matrixの最初の3つはではステージを(-x, -y, -z)移動してから(r1, r2, r3)回転し、(x, y, z)移動して元の位置に戻しており、結果的にステージを(x, y, z)オフセットした回転中心で回転していることになります。さらに予め(x2, y2, z2)移動すると、移動した状態で回転するので、結果的に回転後の座標系で移動したのと同じになります。ややこしいですね。

 ちなみに、ステージを中心に考えた場合とカメラを中心に考えた場合はmatrixの適用順と符号が逆転します。さらに回転順は前述xyzからzyxになります。上記の場合をカメラを中心に考え直すと、カメラを(-x, -y, -z)オフセットしてから(r1, r2, r3)をzyx順に変換した回転をしたのち、(x, y, z)オフセットして戻し、(-x2, -y2, -z2)移動するという解釈になります。

 もしもこの状態からさらに(x3, y3, z3)オフセットした座標で(r1′, r2′, r3′)回転したい場合は上記にその回転分を追加した次を指定します。

OffsetMatrix(x3,y3,z3)*RotateMatrix(r1′,r2′,r3′)*OffsetMatrix(-x3,-y3,-z3)*OffsetMatrix(x,y,z)*RotateMatrix(r1,r2,r3)*OffsetMatrix(-x,-y,-z)*OffsetMatrix(x2,y2,z2)

 matrixtransformには現在のmatrixに追加でmatrixを加える方法がないため、以前の状態を基準に変化しようとするとどんどん長くなっていきます。現在の状態をCurrentMatrixとかにして指定できるようになって欲しいです。以前の状態を基準にしようとかしなければ問題ないですけど

230317追記 Spline と poi を使用した代用

 上記の任意の座標を回転中心にした移動は、厳密さにこだわらずそれっぽくしたいだけならば、 matrixtransform を使用するよりスプラインによる移動とpoiを併用した方が多分簡単かと思われます。。

camera:
    pos (x1, y1) zpos z1
    linear 3 pos (x3, y3) knot (x2, y2) zpos z3 knot z3

 上記のようにすると(x1, y1, z1) -> (x2, y2, z2) -> (x3, y3, z3)の順に滑らかに移動するので、適当な座標を中心に回転移動するのと似た感じになります。poiを使用して回転中心に近い位置にカメラを向ければ、さらにそれっぽくなるでしょう。

 また、回転後の座標系で移動したい場合も、考えやすい絶対座標で指定した方がmatrixの組み方を考えるよりは簡単でしょう。

 230326 追記 poiがpoint_toにリネームされました。

 

Pocket