我有一个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 :(得分: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)
//根据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();