【问题标题】:Get the camera position in opengl在opengl中获取相机位置
【发布时间】:2014-08-27 12:44:07
【问题描述】:

我知道在 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]);

也试过这个(如在某些主题中所说):

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

他们都给了我相同的结果(0,0,0),谁能告诉我我做错了什么?

【问题讨论】:

  • 您正在使用已弃用的固定功能管道
  • 我只是opengl的初学者,请您解释一下
  • 这听起来很像是您正在尝试做的事情,而 def 是错误的想法。您可能应该重新考虑您实际尝试归档的内容以及是否有更好的选择。要在 GL 矩阵堆栈中保持理智,您需要自己设置。
  • 我找到了更好的方法,我把答案贴出来了,谢谢!
  • 其实OpenGL中根本没有摄像头。如果您的逻辑中有一个相机对象,则从那里获取它的位置。不要将 OpenGL 视为场景图,因为 OpenGL 不是场景图。

标签: c++ opengl


【解决方案1】:

我找到了答案:

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]);

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

【讨论】:

  • 实际上,这给您的是当前位于堆栈顶部的模型视图矩阵的转换部分。通过查看模型视图矩阵的第 4 列(并翻转符号),您可以获得完全相同的结果(假设您不会对投影矩阵做疯狂的事情)。
  • Michael IV,你能指出应该使用 API 的指针吗?否则,阅读本文的人只会知道不该做什么——这会让人不高兴并引发咖啡消费量增加:(
  • 为什么它不只有 3 个元素?视口的第四个是什么?你能解释一下吗?
  • 我的编译器说 matModelView undeclared 和 matProjection undeclared,我应该如何得到它们?
  • 嗨@user7185318 代码假定您之前已声明过它们。例如,您可以使用双 matModelView[16]。
猜你喜欢
  • 2011-06-06
  • 2016-12-08
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2012-11-13
相关资源
最近更新 更多