三维空间中,每个物体有一个包围球 ,跟踪球思想有点类似拨动地球仪,就是拨动物体的包围球,物体也随之旋转,这样子可以更好的,更全面的观察物体。
主要思想就是鼠标单击屏幕,并执行拖动:画出一段弧线,起点v0,终点v1。这两点都是二维的,必须投影到三维空间中,分别记为:p0,p1, 也就是两个向量:p0,p1,进行单位化以后,二者进行差乘求出向量axis,则axis就是物体旋转轴。angle成员变量是控制球体转动速度的
//根据二维的坐标x,y产生一组三维的坐标,单位化后存放到v中
void trackball_Prov(int x, int y, float v[3])
{
GLfloat d, a;
//(winWidth/2, winHeight/2)为球心
v[0] = (x - winWidth/2) / (winWidth/2);
v[1]=(y - winHeight/2) / (winHeight/2);
d=(float)sqrt(v[0]*v[0]+v[1]*v[1]);
v[2]=(float)cos ( (M_PI/2.0F)* ( (d<1.0) ? d : 1.0F ) );
// 单位化
a=1.0F / (float)sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
v[0] *=a;
v[1] *=a;
主要思想就是鼠标单击屏幕,并执行拖动:画出一段弧线,起点v0,终点v1。这两点都是二维的,必须投影到三维空间中,分别记为:p0,p1, 也就是两个向量:p0,p1,进行单位化以后,二者进行差乘求出向量axis,则axis就是物体旋转轴。angle成员变量是控制球体转动速度的
//根据二维的坐标x,y产生一组三维的坐标,单位化后存放到v中
void trackball_Prov(int x, int y, float v[3])
{
GLfloat d, a;
//(winWidth/2, winHeight/2)为球心
v[0] = (x - winWidth/2) / (winWidth/2);
v[1]=(y - winHeight/2) / (winHeight/2);
d=(float)sqrt(v[0]*v[0]+v[1]*v[1]);
v[2]=(float)cos ( (M_PI/2.0F)* ( (d<1.0) ? d : 1.0F ) );
// 单位化
a=1.0F / (float)sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
v[0] *=a;
v[1] *=a;