Войти
ПрограммированиеФорумГрафика

Задача конструктивной геометрии в OpenGL

#0
21:44, 10 фев. 2014

Всем здравствуйте! Получил задание изобразить каркасную модель кубика с гранями из цилиндров с шариком в центре. Возникла проблема: при пересечении в узлах связи цилиндров (там, где пересекаются 3 цилиндра) убрать "излишки". Я сделал это с помощью сфер, подставив в каждый угол по сфере, вот что получилось:

Безымянный | Задача конструктивной геометрии в OpenGL
 void TForm1::Draw(float ang1, float ang2)

{
  GLUquadricObj *quadObj;

  quadObj = gluNewQuadric(); // создаем новый объект

  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT| GL_STENCIL_BUFFER_BIT);
  glEnable(GL_STENCIL_TEST); //разрешаем тест буфера трафарета
  glClearStencil(0);

  glPushMatrix();
  gluQuadricDrawStyle(quadObj, GLU_FILL); // устанавливаем

  glRotatef(ang1,0.0,1.0,0.0);       //поворот сцены
  glRotatef(ang2,1.0,0.0,0.0);

  glTranslated(-4.0, -4.0, -4.0);

  glColor3d(1,0,0);
  glRotatef(90,0.0,1.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(1,0,0);
  glTranslated(0.0,0,4.0);
  glRotatef(90,0.0,-1.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(1,0,0);
  glRotatef(90,-1.0,0.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);


  glColor3d(1,0,0);
  glTranslated(0.0, 0.0, 4.0);
  glRotatef(90,0.0,-1.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  //glColor3d(0,1,0);
  gluSphere(quadObj, 0.2, 100, 100);


  glColor3d(1,0,0);
  glRotatef(90,1.0,0.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);

  
  glColor3d(1,0,0);
  glTranslated(0.0, 0.0, 4.0);
  glRotatef(90,0.0,-1.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(1,0,0);
  glRotatef(90,-1.0,0.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  //glColor3d(0,1,0);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(1,0,0);
  glTranslated(0.0, -4.0, 0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(1,0,0);
  glTranslated(0.0, 0.0, 4.0);
  glRotatef(90,0.0,-1.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(1,0,0);
  glRotatef(90,-1.0,0.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);

  glColor3d(1,0,0);
  glTranslated(0.0, 0.0, 4.0);
  glRotatef(90,1.0,0.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(1,0,0);
  glTranslated(0.0, 0.0, 4.0);
  glRotatef(90,1.0,0.0,0.0);
  gluCylinder(quadObj, 0.2, 0.2, 4, 100, 100);
  gluSphere(quadObj, 0.2, 100, 100);

  glColor3d(0,0,1);
  glTranslated(-2.0, -2.0, 2.0);
  gluSphere(quadObj, 0.5, 100, 100);

   glPopMatrix();

  SwapBuffers(hDC);

}

Но данный способ решения проблемы походит больше на индусский код. Хотелось бы сделать это лучше. Как можно видеть, в коде я уже подключил буфер трафарета, но с ним у меня возникли проблемы: 1) если выполнить объединение цилиндров, то отпадут нужные грани; 2) нигде толковых исходников по объединению примитивов таким способом не нашел, да и информации очень мало по данной теме, к сожалению(

Если кому известны другие способы, которые более элегантны, то с удовольствием послушал бы их.


#1
22:19, 10 фев. 2014

Заюзай плоскости отсечения
http://www.opengl.org/sdk/docs/man2/xhtml/glClipPlane.xml

#2
0:22, 11 фев. 2014

предвидя возможную потребность в разнообразии анологичного
задай геометрию формулами расстояний, используй трассировку лучей (8 страниц счастья http://www.pouet.net/topic.php?which=7931&page=1)
или используй CSG http://evanw.github.io/csg.js/

#3
8:46, 11 фев. 2014
2 | Задача конструктивной геометрии в OpenGL

улучшил картинку, а то на твоей недостаточно плохо видно проблемный участок.
#4
9:25, 11 фев. 2014

А сделать модель в 3D max'e не вариант?

#5
9:50, 11 фев. 2014

MrShoor
Ахахахах, плоховато конечно видно, надо еще чуток увеличить=)

#6
17:43, 11 фев. 2014

Monte-Kristo
Не вариант.

ПрограммированиеФорумГрафика

Тема в архиве.