Вопрос к теме OpenGL
1 Поверхности безье
строяться максимум 8*8 точек
непонятно как рисуются
2 вывод массивов
:) умею выводить точки
:) умею красить их в разные цвета
:( не умею строить нормали к получившемуся множеству плоскотей
:( не умею натягивать на них текстуры
Цитата:
Originally posted by Dr.Wisdom
Вопросов два:
1 Поверхности безье
строяться максимум 8*8 точек
непонятно как рисуются
2 вывод массивов
:) умею выводить точки
:) умею красить их в разные цвета
:( не умею строить нормали к получившемуся множеству плоскотей
:( не умею натягивать на них текстуры
Вопросов два:
1 Поверхности безье
строяться максимум 8*8 точек
непонятно как рисуются
2 вывод массивов
:) умею выводить точки
:) умею красить их в разные цвета
:( не умею строить нормали к получившемуся множеству плоскотей
:( не умею натягивать на них текстуры
Советую посмотреть книгу "OpenGL. Программирование компьютерной графики" Френсис Хилл.
Помоему ты не с той стороны начал OpenGL изучать.
Забей на точки.
В OpenGL (да и не только в нем) рулят трёхточеччные полигоны GL_TRIANGLES - восновном
используються именно они.
Также ещё существуют GL_QUADS, GL_POLLYGONS -
(возможно я с ошибкой написал последний т. к.
никогда его не использую).
т. е. текстру накладывается естественно не на
пустоту а на плоскость, плоскость как известно
как минимум из трёх точек состоит, самые производительные полигоны трёхточечные и из них
можно нарисовать абсолютно всё.
т. е. полигон создаёшь так:
glBegin(GL_TRIANGLES)
//возможно правильно GL_TRIANGLE я по
//памяти пишу.
glVertex3f(x1, y1, z1);
glVertex3f(x2, y2, z2);
glVertex3f(x3, y3, z3);
glEnd();
Вот на это уже можно наложить текстуру:
Есть два способа есть функции автоматически
вычисляющие нормали и накладывающие текстуры.
Но они сниают производительность и их использую
восновном при квадротировании.
Лучше всё делать в рукопашную:
нормаль это вектор перпендикулярный плоскости,
его кординаты можно задать вот так:
(если я правильно помню)
glNormal3f(x,y,z);
например для плоскости параллельной XOZ
нормаль glNormal3f(0.0f, 1.0f, 0.0f);
Для удобства можешь сам написать функцию вычисления нормали. Я писал функцию её вычисления по 3 точкам плоскости, возможно её можно написать как то лучше, это зависит от знаний аналитической геометрии.
Теперь что касается наложения текстур:
Для начала советую потренироваться на тестурах из .bmp их проще загружать. Наверняка ты загружать и конвертировать их в текстуры умеешь,
если нет, то почитай где нибудь как это делается,
код загрузки и подготовки текстуры (определения типа фильтрации) достаточно большой чтоб мне влом было его печатать.
Чтобы работать с тестурами в функции, в которой
ты выполняешь инит для OpenGL'a добавь
glEnable(GL_TEXTURE_2D);
допустим ты загрузил скажем 5 текстур и идентификаторы их хранишь в массиве типа
GLuint texture[5];
Что выбрать например текстуру первую текстру,
надо взять элемен с номером 0.
glBindTexture(GL_TEXTURE_2D, texture[0]);
Теперь самая главная фишка: чтоб наложить тестуру
на полигон, тебе надо каждую точку полигона связать с конкретной точкой текстуры.
Текстра плоская, поетому её точка определяется
двумя значениями, если использовать тип GLfloat,
то от 0.0f до 1.0f слева направо и 0.0f до 1.0f
снизу вверх.
Например средняя точка: 0.5f, 0.5f.
Вот пример как двумя полигонами построить
Натекстуренный квадратик:
(возможно я гдето ошибусь в названии функций, потому как пишу по памяти - я сейчас не дома сижу).
glBegin(GL_TRIANGLES);
//Это первый полигон
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f);
glVetex3f(-1.0f, 0.0f, -1.0f);
//Это второй:
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, 0.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f);
glEnd();
Заметь Z везде -1.0f - та координата, которая
не изменяется и определяет нормаль:
glNormal(0.0f, 0.0f, -1.0f);
Её надо задавать до прорисовки плоскости.
Если полоскость является задней строной фигуры -
то координаты надо умножить на -1.