我已经使用了OpenGL的命令C++的OpenGL gluLookAt
gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)
我基本上要使我的相机是又回到了原点,面向-z
撤消此操作。 我已阅读(在各种网站上)几个基本的glRotatef命令以及glTranslate(-eyeY, -eyeY, -eyeZ)
可以达到所需的结果。
但我无法弄清glRotate命令究竟是什么。
我已经使用了OpenGL的命令C++的OpenGL gluLookAt
gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)
我基本上要使我的相机是又回到了原点,面向-z
撤消此操作。 我已阅读(在各种网站上)几个基本的glRotatef命令以及glTranslate(-eyeY, -eyeY, -eyeZ)
可以达到所需的结果。
但我无法弄清glRotate命令究竟是什么。
为什么不重新加载模型视图矩阵的身份?即:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
您可以用
glPushMatrix();
之前保存的矩阵,并将其与
glPopMatrix();
恢复,但要注意对性能的影响。我想这可能是你想将电话拨回gluLookAt
的原因。也许你可以澄清?
因为我拥有光线的世界坐标,所以我想简单地将电话拨回(在相机空间中完成)。所以,我暂时需要将它反转为函数调用。 –
OR而不是使用非常不推荐使用OpenGL的东西,自己写矩阵类和只需保存它的一个副本,然后恢复它你叫你自己的矩阵::注视方法:)
试过了......没有工作....重点是我想让我的灯光静止不动,同时移动我的相机 –
你是什么意思,它不起作用...?这是今天OpenGL的标准...... –
为什么不后使用gluLookAt(0,0,0,0,0,-1,0,1,0)?
这使摄像机处于0(眼睛位置为0,0,0),并设置沿着-z轴的(0,0,-1)点的外观,并将向上矢量设置为( 0,1,0),这是沿y轴。
gluLookAt不是添加剂(不知道这是否是正确的词)。每次调用gluLookAt都会设置整个视图矩阵。
如果您想查看某个位置,然后在使用gluLookAt移动后返回到相同位置,则可以保存眼睛,观察点和向量并稍后使用它们。
尝试过......没有工作....重点是我想保持我的光稳定,同时移动我的相机 –
那么为什么光不是静止的?您只告诉我们您正在使用gluLookAt移动相机,这是它应该做的事情...请显示一些相关的代码。 – NickLH
如果我们的代码是象下面这样:
glMatrixMode(GL_MODELVIEW)
glLoadIdentity();
gluLookAt(......);
然后模型视图矩阵由gluLookAt呼叫实现。所以首先调用
float modelViewMat[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelViewMat);
现在找到modelViewMat的反转矩阵。
float invertMat[16];
__gluInvertMatrixd(modelViewMat, invertMat);
这里是得到反转矩阵的代码。
int __gluInvertMatrixd(const float src[16], float inverse[16])
{
int i, j, k, swap;
float t;
GLfloat temp[4][4];
for (i=0; i<4; i++)
for (j=0; j<4; j++)
temp[i][j] = src[i*4+j];
for(int i=0;i<16;i++)
inverse[i] = 0;
inverse[0] = inverse[5] = inverse[10] = inverse[15] = 1.0f;
for(i=0; i<4; i++)
{
swap = i;
for (j = i + 1; j < 4; j++)
if (fabs(temp[j][i]) > fabs(temp[i][i]))
swap = j;
if (swap != i) {
//Swap rows.
for (k = 0; k < 4; k++) {
t = temp[i][k];
temp[i][k] = temp[swap][k];
temp[swap][k] = t;
t = inverse[i*4+k];
inverse[i*4+k] = inverse[swap*4+k];
inverse[swap*4+k] = t;
}
}
if (temp[i][i] == 0)
return 0;
t = temp[i][i];
for (k = 0; k < 4; k++) {
temp[i][k] /= t;
inverse[i*4+k] /= t;
}
for (j = 0; j < 4; j++) {
if (j != i) {
t = temp[j][i];
for (k = 0; k < 4; k++) {
temp[j][k] -= temp[i][k]*t;
inverse[j*4+k] -= inverse[i*4+k]*t;
}
}
}
}
return 1;
}
现在乘invertMat任何对象矩阵其中u不想添加模型视图矩阵效果。
像:
glPushMatrix();
glMultMatrixf(invertMat);
glRotatef(...);
glTranslatef(...);
...
...
glDrawArrays(....);
glPopMatrix();
请学习如何格式化代码(提示:输入框顶部有一个问号:-) – kleopatra
因为它出现在你的问题是灯光,我有可能会帮助你的这里交易的老把戏。我在这里做了很多假设,但是有可能你想这样做的原因是因为当你的gluLookAt改变时你不想让你的灯光四处移动?我在这方面遇到了一些麻烦,而且我发现这适用于此目的:
glMatrixMode (GL_MODELVIEW);
gluLookAt (ya know, stuff);
glLightfv (GL_LIGHTn, GL_POSITION, positionOfLight));
//^Putting your light positioning here will keep it in the right spot, relative only to the origin!
// Draw your stuff
Hope帮了一下。玩的开心。
这只适用于模型视图矩阵是之前的单位矩阵,但使用'gluLookAt'时可能经常出现这种情况。 – Andre
@Andre:同意 - 从问题的背景来看,它听起来像是他从初始MV状态完成了一个'gluLookAt()'。我可能应该在我的回答中澄清。你的Push/Pop答案肯定更一般! –