opengl相机实现哪个是对的?

时间:2014-10-08 03:33:17

标签: c++ opengl math matrix

我昨天更新了我的问题,希望有人澄清这个问题!

当应用俯仰偏航(假设我们选择此顺序)角度来实现空中摄像机时,我认为我们可以像这样计算视图矩阵:

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

它会起作用,而不会对用户互动产生太大影响,但从数学的角度来看,它不是那么正确。

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

2 个答案:

答案 0 :(得分:0)

我认为这是一个惯例问题。例如,当你的鼻子向上时,俯仰角是正的吗?两种方法都可以正常工作,您可能只需要根据您选择的惯例来否定角度。在现实世界中,我有关于什么" dip"和方位角"方位角"与地质学家一直意味着在地质学界似乎没有固定的惯例。

似乎您的Lloyd Goodall参考不会否定glTranslatef()调用中的摄像头位置。又一个惯例?

回答他们为什么选择代码风格的问题......我认为这有点武断,所以作者只会这样做。

答案 1 :(得分:0)

在OpenGL中,Camera矩阵是ModelView矩阵的一部分

  • 模型矩阵表示实际渲染的对象坐标系
  • 视图(相机)矩阵表示观察者坐标系

要形成正确的ModelView矩阵,您需要:

ModelView = Model * Inverse(View)
  • 当您将此矩阵乘以矢量时,它会将其从对象空间转换为相机空间
  • 生成View部分的方式与您的约定相关(如Daniel Paull指出的那样)
  • 但是结果矩阵是您正在寻找的坐标系的倒数。
  • 有关详情,请点击此处:transform matrix anatomy