OpenGL полушарие текстуры текстуры - PullRequest
5 голосов
/ 18 июля 2010

Мне нужно иметь полусферу в 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();
    }
}

Кто-нибудь знает, какие значения мне стоитвставлять?Или что мне нужно для этого рассчитать?

Спасибо!

1 Ответ

0 голосов
/ 19 июля 2010

По сути, вам не нужно ничего особенного.Пространство координат текстуры колеблется от нуля до единицы.Поэтому выберите промежуточные значения для промежуточных вершин.Я не могу объяснить это более подробно без изображения, поэтому лучшее, что я могу сделать, это указать вам на эту статью: UV mapping , это хорошая отправная точка.Надеюсь, это поможет вам в начале.

Вот мое предположение:

{
    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() звонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...