簡體   English   中英

帶旋轉紋理的gluCylinder

[英]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_MODELVIEWGL_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM