vtkaxesactor типа осей в OpenGL - PullRequest
0 голосов
/ 05 июля 2011

Мне нужно отобразить оси XYZ, как в VTK (класс vtkaxesactor) в OpenGL, который находится в левом нижнем углу сцены.

Я ищу 3 (x, y, z) цветные оси на переднем плане, которые дают ощущение ориентации при повороте, но остаются независимыми от масштабирования.

Есть ли класс GLUT, который делает это?Если нет, то как можно реализовать это?

РЕДАКТИРОВАТЬ после комментария datenwolf:

Я отслеживаю экстенты x, y, z, панорамирую и переводю.(Я использую pyopengl)

def renderAxis(self):

        glViewport(0,0,self.width()/8,self.height()/8)
        self.translate([-1*self.xpan,-1*self.ypan,-1*self.zpan])

        glMatrixMode(GL_MODELVIEW)
        glLineWidth(2)
        glBegin(GL_LINES)
        glColor(1, 0, 0)    #Xaxis, Red color
        glVertex3f(0, 0, 0)
        glVertex3f(0.15, 0, 0)
        glColor(0, 1, 0)    #Yaxis, Green color
        glVertex3f(0, 0, 0)
        glVertex3f(0, 0.15, 0)
        glColor(0, 0, 1)    #Zaxis, Blue color
        glVertex3f(0, 0, 0)
        glVertex3f(0, 0, 0.15)
        glEnd()

        glutInit()
        glColor(1,0,0)
        glRasterPos3f(0.16, 0.0, 0.0)
        glutBitmapCharacter(GLUT_BITMAP_8_BY_13,88)#ascii x
        glColor(0,1,0)
        glRasterPos3f(0.0, 0.16, 0.0)
        glutBitmapCharacter(GLUT_BITMAP_8_BY_13,89)#ascii y
        glColor(0,0,1)
        glRasterPos3f(0.0, 0.0, 0.16)
        glutBitmapCharacter(GLUT_BITMAP_8_BY_13,90)#ascii z

        self.translate([self.xpan,self.ypan,self.zpan])
        glViewport(0,0,self.width(),self.height())

   def translate(self, _trans):
        self.makeCurrent()
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glTranslated(_trans[0], _trans[1], _trans[2])
        glMultMatrixd(self.modelview_matrix_)
        self.modelview_matrix_ = glGetDoublev(GL_MODELVIEW_MATRIX)
        self.translate_vector_[0] = self.modelview_matrix_[3][0]
        self.translate_vector_[1] = self.modelview_matrix_[3][1]
        self.translate_vector_[2] = self.modelview_matrix_[3][2]

Это делает работу, однако я сомневаюсь, что это наилучший из возможных способов.

1 Ответ

1 голос
/ 05 июля 2011

класс GLUT? Вы понимаете, что GLUT не использует классы? И почему так сложно, просто нарисуйте эти оси. В конце вашей функции отображения добавьте следующее:

void display(void)
{
     /* ... */
     glMatrixMode(GL_MODELVIEW);
     GLfloat modelview[16];
     glGetFloatfv(GL_MODELVIEW_MATRIX, modelview);
     modelview[12] = modelview[13] = modelview[14] = 0.;
     modelview[15] = 1.;
     glLoadMatrixf(modelview);

     glViewport(0, 0, mini_axis_width, mini_axis_height);

     GLfloat miniaxis[] = {
          0., 0., 0., 1., 0., 0.,
          1., 0., 0., 1., 0., 0.,

          0., 0., 0., 0., 1., 0.,
          0., 1., 0., 0., 1., 0.,

          0., 0., 0., 0., 0., 1.,
          0., 0., 1., 0., 0., 1.,
     };

     glEnableClientState(GL_VERTEX_ARRAY);
     glEnableClientState(GL_COLOR_ARRAY);
     glVertexPointer(3, GL_FLOAT, 6*sizeof(GLfloat), miniaxis);
     glColorPointer(3, GL_FLOAT, 6*sizeof(GLfloat), miniaxis+3);
     glDrawArrays(GL_LINES, 0, 6);

     SwapBuffers();
}
...