2017-05-15 30 views
0

私はビデオをレイトレースするようにしています。そのためには、世界座標で、すべてのフレームのカメラローテーション行列が必要です。カメラは原点にあります。翻訳はありません。カメラの回転行列

私は、フレームごとに回転の変化としてカメラの軌跡を持っています。 フレームごとに、このフレームから次のフレームまでカメラがどのくらい回転するかを表す3つの値(ロール、ヨー、ピッチ)があります。これらの回転は、カメラ座標系で理解されるべきである。

フレームのワールド座標ローテーション行列を計算するにはどうすればよいですか?

def rot_x(angle): 
    cosa = np.cos(angle) 
    sina = np.sin(angle) 
    return np.array([[1,0,0], [0, cosa, -sina], [0, sina, cosa]]) 

def rot_y(angle): 
    cosa = np.cos(angle) 
    sina = np.sin(angle) 
    return np.array([[cosa, 0, sina], [0,1,0], [-sina, 0, cosa]]) 

def rot_z(angle): 
    cosa = np.cos(angle) 
    sina = np.sin(angle) 
    return np.array([[cosa, -sina, 0], [sina, cosa, 0], [0,0,1]]) 

matrices = [initial_rot] 
for pitch, yaw, roll in frames_data: 
    rx = rot_x(pitch) 
    ry = rot_y(yaw) 
    rz = rot_z(roll) 
    last_matrix = matrices[-1] 
    matrices.append(last_matrix.T.dot(rx).dot(ry).dot(rz)) 

(last_matrixは正規直交である必要がありますので、それの逆転置する必要があります):私が試した何

しかし、何かがひどく間違っていて、レンダリングされたビデオがy次元でちらつくだけです。ここで数学に何か問題があると確信しています。

答えて

2
  1. 行列乗算の順序は重要です。別のローテーションを適用するには、左掛け(標準的な規則を前提とする)を行う必要があります。

  2. これは単なる複数回の回転であるため、最後の回転を逆にする必要はありません。フレームNについて計算されるべきである

完全な回転がある:従って

R_0: the initial rotation (i.e. initial_rot) 
R_n: the complete rotation for the frame N 
R(yaw_n, pitch_n, roll_n): the rotation derived from the yaw/pitch/roll values applied between frame N - 1 and N (i.e. rx.dot(ry).dot(rz)) 

コードの抜粋の最後の行ではなくなければならない:

R_n = R(yaw_n, pitch_n, roll_n) R_{n - 1} R_{n - 2} ... R_1 R_0 

rotation = rx.dot(ry).dot(rz) 
matrices.append(rotation.dot(last_matrix)) 
+0

これは、常にカメラを世界の座標系の軸ではなく、カメラ軸ですか? – user3207838

関連する問題