Ren’Pyの3Dステージ機能について

 Ren’Pyに3Dステージという3次元的に画像を配置する機能が追加されました。それに合わせて拙作Action Editorでもv3からは以前の疑似3D機能を廃止して3Dステージ機能を使用するように変更しています。
 以前のAction Editorでは距離に合わせてレイヤーごとに移動量を変更してパララックス効果を再現する疑似3D機能を持たせていたのですが、3Dステージでは本当の3Dであるため三次元的な回転が可能になります。反面直前のカメラの動きをエディタにロードする機能はなくなっています。

 この3Dステージ機能なのですが、少し癖がある部分がありましたのでここで解説します。

 まず以下のようにして3Dステージを有効にします。他にgl_depthというプロパティーもあり、これをTrueにすると画像の重なり順がz座標優先になり、カメラに近い画像が上に表示されるようになるはずです。はずなのですが、現在ちゃんと動作しない場合があります。本家も把握しているのでそのうち直るかもしれません。

    camera:
        perspective True

 3次元的な回転をしない場合は、後はドキュメントに従い、カメラや画像を好きに動かせば直感的な動作をしてくれるでしょう。問題となるのは3次元的な回転をする場合です。

次のコードで下記画像のような状態になります。

    show bg back:
        zpos -300.0 
    show t0 A
    show t1 A:
        zpos 300.0 
    camera:
        zpos 589.0 matrixtransform RotateMatrix(0.0, 39.0, 0.0) 

 ここからカメラのx座標を移動したら直感的には全体が水平に動きそうです。しかし実際には以下のように画像から見て横方向に移動します。

    camera:
        xpos -1500 zpos 589.0 matrixtransform RotateMatrix(0.0, 39.0, 0.0) 

 そう、回転するときに座標方向も回転しているのです。もし水平方向に移動したかったのなら以下のようにOffsetMatrixを使用するとよいでしょう。

    camera:
        zpos 589.0 matrixtransform OffsetMatrix(-1500.0, 0.0, 0.0)*RotateMatrix(0.0, 39.0, 0.0)

 何故こうなるかといいますと、実はカメラステートメントは本当にカメラを動かしている訳ではなく、cameraを右に動かすときはmasterレイヤーを左に移動するなどmasterレイヤーを逆符号で動かして結果的にカメラ的な挙動として再現しているからです。3次元回転が関わらなければこれで実際のカメラの挙動と差が出ないので問題ないです。しかしカメラを回転させてから移動すると、実際に回転するのはmasterレイヤーなので、その後の移動方向がカメラの移動と考えると上記のような不思議な挙動になってしまうのです。

 OffsetMatrixを使用すると水平に移動するのはmatrixtransform内部では座標方向が変化しないのと回転後に移動しているからです。matrixtransformは右から順に適用されますので、これを逆にすると移動してから画面の中心を軸に回転するのでxposで移動した場合と同じ結果になります。

 カメラはカメラではなくステージの移動だと考えた方が混乱しない思います。通常のx,y,zposとoffsetを活用して上手いこと動かしましょう

 追記: 画像単体やレイヤーに適用した場合はmatrixtransformによる座標方向の変化は発生しないようです。カメラに対しmatrixtransformを使用した場合のみ座標方向ごと変換されるのでしょう。

Pocket