УФ-картирование для купола? - PullRequest
1 голос
/ 25 июля 2010

Я пытаюсь понять, как я могу изменить UV-отображение купола, мне нужна проекция карты текстуры, отличная от этой, кодированной ниже:

    protected final void createDome(final float radius) {
    int lats=16; 
    int longs=16;

    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, textures2x4[0].getTextureID());

    int i, j;
    int halfLats = lats / 2; 
    for(i = 0; i <= halfLats; i++)
    {
        double lat0     = MathUtils.PI * (-0.5 + (double) (i - 1) / lats);
        double z0       = Math.sin(lat0)* radius;
        double zr0      = Math.cos(lat0)* radius;

        double lat1     = MathUtils.PI * (-0.5 + (double) i / lats);
        double z1       = Math.sin(lat1)* radius;
        double zr1      = Math.cos(lat1)* radius;

        GL11.glBegin(GL11.GL_QUAD_STRIP);
        for(j = 0; j <= longs; j++)
       {
            double lng = 2 * MathUtils.PI * (double) (j - 1) / longs;
            double x    = Math.cos(lng);
            double y    = Math.sin(lng);

            double s1, s2, t;
            s1      = ((double) i) / halfLats;
            s2      = ((double) i + 1) / halfLats;
            t       = ((double) j) / longs;

            // HERE: I don't know how to calculate the UV mapping
            GL11.glTexCoord2d(s1, t);
            GL11.glNormal3d(x * zr0, y * zr0, z0);
            GL11.glVertex3d(x * zr0, y * zr0, z0);

            GL11.glTexCoord2d(s2, t);
            GL11.glNormal3d(x * zr1, y * zr1, z1);
            GL11.glVertex3d(x * zr1, y * zr1, z1);
       }
        GL11.glEnd();
    }

}

Я связал выходное изображение и исходную карту. Практически мне нужно UV-картирование, которое помещает Артик в зенит / вершину купола, а Антарктика растягивается на нижней стороне купола ... Карта Арктик / Антарктика используется только для того, чтобы понять, что я имею в виду, мои потребности это не вписывается в глобус Эмисфера

Выходное изображение http://img831.imageshack.us/img831/3481/lwjgl.png

Исходная карта http://img203.imageshack.us/img203/4930/earthc.png

1 Ответ

1 голос
/ 27 июля 2010

Посмотрите на вызовы этой функции (заявление об отказе: не проверено - я не использовал LWJGL, но концепция должна быть идентичной):

GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glRotate(90, 0, 0, 1);    // (1) Here you transform texture space
GL11.glMatrixMode(GL11.GL_MODELVIEW);
// and so on

По сути, вам нужно вращать текстуру на объекте.И вот как вы это делаете - трансформируете матрицу проекции текстуры.Линия (1) поворачивает текстуру на 90 градусов вдоль оси Z (перпендикулярно плоскости текстуры).Это ось Z, потому что последний аргумент равен 1. Последние три аргумента обозначают X, Y и Z соответственно (я оставлю все объяснение позже, если вам интересно).

Лучшее, что вы можете сделать, этоЧтобы понять все основные вещи (проекция, текстурное пространство, нормальные векторы, триангуляция, непрерывность, системы частиц и многое другое), нужно скачать пробную версию трехмерного пакета и поиграть с ним.Я многому научился, просто играя в 3D Studio Max (доступна пробная версия и многое другое бесплатно).Если у вас есть немного свободного времени и желание изучать что-то новое, я настоятельно рекомендую изучить это.В конце концов, если вы действительно заинтересованы в 3D-графике, вы в конечном итоге будете использовать ее в любом случае - будь то 3D-пакет или редактор уровней игрового движка.

РЕДАКТИРОВАТЬ: после прочтения я узнал собственный код... По сути, вы могли поменять местами только некоторые координаты, чтобы они симметрично отражались по диагонали.Вы можете оказаться вверх ногами, но это также можно исправить с помощью дополнительной настройки (или трансформации оси обзора).Вот мое непроверенное предположение:

// tweaked to get pole right
s1 = ((double) j) / longs;
s2 = ((double) j + 1) / longs;
t  = ((double) i) / halfLats;

Попробуйте поменять s1 на s2, если это не так.

...