2 yuqiyun yuqiyun 于 2014.05.08 11:52 提问

opengl屏幕坐标转世界坐标的问题

我正在试图用opengl实现一个类似google earth那样的功能:
1),相机永远面向地球的球心
2),鼠标定点拖动旋转,也就是鼠标按住地球上一个点移动的时候,这个点就跟随鼠标的位置运动,鼠标动了多长,相机就旋转多长,一开始按住的那个点一直处于鼠标的位置,而不要跑开了
现在我已经实现了基本的旋转部分,拖动鼠标相机就转动,但没有定点转动,现在就剩下定点拖动旋转这个功能了,我的思路是将鼠标点击屏幕的屏幕坐标转换成opengl的世界坐标,通过这个点构造一个射线,求出射线和地球的交点坐标,如果射线和地球没有相交,则不会产生任何效果。如果有相交,则计算鼠标移动到下一个位置的时候的屏幕射线与地球的交点坐标,通过两个坐标的值近似计算成鼠标在地球表面划过的弧长,然后将这个长度作为偏移量算出相机旋转的量。
现在的问题是屏幕坐标转世界坐标异常,不管点击屏幕上的任何一点,计算出的世界坐标都几乎一样,只有小数点后好几位的值有细微差别,旋转相机或者远离或靠近地球时坐标值会改变,但依然屏幕任何一点的坐标都差不多一样,计算坐标转换的代码如下:
void screen2world(int x, int y)

{

GLint viewport[4];

GLdouble modelview[16];

GLdouble projection[16];

GLfloat winX, winY, winZ;

GLdouble posX, posY, posZ;

glGetDoublev(GL_MODELVIEW_MATRIX, modelview);

glGetDoublev(GL_PROJECTION_MATRIX, projection);

glGetIntegerv(GL_VIEWPORT, viewport);

winX = (float)x;

winY = (float)viewport[3] - (float)y;

glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

}

请问一下出现问题的原因可能是什么?另外我的鼠标定点拖动旋转的思路有问题吗?还有就是有没有实现类似google earth那样的拖动旋转功能的demo源码可供查考,谢谢

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!