Модель трехмерной сцены и библиотека OpenGL
glTexCoord2d(0,qRoll/M);
glNormal3f(0,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));
glVertex3f(-1,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));
glTexCoord2d(0,(qRoll+1.0)/M);
glNormal3f(0,sin((2*M_PI*(qRoll+1))/M),cos((2*M_PI*(qRoll+1))/M));
glVertex3f(-1,sin((2*M_PI*(qRoll+1))/M),cos((2*M_PI*(qRoll+1))/M));
glTexCoord2d(1,(qRoll+1.0)/M);
glNormal3f(0,sin((2*M_PI*(qR
oll+1))/M),cos((2*M_PI*(qRoll+1))/M));
glVertex3f(1,sin((2*M_PI*(qRoll+1))/M),cos((2*M_PI*(qRoll+1))/M));
glTexCoord2d(1,qRoll/M);
glNormal3f(0,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));
glVertex3f(1,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));
glEnd();
qRoll++;
}
§ Крышка на цилиндр
|
|
где M – разбиение круга |
Фрагмент кода программы цилиндра, объединяющего лопасти вентилятора в винт
int M=30;
int qFan=0;
glBegin(GL_POLYGON);
while (qFan<M)
{
glNormal3f(1,0,0);
if(qFan<M/4)
{
glTexCoord2d(0,1-qFan*4/M);
}
if((qFan>=M/4)&&(qFan<M/2))
{
glTexCoord2d((qFan-M/4)*4/M,0);
}
if((qFan>=M/2)&&(qFan<3*M/4))
{
glTexCoord2d(1,(qFan-M/2)*4/M);
}
if(qFan>=3*M/4)
{
glTexCoord2d(1-(qFan-3*M/4)*4/M,1);
}
glVertex3f(1,sin((2*M_PI*qFan)/M),cos((2*M_PI*qFan)/M));
qFan++;
}
glEnd();
2. Стойка
Стойка вентилятора составлена из трех основных частей
§ Верхняя часть корпуса (полусфера)
|
|
где rFan – наибольший радиус в фигуре, iM, M – разбиения полусферы |
Фрагмент кода программы верхней части корпуса (полусферы)
M=30;
int iM=30;
double phi, psi;
q=0;
int i=0;
while (q<M)
{
while (i<iM)
{
glBindTexture(GL_TEXTURE_2D, texture2);
glBegin(GL_QUADS);
phi=(-(M_PI*(i))/iM); psi=((M_PI*(q))/M);
glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));
glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);
glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi), rFan*cos(phi)*cos(psi));
phi=(-(M_PI*(i+1))/iM); psi=((M_PI*(q))/M);
glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));
glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);
glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi), rFan*cos(phi)*cos(psi));
phi=(-(M_PI*(i+1))/iM); psi=((M_PI*(q+1))/M);
glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));
glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);
glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi), rFan*cos(phi)*cos(psi));
phi=(-(M_PI*(i))/iM); psi=((M_PI*(q+1))/M);
glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));
glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);
glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi), rFan*cos(phi)*cos(psi));
glEnd();
i++;
}
i=0;
q++;
}
§ Цилиндрический элемент стойки
|
Этот элемент стойки вентилятора состоит из цилиндров и кругов (крышки для цилиндров). Все они вызываются с помощью функции OpenGL – glCallList. Большая часть кода элементов вентилятора считывается программой лишь однажды, в СallLists, а вызов уже происходит неоднократно, по мере необходимости, в функции RenderGLScene(). Этот способ наиболее эффективен как для скорости работы программы, так и для редактирования готового кода программы, благодаря чему одинаковые примитивы (цилиндр, круг, квадрат, линии и т.д.) было легко использовать вызовом CallList и, применяя элементарные преобразования – поворот, перемещение, масштабирование объектов, видоизменять необходимым образом для получения данных элементов тела. Элементы цилиндр и круг были описаны выше, поэтому не будем повторяться. |
§ Ножка стойки
|
Этот элемент тела строится через функцию CallList, в которой задан квадрат, вызываемый 4 раза и масштабированный по разным координатам по разному. |
Фрагмент кода программы ножек стойки вентилятора
//--- Квадрат
square=basis_leg+1;
glNewList(square,GL_COMPILE);
glBindTexture(GL_TEXTURE_2D,texture1);
glBegin(GL_QUADS);
glNormal3f(1,0,0);
glTexCoord2d(0,0);
glVertex3f(1,-1,-1);
glTexCoord2d(1,0);
glVertex3f(1,1,-1);
glTexCoord2d(1,1);
glVertex3f(1,1,1);
glTexCoord2d(0,1);
glVertex3f(1,-1,1);
glEnd();
glEndList();
//--- Ножка вентилятора
leg=square+1;
glNewList(leg,GL_COMPILE);
glCallList(square);
glRotatef(90,0,0,1);
glCallList(square);
glRotatef(90,0,0,1);
glCallList(square);
glRotatef(90,0,0,1);
glCallList(square);
glEndList();
3. Пульт управления
Пульт управления вентилятором составлен из четырех основных частей
§ Основание пульта
|
Элемент строится из цилиндра с разбиением уменьшенным до 4х. |
Фрагмент кода программы основания пульта
M=4;
float qLeg=0;
glBindTexture(GL_TEXTURE_2D,texture5);
while (qLeg<M)
{
glBegin(GL_QUADS);
glNormal3f(0,sin(M_PI/4+qLeg*M_PI/2),cos(M_PI/4+qLeg*M_PI/2));
glTexCoord2d(0,qLeg/M);
glVertex3f(-1,sin((2*M_PI*qLeg)/M),cos((2*M_PI*qLeg)/M));
Другие рефераты на тему «Программирование, компьютеры и кибернетика»:
Поиск рефератов
Последние рефераты раздела
- Основные этапы объектно-ориентированного проектирования
- Основные структуры языка Java
- Основные принципы разработки графического пользовательского интерфейса
- Основы дискретной математики
- Программное обеспечение системы принятия решений адаптивного робота
- Программное обеспечение
- Проблемы сохранности информации в процессе предпринимательской деятельности