Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отверстие в полигоне

17K
04 декабря 2006 года
russians
15 / / 10.09.2006
Господа, бьюсь об стену уже 12 дней с дырами В ПОЛИГОНЕ, и никакой путёвой информации по этому поводу нет...
Вот цилиндр:
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();

Господа, как это сделать через интегрирование или трафареты??? Горю... :(
6.6K
04 декабря 2006 года
Scaiman
126 / / 25.07.2006
Цитата из RedBook
Полигон (или многоугольник) – это область, ограниченная одной замкнутой ломаной, при этом каждый отрезок ломаной описывается вершинами на его концах (вершинами полигона). Обычно полигоны рисуются заполненными, но вы можете также рисовать полигоны в виде их границ или в виде точек на концах отрезков, образующих полигон.
В общем случае полигоны могут быть достаточно сложны, поэтому OpenGL накладывает очень серьезные ограничения в отношении того, что считается полигональным примитивом. Вопервых, ребра полигонов в OpenGL не могут пересекаться (в математике полигон, удовлетво-
ряющий этому условию, называется простым). Во-вторых, полигоны OpenGL должны быть выпуклыми. Полигон является выпуклым, если отрезок, соединяющий две точки полигона (точки могут быть и внутренними, и граничными) целиком лежит внутри полигона (то есть все его точки также принадлежат полигону). OpenGL не накладывает ограничений на количество вершин полигона (и, как следствие, на количество отрезков, определяющих его границу). Заметьте, что по-
лигоны с дырами не могут быть описаны, так как они не являются выпуклыми, и могут быть заданы при помощи одной замкнутой ломаной. Если вы поставите OpenGL перед вопросом о рисовании невыпуклого полигона, результат может быть не таким, какой вы ожидаете. Например,
на большинстве систем в ответ будет заполнена только выпуклая оболочка полигона (на многих системах не произойдет и этого).
Уту цитату привёл потаму что незнаю как памочь, и есть ли решение этой задачи.:confused:
8.2K
04 декабря 2006 года
Akela
64 / / 13.05.2005
А можно рисунок, а то не очень ясна задача?
17K
05 декабря 2006 года
russians
15 / / 10.09.2006
Рисунок прилагаю, в общем в полигоне с двух сторон надо сделать дырки, цилиндр без крышек туда уже впихнул...
17K
05 декабря 2006 года
russians
15 / / 10.09.2006
Цитата: Scaiman
Цитата из RedBook
Полигон (или многоугольник) – это область, ограниченная одной замкнутой ломаной, при этом каждый отрезок ломаной описывается вершинами на его концах (вершинами полигона). Обычно полигоны рисуются заполненными, но вы можете также рисовать полигоны в виде их границ или в виде точек на концах отрезков, образующих полигон.
В общем случае полигоны могут быть достаточно сложны, поэтому OpenGL накладывает очень серьезные ограничения в отношении того, что считается полигональным примитивом. Вопервых, ребра полигонов в OpenGL не могут пересекаться (в математике полигон, удовлетво-
ряющий этому условию, называется простым). Во-вторых, полигоны OpenGL должны быть выпуклыми. Полигон является выпуклым, если отрезок, соединяющий две точки полигона (точки могут быть и внутренними, и граничными) целиком лежит внутри полигона (то есть все его точки также принадлежат полигону). OpenGL не накладывает ограничений на количество вершин полигона (и, как следствие, на количество отрезков, определяющих его границу). Заметьте, что по-
лигоны с дырами не могут быть описаны, так как они не являются выпуклыми, и могут быть заданы при помощи одной замкнутой ломаной. Если вы поставите OpenGL перед вопросом о рисовании невыпуклого полигона, результат может быть не таким, какой вы ожидаете. Например,
на большинстве систем в ответ будет заполнена только выпуклая оболочка полигона (на многих системах не произойдет и этого).
Уту цитату привёл потаму что незнаю как памочь, и есть ли решение этой задачи.:confused:


Можно через трафареты сделать, но у меня затирает из буфеа абсолютно всё вместо того, точ мне надо, есть ещё tess-объекты для этого случая, но это тоже геммор...

5.4K
05 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Тебе нужна триангуляция многоугольников с дырами - реализация таких алгоритмов тянет на пару тысяч строчек кода.
17K
05 декабря 2006 года
russians
15 / / 10.09.2006
А короче нельзя никак?
8.2K
05 декабря 2006 года
Akela
64 / / 13.05.2005
Можно... с использованием буфера шаблонов. Идея такая: маскируем часть экрана, после чего используя маску рисуем сначала тело, в котором нужно сделать отверстие, а потом тело, делающее дырку. Вот пример кода:

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);

Вот что у меня получилось:
17K
08 декабря 2006 года
russians
15 / / 10.09.2006
Сам исходничек кинь пожалуйста, надо в практике это дело проглядеть :P
17K
16 декабря 2006 года
russians
15 / / 10.09.2006
//glLoadMatrixf(ModelViewMatrix);

C:\datavrash1\detravrash.cpp(392) : error C2065: 'ProjectionMatrix' : undeclared identifier
C:\datavrash1\detravrash.cpp(395) : error C2065: 'ModelViewMatrix' : undeclared identifier

ModelViewMatrix - что за зверь такой и как его писать?
9
16 декабря 2006 года
Lerkin
3.0K / / 25.03.2003
Цитата: russians
//glLoadMatrixf(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-размер. Не знаю, у меня и так нормально...

8.2K
17 декабря 2006 года
Akela
64 / / 13.05.2005
ProjectionMatrix - матрица проекции (перспективной или ортогональной (или любой другой)). Один из способов задания:

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);
17K
17 декабря 2006 года
russians
15 / / 10.09.2006
Мммм... исходник надо, рабочий, остался? :)
8.2K
17 декабря 2006 года
Akela
64 / / 13.05.2005
Исходник-то есть, но это довольно немаленький проект... К тому же чтобы эго откомпилировать нужен DirectX SDK...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог