2014-10-08 82 views
0

我昨天更新了我的问题,希望有人澄清这个问题!opengl相机的执行是正确的?

当应用俯仰偏航辊(假设我们选择这个顺序)角度来实现空气的相机,我想我们可以计算这样的观点矩阵:

view matrix

而且还有点支持这种观点如Using a camera and simple user inputOpenGL Transformation,他们的代码风格是这样的:

// First, transform the camera (viewing matrix) from world space to eye space 
// Notice all values are negated, because we move the whole scene with the 
// inverse of camera transform 
glRotatef(-roll, 0, 0, 1); // roll 
glRotatef(-yaw, 0, 1, 0); //yaw 
glRotatef(-pitch, 1, 0, 0); // pitch 
glTranslatef(-cameraPosition[0], -cameraPosition[1], -cameraPosition[2]); 

我相信这是正确的。

Red book pilotView(7th edition)A C++ Camera Class for Simple OpenGL FPS ControlsFirst Person Camera Control with LWJGLModern OpenGL 04 - Cameras, Vectors & Input 这样的代码风格:

glRotatef(roll, 0, 0, 1); // roll 
glRotatef(yaw, 0, 1, 0); //yaw 
glRotatef(pitch, 1, 0, 0); // pitch 
glTranslatef(-cameraPosition[0], -cameraPosition[1], -cameraPosition[2]); 

它将工作,并没有影响多少用户交互,但是从数学的角度来看,它是不是正确的。

为什么书和其他人选择第二种代码风格?请帮助澄清这个问题!

回答

0

我会建议这是一个约定的问题。举例来说,当你俯身时,俯仰角度是正面的,或者当你俯身时,仰角是正面的?两种方法都可以正常工作,您可能需要根据您选择的惯例否定角度。在现实世界中,我始终与地质学家讨论“倾角”和“方位角”意味着什么,而地质学界似乎没有固定的惯例。

看来你的劳埃德古道尔参考不会否定glTranslatef()调用中的相机位置。又一个约定?

要回答他们为什么选择这种代码风格的问题......我认为它有点武断,所以作者只是单方面做。

+0

感谢您抽出时间来调查我的参考页,减轻我的初学者的谜.Lloyd古道尔码的glTranslatef异常别人,但他也做不同的东西在walkForward/walkBackwards方法来计算相机位置以使其工作。我更喜欢选择第一种编码风格。 – wangdq 2014-10-08 06:30:24

0

在OpenGL中摄像机矩阵是

  • 模型矩阵表示实际呈现物体坐标系模型视图矩阵的一部分
  • 视图(摄像机)矩阵表示观察者坐标系

为了形成正确ModelView矩阵您需要:

ModelView = Model * Inverse(View) 
  • 当您通过向量乘以这个矩阵从对象空间将其转换到摄像机空间
  • 您生成视图部分是你约定的事项(如丹尼尔包贵革指出)
  • 但是得到的矩阵是路您正在查看的坐标系的倒数。
  • 欲了解更多信息请看这里:transform matrix anatomy