推导
三维坐标的旋转其实挺容易理解的。
首先需要有个旋转中心
,
其次是我们的旋转点
,
那么可知旋转点
的相对坐标为
此时我们开始旋转。因为坐标系有三个轴,那么旋转其实就是绕着任意的两个轴进行旋转(当然三个轴也是可以的,但是两个轴足以实现三个轴的效果了)
绕着某一轴进行旋转的过程中,该轴对应的坐标是不产生变化的,那么实际上变化的坐标就是在一个二维平面上,此时就又转化为二维旋转问题。
二维坐标旋转问题
假设已知 ,现围绕原点 旋转 角度,求现在位置 :
首先设 与 轴夹角为 ,那么 与 轴夹角为 ,可知:
利用两角公式展开:
化简:
代码实现
//三维坐标
struct Position{
float x;
float y;
float z;
};
//二维坐标旋转
void rotation(
float &x,
float &y,
float degree)
{
if(degree==0)
return;
float tempx = x * cos(degree) - y * sin(degree);
float tempy = y * cos(degree) + x * sin(degree);
x = tempx;
y = tempy;
}
//三维坐标旋转
void rotation(
Position &point,
Position origin,
float degreeX,
float degreeY,
float degreeZ)
{
//求出到旋转点的相对坐标
point.x -= origin.x;
point.y -= origin.y;
point.z -= origin.z;
//分别绕X、Y、Z三轴进行旋转
rotation(point.y,point.z,degreeX);
rotation(point.x,point.z,degreeY);
rotation(point.x,point.y,degreeZ);
//根据旋转点转换回原来的坐标系
point.x += origin.x;
point.y += origin.y;
point.z += origin.z;
}