[英]OpenGL Hemisphere Texture Mapping
我需要在opengl中使用半球。 我發現了一個drawSphere函數,我修改了它來繪制一半的拉特(最終繪制了球體的一半),這就是我想要的。 它正確地做到了這一點
但是,我不知道我應該用glTexCoordf做什么來讓紋理正確映射到這半球上。 對於opengl,我真的不太好,而且我嘗試了無數的變化,但我無法讓紋理正確地顯示在它上面。
void drawHemisphere(double r, int lats, int longs)
{
int i, j;
int halfLats = lats / 2;
for(i = 0; i <= halfLats; i++)
{
double lat0 = M_PI * (-0.5 + (double) (i - 1) / lats);
double z0 = sin(lat0);
double zr0 = cos(lat0);
double lat1 = M_PI * (-0.5 + (double) i / lats);
double z1 = sin(lat1);
double zr1 = cos(lat1);
glBegin(GL_QUAD_STRIP);
for(j = 0; j <= longs; j++)
{
double lng = 2 * M_PI * (double) (j - 1) / longs;
double x = cos(lng);
double y = sin(lng);
// glTexCoordf()
glNormal3f(x * zr0, y * zr0, z0);
glVertex3f(x * zr0, y * zr0, z0);
// glTexCoordf()
glNormal3f(x * zr1, y * zr1, z1);
glVertex3f(x * zr1, y * zr1, z1);
}
glEnd();
}
}
有沒有人知道我應該投入什么價值? 或者我需要為它計算什么?
謝謝!
基本上,你不應該需要任何花哨的東西。 紋理坐標空間的范圍從0到1。 因此,為兩者之間的頂點選擇一些中間值。 如果沒有圖像,我無法更徹底地解釋它,所以我能做的最好的就是指向本文: UV貼圖 ,這是一個很好的起點。 希望這有助於作為首發。
這是我的猜測:
{
double lng = 2 * M_PI * (double) (j - 1) / longs;
double x = cos(lng);
double y = sin(lng);
double s1, s2, t;
s1 = ((double) i) / halfLats;
s2 = ((double) i + 1) / halfLats;
t = ((double) j) / longs;
glTexCoord2d(s1, t);
glNormal3d(x * zr0, y * zr0, z0);
glVertex3d(x * zr0, y * zr0, z0);
glTexCoord2d(s2, t);
glNormal3d(x * zr1, y * zr1, z1);
glVertex3d(x * zr1, y * zr1, z1);
}
請記住在OpenGL中正確設置紋理。 一個帶紋理的示例調用:
glActiveTexture(GL_TEXTURE0);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
// texture must be bound & enabled
texture.bind();
texture.enable();
drawHemisphere(1, 40, 40);
texture.disable();
我使用Java + JOGL來測試它,所以它不是一對一的C ++解決方案,但從概念上講它應該是相同的。 至少你有適當的glTexCoord2d()
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.