[英]gluCylinder with rotated texture
我想使用gluQuadric和gluCylinder繪制一個圓柱體。 該圓柱體應有紋理。
我的繪畫代碼如下:
pTexture->Enable();
pTexture->Bind();
glPushMatrix();
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
gluQuadricOrientation(quadric, GLU_OUTSIDE);
gluQuadricNormals(quadric, true);
gluQuadricTexture(quadric, true);
gluCylinder(quadric, getRadius(), getRadius(), getHeight(), 16, 1);
glPopMatrix();
pTexture->Unbind();
pTexture->Disable();
我現在的問題是,紋理旋轉了90度。 如何旋轉二次曲面的uv映射?
紋理在其他地方使用,因此無法進行編輯。
除了使用更廣泛的GL_MODELVIEW
和GL_PROJECTION
矩陣堆棧外,還有GL_TEXTURE
矩陣堆棧可用於將變換應用於紋理坐標。 例如,這會將紋理坐標旋轉90度:
glMatrixMode(GL_TEXTURE);
glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
由於紋理坐標通常為[0.0,1.0] x [0.0,1.0]單位正方形,因此僅使用它可能會產生不良的副作用。 旋轉是圍繞原點逆時針旋轉的,因此我們的單位正方形將被旋轉為一個正方形,其范圍為[-1.0,0.0] x [0.0,1.0]。 因此,除了旋轉外,平方也偏移了(0.0,-1.0)。 如果自動換行模式為GL_REPEAT
,這是無害的,但是當使用像GL_CLAMP_TO_EDGE
這樣的GL_CLAMP_TO_EDGE
換行模式時,這會很糟糕。 我們可以通過在旋轉后沿相反方向應用平移來對此進行更正(請記住,最后指定的變換是最先應用的變換):
glMatrixMode(GL_TEXTURE);
glTranslatef(1.0f, 0.0f, 0.0f);
glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
另外,根據圖像的朝向,您可能必須旋轉-90度。 在這種情況下,范圍為[0.0,1.0] x [0.0,1.0]的單位正方形將旋轉為范圍為[0.0,1.0] x [-1.0,0.0]的正方形。 在這種情況下應用相同類型的糾正翻譯,我們最終得到:
glMatrixMode(GL_TEXTURE);
glTranslatef(0.0f, 1.0f, 0.0f);
glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.