我需要像OpenGL中的VTK(vtkaxesactor类)一样显示x-y-z轴,它位于场景的左下方。
我正在寻找前景中的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]
这可以胜任,但我怀疑这是否是最好的方法。
答案 0 :(得分:1)
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();
}