在visual studio 2010和c ++中使用OpenGL绘制轴箭头

Gol*_*aji 3 c++ opengl visual-studio-2010

使用openGL,我可以在屏幕中心绘制轴(x,y和z),但我无法在每行的末尾绘制箭头.在2d我看到一个使用GL_LINE_STRIP的示例代码,但在3D中,我用googled很多,我没有找到任何例子; 现在我只是在每一行的末尾添加一个点; 但实际上它非常难看.

我怎么画它?这段代码只是将z轴的圆柱体画到适当的位置; 我怎样才能设定其他人?

void Axis_3D (void)
{
    GLUquadric* cyl = gluNewQuadric();
    GLUquadric* cy2 = gluNewQuadric();
    GLUquadric* cy3 = gluNewQuadric();

   // gluCylinder (cyl, 0.02, 0.02, 4, 16, 1);        // Body of axis.

    glColor3f (1,1,1);                                // Make arrow head white.
    glPushMatrix ();
       glTranslatef (0.0,0.0,4);
       gluCylinder(cyl, 0.04, 0.000, 0.1, 12,1);   // Cone at end of axis.

       glTranslatef (0.0,4,0.0);
       gluCylinder  (cy2, 0.04, 0.001, 0.1, 12,1);

       glTranslatef (4,0.0,0.0);
       gluCylinder  (cy3, 0.04, 0.001, 0.1, 12,1);
    glPopMatrix ();
}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

The*_*ist 8

我使用这些函数在一个可爱的小模拟程序中绘制箭头.玩得开心:)

#define RADPERDEG 0.0174533

void Arrow(GLdouble x1,GLdouble y1,GLdouble z1,GLdouble x2,GLdouble y2,GLdouble z2,GLdouble D)
{
  double x=x2-x1;
  double y=y2-y1;
  double z=z2-z1;
  double L=sqrt(x*x+y*y+z*z);

    GLUquadricObj *quadObj;

    glPushMatrix ();

      glTranslated(x1,y1,z1);

      if((x!=0.)||(y!=0.)) {
        glRotated(atan2(y,x)/RADPERDEG,0.,0.,1.);
        glRotated(atan2(sqrt(x*x+y*y),z)/RADPERDEG,0.,1.,0.);
      } else if (z<0){
        glRotated(180,1.,0.,0.);
      }

      glTranslatef(0,0,L-4*D);

      quadObj = gluNewQuadric ();
      gluQuadricDrawStyle (quadObj, GLU_FILL);
      gluQuadricNormals (quadObj, GLU_SMOOTH);
      gluCylinder(quadObj, 2*D, 0.0, 4*D, 32, 1);
      gluDeleteQuadric(quadObj);

      quadObj = gluNewQuadric ();
      gluQuadricDrawStyle (quadObj, GLU_FILL);
      gluQuadricNormals (quadObj, GLU_SMOOTH);
      gluDisk(quadObj, 0.0, 2*D, 32, 1);
      gluDeleteQuadric(quadObj);

      glTranslatef(0,0,-L+4*D);

      quadObj = gluNewQuadric ();
      gluQuadricDrawStyle (quadObj, GLU_FILL);
      gluQuadricNormals (quadObj, GLU_SMOOTH);
      gluCylinder(quadObj, D, D, L-4*D, 32, 1);
      gluDeleteQuadric(quadObj);

      quadObj = gluNewQuadric ();
      gluQuadricDrawStyle (quadObj, GLU_FILL);
      gluQuadricNormals (quadObj, GLU_SMOOTH);
      gluDisk(quadObj, 0.0, D, 32, 1);
      gluDeleteQuadric(quadObj);

    glPopMatrix ();

}
void drawAxes(GLdouble length)
{
    glPushMatrix();
    glTranslatef(-length,0,0);
    Arrow(0,0,0, 2*length,0,0, 0.2);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0,-length,0);
    Arrow(0,0,0, 0,2*length,0, 0.2);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0,0,-length);
    Arrow(0,0,0, 0,0,2*length, 0.2);
    glPopMatrix();
}
Run Code Online (Sandbox Code Playgroud)