オブジェクトをカメラビューに回転します

Aug 20 2020

私はこれをできるだけ明確にしようとしています:

出発点

シーンの中心(0,0,0)にオブジェクトを配置します。次に、オブジェクトの周囲の半球に固定半径を指定してカメラを配置し(そして、コンストレイントを使用して常にオブジェクトを見るようにします)、イメージをレンダリングします。この異なる規則を使用する別のライブラリでオブジェクトを開くために、y-upとminus-z-forwardを使用してオブジェクトを.stlとしてエクスポートします。

問題

レンダリングされたイメージのビューに対応するようにオブジェクトを回転させたいと思います。

アプローチ

方位角と仰角の角度は既知です。したがって、2つの角度を指定して回転行列を計算します(均一な回転行列が必要なので、0と1を追加します)。

def angles_to_matrix(phi, theta):
    # phi describes the azimuth
    azi = phi
    # theta describes the inclination angle, thus:
    ele = radians(90) - theta
    rol = 0
    
    e1 = cos(rol) * cos(azi) - sin(rol) * cos(ele) * sin(azi)
    e2 = sin(rol) * cos(azi) + cos(rol) * cos(ele) * sin(azi)
    e3 = sin(ele) * sin(azi)
    e4 = -cos(rol) * sin(azi) - sin(rol) * cos(ele) * cos(azi)
    e5 = -sin(rol) * sin(azi) + cos(rol) * cos(ele) * cos(azi)
    e6 = sin(ele) * cos(azi)
    e7 = sin(rol) * sin(ele)
    e8 = -cos(rol) * sin(ele)
    e9 = cos(ele)
    
    return np.array(((e1, e2, e3, 0), (e4, e5, e6, 0), (e7, e8, e9,0 ), (0, 0, 0, 1)))

回転が正しく見えません。&私はいくつかの問題が発生している可能性があると感じています:

  • 軸の向きの変更に関して何か見落としましたか?
  • オブジェクトの回転を計算するために球座標を計算するために同じ角度を使用することさえ可能ですか?

あなたはなにか考えはありますか?

回答

1 batFINGER Aug 25 2020 at 21:33

オブジェクトをカメラに合わせる

これにより、カメラビューでオブジェクトを追加し、を使用した場合と同じ結果が得られます。 ALIGN to VIEW

デフォルトでは、Blenderオブジェクトは-Yに面し、Zが上になります。一方、カメラはYを上にして-Zを見下ろします。

オブジェクトマトリックスをその位置、回転、スケールに分解してから、再構成できます。

この場合、カメラマトリックスワールドの回転部分を取得し、前方に-Y、上方にZに変換してから、元のスケールと平行移動でオブジェクトに再構成します。

import bpy
from mathutils import Vector, Matrix
from bpy import context
from bpy_extras.io_utils import axis_conversion

scene = context.scene
cam_ob = scene.camera
ob = context.object

A = axis_conversion(
        from_forward='Z',
        from_up='-Y',
        to_forward='Y',
        to_up='Z').to_4x4()

loc, rot, scale = cam_ob.matrix_world.decompose()

ob.matrix_world = (
    Matrix.Translation(ob.matrix_world.to_translation()) @
   (rot.to_matrix().to_4x4() @ A) @
    Matrix.Diagonal(ob.matrix_world.to_scale()).to_4x4()
    )