将平面xy上的鼠标对应坐标转换为半径为r,球心为原点的球面上的一点,其中z的坐标可以用圆的公式计算:
z * z = r *r - x * x - y * y;
步骤:
1、把按下鼠标和拖动鼠标的坐标记为Q1,Q2,x和y分别按视口大小缩放到 [-1 , 1]
vec . x = 2.0 * x / width - 1.0;
//屏幕的y轴向下,opengl的y轴向上
vec . y = 1.0 - 2.0 * y / height;
注意,在opengl的glut库中,回调函数获取的鼠标坐标是窗口坐标!左上角为坐标原点,故可求:
width = glutGet(GLUT_WINDOW_WIDTH);
height = glutGet(GLUT_WINDOW_HEIGHT);
2、由于视口转换为1x1的正方形,所以仍有点不在球上。对于点不在球上,将该点映射到离它最近的球上的点。
if ( square <= 1.0) {
// if (x, y) is within the circle of radius 1
// calculate z so that the modulus of vector is 1
vec . z = qSqrt( 1.0 - square);
} else {
// if is out of the circle, do nomarlization
// this vector is the nearest position on the circle
// so that z is 0
double length = qSqrt( square);
vec . x /= length;
vec . y /= length;
vec . z
轨迹球将平面xy上的鼠标对应坐标转换为半径为r,球心为原点的球面上的一点,其中z的坐标可以用圆的公式计算:z * z = r *r - x * x - y * y;步骤:1、把按下鼠标和拖动鼠标的坐标记为Q1,Q2,x和y分别按视口大小缩放到 [-1 , 1]vec . x = 2.0 * x / width - 1.0; //屏幕的y轴向下,opengl的y轴向上vec . y = 1.0 - 2.0 * y / height;2、由于视口转换为1x1的正方形,所以仍有点不在球上。对于点