簡體   English   中英

OpenGL半球紋理映射

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

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