【发布时间】:2011-06-06 20:27:05
【问题描述】:
我用 OpenGL 绘制了一个球体,它将被 glRotate()、glScale()、glTranslate() 转换。 如果不自己计算所有变换,如何获得对象的绝对位置?
我需要将相机眼睛位置设置到这一点的坐标。
【问题讨论】:
标签: c++ opengl 3d transform render
我用 OpenGL 绘制了一个球体,它将被 glRotate()、glScale()、glTranslate() 转换。 如果不自己计算所有变换,如何获得对象的绝对位置?
我需要将相机眼睛位置设置到这一点的坐标。
【问题讨论】:
标签: c++ opengl 3d transform render
使用这些转换时,您正在操纵modelviewmatrix
获取当前可用的 (http://linux.die.net/man/3/glgetfloatv)
void glGetFloatv(
GLenum pname,
GLfloat * params
);
例如:
float modelview[16];
// save the current modelview matrix
glPushMatrix();
// get the current modelview matrix
glGetFloatv(GL_MODELVIEW_MATRIX , modelview);
应该得到当前矩阵,将起始向量/顶点/坐标与该矩阵相乘将得到绝对世界坐标。
编辑:在制作应用程序时,您通常希望控制每个对象的绝对坐标,操作它们,并使用 opengl 转换将它们绘制到定义的位置。
【讨论】:
对象通常在一个坐标系中建模,然后缩放、平移和旋转到您正在构建的世界中。世界坐标是由存储在 ModelView 矩阵中的建模变换变换对象坐标产生的。然而,OpenGL 没有世界坐标的概念。世界坐标纯粹是一个应用程序构造。
对象坐标由 ModelView 矩阵转换以生成眼睛坐标。
来自 opengl.org: 9.120 如何找到仅由 ModelView 矩阵变换的顶点坐标?
获取顶点的眼睛坐标空间值通常很有用(即模型视图矩阵转换的对象空间顶点)。您可以通过检索当前的 ModelView 矩阵并执行简单的向量/矩阵乘法来获得它。
要获得矩阵,请使用类似的东西
float fvViewMatrix[ 16 ];
glGetFloatv( GL_MODELVIEW_MATRIX, fvViewMatrix );
您可以在此处阅读有关 opengl 转换的更多信息:http://www.opengl.org/resources/faq/technical/transformations.htm
【讨论】: