У меня есть 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;
мяч действительно вращается, когда коробка поворачивается, но слишком далеко. Как я могу это исправить?
Вы пытались перевести его в начало координат, повернуть, а затем перевести обратно?
И я думаю, что координаты должны умножаться справа на матрицу преобразования, т.е.
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;
спасибо Александру Михайлову, вот окончательный ответ:
// корректируем центр мяча до начала координат в соответствии с box.Center
Point3D ball_center_corrected = ball.Center() - box.Center();
//matrix_matrix (по оси X) * 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();