Отверстие в полигоне
Вот цилиндр:
for (i=1;i<2*n;i++)
{
glBegin(GL_POLYGON); // цилиндр - 1
glNormal3f(0,-0.15-0.05*sin((i+0.5)*PI/n),-0.05+0.05*cos((i+0.5)*PI/n));
glVertex3f(0.7-0.05*sin(i*PI/n),0.225+0.05*cos(i*PI/n),0.2);
glVertex3f(0.7-0.05*sin((i+1)*PI/n),0.225+0.05*cos((i+1)*PI/n),0.2);
glVertex3f(0.7-0.05*sin((i+1)*PI/n),0.225+0.05*cos((i+1)*PI/n),0.3);
glVertex3f(0.7-0.05*sin(i*PI/n),0.225+0.05*cos(i*PI/n),0.3);
glEnd();
}
glBegin(GL_POLYGON); //полигон, в котором нужно сделать дыру к цилиндру, то есть чтобы было как отверстие
glNormal3f(0.1,0,0.3);
glVertex3f(0.1,0,0.3);
glVertex3f(0.9,0,0.3);
glVertex3f(0.9,0.3,0.3);
glVertex3f(0.75,0.45,0.3);
glVertex3f(0,0.45,0.3);
glVertex3f(0,0,0.3);
glEnd();
Господа, как это сделать через интегрирование или трафареты??? Горю... :(
Полигон (или многоугольник) – это область, ограниченная одной замкнутой ломаной, при этом каждый отрезок ломаной описывается вершинами на его концах (вершинами полигона). Обычно полигоны рисуются заполненными, но вы можете также рисовать полигоны в виде их границ или в виде точек на концах отрезков, образующих полигон.
В общем случае полигоны могут быть достаточно сложны, поэтому OpenGL накладывает очень серьезные ограничения в отношении того, что считается полигональным примитивом. Вопервых, ребра полигонов в OpenGL не могут пересекаться (в математике полигон, удовлетво-
ряющий этому условию, называется простым). Во-вторых, полигоны OpenGL должны быть выпуклыми. Полигон является выпуклым, если отрезок, соединяющий две точки полигона (точки могут быть и внутренними, и граничными) целиком лежит внутри полигона (то есть все его точки также принадлежат полигону). OpenGL не накладывает ограничений на количество вершин полигона (и, как следствие, на количество отрезков, определяющих его границу). Заметьте, что по-
лигоны с дырами не могут быть описаны, так как они не являются выпуклыми, и могут быть заданы при помощи одной замкнутой ломаной. Если вы поставите OpenGL перед вопросом о рисовании невыпуклого полигона, результат может быть не таким, какой вы ожидаете. Например,
на большинстве систем в ответ будет заполнена только выпуклая оболочка полигона (на многих системах не произойдет и этого).
Уту цитату привёл потаму что незнаю как памочь, и есть ли решение этой задачи.:confused:
А можно рисунок, а то не очень ясна задача?
Рисунок прилагаю, в общем в полигоне с двух сторон надо сделать дырки, цилиндр без крышек туда уже впихнул...
Цитата: Scaiman
Цитата из RedBook
Полигон (или многоугольник) – это область, ограниченная одной замкнутой ломаной, при этом каждый отрезок ломаной описывается вершинами на его концах (вершинами полигона). Обычно полигоны рисуются заполненными, но вы можете также рисовать полигоны в виде их границ или в виде точек на концах отрезков, образующих полигон.
В общем случае полигоны могут быть достаточно сложны, поэтому OpenGL накладывает очень серьезные ограничения в отношении того, что считается полигональным примитивом. Вопервых, ребра полигонов в OpenGL не могут пересекаться (в математике полигон, удовлетво-
ряющий этому условию, называется простым). Во-вторых, полигоны OpenGL должны быть выпуклыми. Полигон является выпуклым, если отрезок, соединяющий две точки полигона (точки могут быть и внутренними, и граничными) целиком лежит внутри полигона (то есть все его точки также принадлежат полигону). OpenGL не накладывает ограничений на количество вершин полигона (и, как следствие, на количество отрезков, определяющих его границу). Заметьте, что по-
лигоны с дырами не могут быть описаны, так как они не являются выпуклыми, и могут быть заданы при помощи одной замкнутой ломаной. Если вы поставите OpenGL перед вопросом о рисовании невыпуклого полигона, результат может быть не таким, какой вы ожидаете. Например,
на большинстве систем в ответ будет заполнена только выпуклая оболочка полигона (на многих системах не произойдет и этого).
Уту цитату привёл потаму что незнаю как памочь, и есть ли решение этой задачи.:confused:
Полигон (или многоугольник) – это область, ограниченная одной замкнутой ломаной, при этом каждый отрезок ломаной описывается вершинами на его концах (вершинами полигона). Обычно полигоны рисуются заполненными, но вы можете также рисовать полигоны в виде их границ или в виде точек на концах отрезков, образующих полигон.
В общем случае полигоны могут быть достаточно сложны, поэтому OpenGL накладывает очень серьезные ограничения в отношении того, что считается полигональным примитивом. Вопервых, ребра полигонов в OpenGL не могут пересекаться (в математике полигон, удовлетво-
ряющий этому условию, называется простым). Во-вторых, полигоны OpenGL должны быть выпуклыми. Полигон является выпуклым, если отрезок, соединяющий две точки полигона (точки могут быть и внутренними, и граничными) целиком лежит внутри полигона (то есть все его точки также принадлежат полигону). OpenGL не накладывает ограничений на количество вершин полигона (и, как следствие, на количество отрезков, определяющих его границу). Заметьте, что по-
лигоны с дырами не могут быть описаны, так как они не являются выпуклыми, и могут быть заданы при помощи одной замкнутой ломаной. Если вы поставите OpenGL перед вопросом о рисовании невыпуклого полигона, результат может быть не таким, какой вы ожидаете. Например,
на большинстве систем в ответ будет заполнена только выпуклая оболочка полигона (на многих системах не произойдет и этого).
Уту цитату привёл потаму что незнаю как памочь, и есть ли решение этой задачи.:confused:
Можно через трафареты сделать, но у меня затирает из буфеа абсолютно всё вместо того, точ мне надо, есть ещё tess-объекты для этого случая, но это тоже геммор...
Тебе нужна триангуляция многоугольников с дырами - реализация таких алгоритмов тянет на пару тысяч строчек кода.
А короче нельзя никак?
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(ProjectionMatrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(ModelViewMatrix);
/////////////////////////////////////////////////////////////////////////////
// рисуем в буффер глубины тело, в котром нужно сделать отверстие
/////////////////////////////////////////////////////////////////////////////
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
DrawBody();
/////////////////////////////////////////////////////////////////////////////
// рисуем в буффер шаблонов цилиндр с крышками
/////////////////////////////////////////////////////////////////////////////
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glDepthFunc(GL_LESS);
glClearStencil(127);
glEnable(GL_STENCIL_TEST);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFuncSeparateATI(GL_ALWAYS, GL_ALWAYS, 1, 255);
glStencilOp(GL_KEEP, GL_DECR, GL_KEEP);
glCullFace(GL_FRONT);
DrawCylinderWithCaps();
glStencilOp(GL_KEEP, GL_INCR, GL_KEEP);
glCullFace(GL_BACK);
DrawCylinderWithCaps();
/////////////////////////////////////////////////////////////////////////////
// рисуем в буффер цвета тело, в котром нужно сделать отверстие
/////////////////////////////////////////////////////////////////////////////
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthFunc(GL_LEQUAL);
glEnable(GL_CULL_FACE);
glStencilFunc(GL_EQUAL, 127, 255);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glDepthFunc(GL_LEQUAL);
glColor3f(0.5, 0.5, 0.75);
glCullFace(GL_BACK);
DrawBody();
/////////////////////////////////////////////////////////////////////////////
// рисуем в буффер цвета цилиндр без крышек
/////////////////////////////////////////////////////////////////////////////
glDepthMask(GL_TRUE);
glClear(GL_DEPTH_BUFFER_BIT);
glCullFace(GL_FRONT);
glStencilFunc(GL_NOTEQUAL, 127, 255);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
DrawCylinderWithoutCaps();
glDisable(GL_STENCIL_TEST);
glFlush();
SwapBuffers(DeviceContext);
Вот что у меня получилось:
Сам исходничек кинь пожалуйста, надо в практике это дело проглядеть :P
C:\datavrash1\detravrash.cpp(392) : error C2065: 'ProjectionMatrix' : undeclared identifier
C:\datavrash1\detravrash.cpp(395) : error C2065: 'ModelViewMatrix' : undeclared identifier
ModelViewMatrix - что за зверь такой и как его писать?
Цитата: russians
//glLoadMatrixf(ModelViewMatrix);
C:\datavrash1\detravrash.cpp(392) : error C2065: 'ProjectionMatrix' : undeclared identifier
C:\datavrash1\detravrash.cpp(395) : error C2065: 'ModelViewMatrix' : undeclared identifier
ModelViewMatrix - что за зверь такой и как его писать?
C:\datavrash1\detravrash.cpp(392) : error C2065: 'ProjectionMatrix' : undeclared identifier
C:\datavrash1\detravrash.cpp(395) : error C2065: 'ModelViewMatrix' : undeclared identifier
ModelViewMatrix - что за зверь такой и как его писать?
Массив это. И ProjectionMatrix тоже. Заданы они, примерно вот так:
float ModelViewMatrix[16];
float ProjectionMatrix [16];
Говорили, что с указанием размера в 16 есть проблемы, и лучше использовать 17-размер. Не знаю, у меня и так нормально...
GLfloat ProjectionMatrix[16];
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, float(WindowWidth) / float(WindowHeight), 1.0, 100.0);
glGetFloatv(GL_PROJECTION_MATRIX, ProjectionMatrix);
ModelViewMatrix - видовая матрица. Определяет положение наблюдателя. Задается вращением с сдвигом наблюдателя. Например:
GLfloat ModelViewMatrix[16];
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(30.0, 1.0, 0.0, 0.0);
glTranslatef(0.0, 0.0, -5.0);
glGetFloatv(GL_MODELVIEW_MATRIX, ModeViewMatrix);
Мммм... исходник надо, рабочий, остался? :)
Исходник-то есть, но это довольно немаленький проект... К тому же чтобы эго откомпилировать нужен DirectX SDK...