
QVector<GLfloat> vecTextures; // вектор текстурных координат
QVector<GLfloat> vecVertices; // вектор вершин
const GLfloat step=pi/np; // шаг изменения углов
const GLuint np=36; // число частей, на которое делится полуокружность
const GLfloat pi=3.141593, k=pi/180;
// глобальные переменные
Вот возможный вариант, как процедурно определить массивы вершин, текстурных координат и индексов вершин для рассматриваемой задачи:
Ответ в обоих случаях: создать дополнительные вершины в местах сшивания поверхности фигуры. Таким образом, некоторые вершины будут совпадать по пространственным координатам, но отличаться текстурными координатами. Теперь вершин, соответствующих полюсам, станет значительно больше, но у каждой из них будет своя текстурная координата свой пиксель в самой верхней или самой нижней полоске пикселей. Количество вершин на границе сшивания сферы увеличится в два раза; текстурные координаты одной части вершин будут лежать на правой границе текстуры, другой части на левой. Т.е. как бы вершины продублируются и обеспечат стыковку текстуры на правой и левой границах. Посмотрите на иллюстрирующий рисунок:
2) Как замкнуть текстуру между её правой и левой границами? Ведь одна вершина может иметь только одну текстурную координату.
1) Какие текстурные координаты дать полюсам: северному и южному? Ведь, вообще говоря, вся полоска верхних пикселей текстуры относится к одной вершине: северному полюсу. Та же самая ситуация и с южным полюсом.
Но сразу же возникают два важных вопроса:
x=phi/(2*pi); // x=s, pi=3.141593
Немного поразмыслив, мы определяем, что текстурные координаты равны:
Текстура размером 512x256 позаимствована из CD, распространяющегося вместе с книгой: Евченко А.И. «OpenGL и DirectX. Программирование графики. Для профессионалов», и преобразована в формат .png. Прежде всего, нужно разобраться с геометрией фигуры и проекцией текстуры. В данном случае свяжем текстурную координату x с координатой вершины «фи» (угол фи), а текстурную координату y с координатой вершины «тэта» (угол тэта). Углы тэта и фи есть просто вторая и третья координаты в сферической системе координат; а первая координата для всех вершин одинакова и равна радиусу сферы (шара) R. Посмотрите на рисунки, на которых показано, как связать между собой текстурные координаты и координаты вершин в пространстве.
Вот отличный пример: наложение текстуры на шар. Поверхность шара это классический пример искривлённой поверхности. Нарисованная текстура тоже должна учитывать искривление так, чтобы можно было без особых затруднений вычислить текстурные координаты. К тому же поверхность шара замкнутая, поэтому нужно уточнить, как замыкать текстуру на такой поверхности. Сейчас разберём, как наложить текстуру поверхности Земли на шар.
Пример: наложение текстуры на шар
OpenGL на Qt 4. Это просто! (часть 2) (4 стр.)
/ / / OpenGL на Qt 4. Это просто! (часть 2) (4 стр.)
Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
OpenGL на Qt 4. Это просто! (часть 2) (4 стр.) / Статьи / Программирование игр / GameDev.ru Разработка игр
Комментариев нет:
Отправить комментарий