我已經使用了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答案肯定更一般! –