2013-05-30 6 views
0

У меня есть 3D-коробка: center point = (a,b,c), width = w, height = h, depth = d.Вращающаяся матрица - вращайте шар вокруг вращающейся коробки

Центральная точка не является источником.

У меня есть шар на коробке (коснитесь друг друга), его center и radius.

Я могу повернуть коробку (вокруг оси X, но ее центр STAYS тот же ..), и я хочу, чтобы мяч оставался прикрепленным к коробке. так что мяч должен быть повернут с коробкой.

угол поворота составляет 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; 

шар действительно вращается, когда коробка вращается, но слишком далеко. Как я могу это исправить?

ответ

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; 
+0

спасибо !!!!!! он работает сейчас:]] вы сделали это! Я вижу, что я не могу опубликовать окончательный ответ здесь (комментарии слишком короткие), поэтому я опубликую его в новом сообщении. –

0

благодаря Александру Михайлову, вот окончательный ответ:

// исправляя мяч центр в начало координат в соответствии с box.Center

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

// rotation_matrix (по оси х) * ball_center_corrected // поэтому вращение вокруг оси Х

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();