在OpenGL中获取相机位置

4
我知道在OpenGL中相机不会移动,而是模型在其周围移动。但我需要获取MODELVIEW中相机的位置。是的,我也知道有很多关于此主题的讨论,但我尝试了所有他们所做的事情来获取相机坐标,但它总是返回(相机的实际位置)(0,0,0)
这就是我尝试的内容:
GLfloat mdl[16];
float camera_org[3];
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glGetFloatv(GL_MODELVIEW_MATRIX, mdl);
camera_org[0] = -(mdl[0] * mdl[12] + mdl[1] * mdl[13] + mdl[2] * mdl[14]);
camera_org[1] = -(mdl[4] * mdl[12] + mdl[5] * mdl[13] + mdl[6] * mdl[14]);
camera_org[2] = -(mdl[8] * mdl[12] + mdl[9] * mdl[13] + mdl[10] * mdl[14]);

also tried this (as said in some topics) :

camera_org[0] = mdl[12];
camera_org[0] = mdl[13];
camera_org[0] = mdl[14];

它们两个都给了我相同的结果(0,0,0),请问我做错了什么吗?


你正在使用已弃用的固定功能管线。 - ratchet freak
我只是OpenGL的初学者,你能否请再详细解释一下? - Othman Benchekroun
1
这听起来非常像你正在尝试做一些明显错误的事情。你可能应该重新考虑你实际想要实现什么,是否有更好的替代方案。要在GL矩阵堆栈中拥有合理的东西,你需要自己设置它。 - Pauli Nieminen
我找到了一个更好的方法来做它,我发布了答案,谢谢! - Othman Benchekroun
实际上 OpenGL 中根本没有相机。如果在逻辑上有相机对象,则从那里获取其位置。不要将 OpenGL 视为场景图,因为 OpenGL 不是场景图。 - datenwolf
我(以及许多其他人)所谓的相机是从中看到给定图像的位置,我需要在这个位置旁边画一些东西(当我观察场景时会跟随我的东西)。 - Othman Benchekroun
1个回答

4
我找到了这个答案:

我找到了答案:

int viewport[4]; 
// get matrixs and viewport:
glGetDoublev( GL_MODELVIEW_MATRIX, matModelView ); 
glGetDoublev( GL_PROJECTION_MATRIX, matProjection ); 
glGetIntegerv( GL_VIEWPORT, viewport ); 
gluUnProject( (viewport[2]-viewport[0])/2 , (viewport[3]-viewport[1])/2, 
0.0, matModelView, matProjection, viewport,  
&camera_pos[0],&camera_pos[1],&camera_pos[2]);

这将为您提供场景中摄像机的坐标。

1
实际上,这给了你模型视图矩阵中当前堆栈顶部的变换部分。通过查看模型视图矩阵的第四列并翻转符号,你可以得到完全相同的结果(假设你不对投影矩阵进行疯狂的操作)。 - datenwolf
4
Michael IV,你能指出应该使用哪个API吗?否则读者只知道不该做什么 - 这会让他们感到不满并增加喝咖啡的量 :( - thomastiger
1
嗨,@user7185318,代码假定您已经声明了它们。例如,您可以使用双matModelView [16]。 - Pato Sandaña
啊,抱歉,谢谢帮忙。我在阅读的时候没有真正集中注意力,在实现过程中才检查了一下。 - Luatic
这不是给你屏幕中心的未投影的3D位置,而不是3D未受保护的相机焦点吗? - Alec Jacobson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接