旋转矩阵 - 围绕旋转盒旋转球

时间:2013-05-30 00:04:40

标签: c++ 3d rotational-matrices

我有一个3D框:center point = (a,b,c)width = wheight = hdepth = d

中心点不是原点。

我的盒子上有一个球(互相触碰),centerradius

我可以旋转盒子(围绕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;

当盒子旋转但是太远时球真的旋转了。我该如何解决?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

感谢Alexander Mihailov,这是最后的答案:

//根据box.Center

将球中心校正到原点
    Point3D ball_center_corrected = ball.Center() - box.Center();

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