УФ-картирование для купола?
Я пытаюсь понять, как я могу изменить 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-картирование, которое помещает Артик в зенит / вершину купола, а Антарктика растягивается на нижней стороне купола... Карта Артик / Антарктика используется только для того, чтобы понять, что я имею в виду, мои потребности это не вписывается в глобус
1 ответ
Посмотрите на вызовы этой функции (заявление об отказе: не проверено - я не использовал 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;
Попробуйте поменять s 1 на s2, если это не правильно.