0

私は 3D ボックスを持っています: center point = (a,b,c), width = w, height = h, depth = d.

中心点は原点ではありません。

私は箱の上にボールを持っています(お互いに触れます)、centerそれとradius.

私は箱を回転させることができます(X軸の周りですが、その中心は同じままです..)そして、ボールが箱にくっついたままになりたいです。そのため、ボールをボックスで回転させる必要があります。

回転角度は 45 度です。

私はこれをやろうとしました:

X 軸を中心に回転行列を定義しました。

mat[3][3]
1,    0   ,    0 
0, cos(45), -sin(45) 
0, sin(45), cos(45)

ボールの中心ベクトルを掛けます。

(ball.Center().m_x , ball.Center().m_y, ball.Center().m_z) * mat

だから私は得た:

Point3D new_center(ball.Center().m_x, 
                   ball.Center().m_y*cos(45) + ball.Center().m_z*sin(45), 
                   -(ball.Center().m_y)*sin(45) + ball.Center().m_z*cos(45));
ball.Center() = new_center;

ボックスを回転させたときにボールが実際に回転しますが、遠すぎます。どうすれば修正できますか?

4

2 に答える 2

0

それを座標の原点に変換し、回転させてから逆に変換しようとしましたか?

そして、座標の右側に変換行列を掛ける必要があると思います。つまり、次のようになります。

Point3D new_center(ball.Center().m_x, 
                   ball.Center().m_y*cos(45) - ball.Center().m_z*sin(45), 
                   ball.Center().m_y*sin(45) + ball.Center().m_z*cos(45);
ball.Center() = new_center;
于 2013-05-30T02:19:07.577 に答える
0

アレクサンダー・ミハイロフのおかげで、これが最終的な答えです:

// box.Center に従ってボールの中心を原点に修正

    Point3D ball_center_corrected = ball.Center() - box.Center();

// rotation_matrix(of X axis) * ball_center_corrected // したがって、回転は X 軸を中心に行われます

    Point3D new_center(ball_center_corrected.m_x,
                       ball_center_corrected.m_y*cos(angle) -
                       ball_center_corrected.m_z*sin(angle),
                       ball_center_corrected.m_y*sin(angle) +
                       ball_center_corrected.m_z*cos(angle));

// ボールの中心をボックスの周りに戻します

    ball.Center() = new_center + box.Center();
于 2013-05-30T10:03:19.160 に答える