我正在试图用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源码可供查考,谢谢
opengl屏幕坐标转世界坐标的问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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时被拒绝