yuqiyun 2014-05-08 03:52
浏览 2385

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源码可供查考,谢谢

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 虚拟机打包apk出现错误
    • ¥30 最小化遗憾贪心算法上界
    • ¥15 用visual studi code完成html页面
    • ¥15 聚类分析或者python进行数据分析
    • ¥15 逻辑谓词和消解原理的运用
    • ¥15 三菱伺服电机按启动按钮有使能但不动作
    • ¥15 js,页面2返回页面1时定位进入的设备
    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝