模型视图-在Opengl2.x[C++]中获取模型视图和投影矩阵
model view - Getting ModelView and Projection matrices in Opengl 2.x [C++]
我知道StackOverflow充满了类似的问题(比如这个或那个),但给出的解决方案似乎对我不起作用。我的目标是使用gluProject
从三维空间中获取某个点的屏幕坐标。在此之前,我希望通过以下操作获得矩阵:
GLint view[4]={0};
GLdouble proj[16]={0};
GLdouble model[16]={0};
glGetDoublev(GL_PROJECTION_MATRIX,proj);
glGetDoublev(GL_MODELVIEW_MATRIX,model);
glGetIntegerv(GL_VIEWPORT,view);
知道这三个可以计算点的屏幕坐标。然而,当我调用这些函数时,我会得到奇怪的结果:
VIEWPORT
0 0 1366 768
PROJECTION
-536 870 912 1 073 460 858 0 0
0 0 -536 870 912 1 073 460 858
0 0 0 0
0 0 0 0
MODELVIEW
1 073 741 824 1 073 741 824 -1 073 741 824 1 071 119 123
0 0 1 073 741 824 1 072 511 075
-1 073 741 824 1 072 523 682 0 -1 077 637 615
-2 147 483 648 -1 069 923 613 0 -1 071 413 844
使用CCD_ 2和CCD_ 3来生成矩阵。Viewport显然是正确的,但矩阵是错误的,这不仅是因为它们的值在我看来不太正常,还因为值在矩阵元素之间的分布(请参见投影矩阵的[1,2]元素应该是零,但它不是,而[3,3]元素是零,它不应该)。
这些奇怪的值指出了glGet()
函数调用中的一些问题,但我无法理解。我已经检查过我没有在glBegin()
和glEnd()
之间调用glGet()
。实际上,我在正确绘制一些点之后,以及在使用相同的ModelView和Projection矩阵正确绘制一些球体之前,调用glGet()
。我的代码有一个更大的片段(调用序列是main->CheckForPlanetPosition->Planet::GetScreenLocation
):
typedef struct position {
int x,y,z;
};
int main()
{
glEnable(GL_DEPTH_TEST);
glViewport(0,0,1366,768);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,16.0f/9.0f,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(Camera.x,Camera.y,Camera.z,Camera.cx,Camera.cy,Camera.cz,0,1,0);
//calls to glEnable
//some drawing
glBegin(GL_LINES);
for(float i=1;i<15;i++)
{
glColor4f(0,120.0f/255.0f,210.0f/255.0f,1.0f);
glVertex3f(0,0.5f,i*100.0f/15.0f);
glVertex3f(100,0.5f,i*100.0f/15.0f);
glVertex3f(i*100.0f/15.0f,0.5f,0);
glVertex3f(i*100.0f/15.0f,0,100);
}
glEnd();
CheckForPlanetsLocation();
//other stuff...
return 0;
}
bool CheckForPlanetsLocation()
{
position pos;
pos=SomePlanet.GetScreenLocation();
//check that the mouse is over the returned region...
}
position Planet::GetScreenLocation()
{
GLint view[4]={0};
GLdouble proj[16]={0};
GLdouble model[16]={0};
GLdouble x,y,z;
glGetDoublev(GL_PROJECTION_MATRIX,proj);
glGetDoublev(GL_MODELVIEW_MATRIX,model);
glGetIntegerv(GL_VIEWPORT,view);
gluProject(pos.x,pos.y,pos.z,model,proj,view,&x,&y,&z);
position res;
res.x=(int)x;
res.y=(int)y;
res.z=(int)z;
return res;
}
希望你这次能帮助我!提前感谢您的回答:)
问题是gluProject
在传递float
时需要一个类型为double
的数组。当它进行迭代时,它将使用double
的大小进行迭代,这是浮点大小的两倍!因此,它会跳过一些元素,并为其他元素提供垃圾。用double替换掉那些浮点数组,然后使用glGetDoublev
来获得所需的值。
此外,您的gluPerspective
代码中有一个小错误——16/9在传递给函数之前将整数截断为1。这不是导致投影问题的原因,但最好记住,整数截断会导致浮点计算出错。
最后,我会说,在这个时代,学习OldenGL(我称之为OldenGL)弊大于利。现代OpenGL有很多很棒的在线教程,比如:
Open.GL
LearnOpenGL
任何提到OpenGL 2及以上版本的内容都是您想要的。
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- C++模型视图设计
- 如何从模型/视图中获取QImage POINTER
- 更新模型/视图方案中 QXXXView (QTableView, QTreeView,..) 元素的显示工具提示
- Qt:模型/视图框架上的数据转换
- 多个模型视图矩阵
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- Qt:模型/视图-定义项目持有日期的格式
- 关于在模型/视图Qt文档中排序的描述可能是错误的
- QMatrix4x4 模型视图投影 OpenGL 无法获取要渲染的场景
- Qt应用程序开发中的模型视图控制器
- Qt模型视图:当数据存储和更改数据时,更新模型和视图的正确方法是什么::vector
- 四边形的模型视图矩阵
- 将 GL 模型视图矩阵转换为世界坐标
- 如何在Qt中创建一个持续正确的只读模型/视图架构
- 使用具有非类表数据和非表/列表UI的Qt模型/视图
- QT模型/视图,如日志查看器
- Qt:如何同步访问数据从多个线程在模型/视图设置
- 嵌套模型/视图体系结构
- 模型视图控制器实现QT