Rotation matrix — вращать шарик вокруг вращающейся коробки

У меня есть 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;

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

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

Другие решения

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

// корректируем центр мяча до начала координат в соответствии с 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();
0

По вопросам рекламы [email protected]