2

openGL を使用すると、画面の中央に軸 (x、y、z) を描画できますが、各行の最後に矢印を描画できません。2D では GL_LINE_STRIP を使用するサンプル コードを見ましたが、3D では多くのことをグーグル検索しましたが、例が見つかりませんでした。ここで、各行の終わりにポイントを置きました。しかし、実際には非常に醜いです。

どうすればそれを描くことができますか?このコードは、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 ();
}

どうもありがとうございます!

4

3 に答える 3

0

The Quantum Physicist の助けを借りて、それを自分のコードとマージし、最後にこの Axes を描画します。

#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;
    GLUquadric* cyl = gluNewQuadric();
    GLUquadric* cy2 = gluNewQuadric();
    GLUquadric* cy3 = gluNewQuadric();
    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);

      gluQuadricDrawStyle (cyl, GLU_FILL);
      gluQuadricNormals (cyl, GLU_SMOOTH);
      glColor3f (1,1,1); 
      glTranslatef (0.0,0.0,4);
      gluCylinder(cyl, 0.04, 0.0, 1.0, 12,1);
      gluDeleteQuadric(cyl);

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

      gluQuadricDrawStyle (cy2, GLU_FILL);
      gluQuadricNormals (cy2, GLU_SMOOTH);
      glColor3f (1,1,1);
      glTranslatef (0.0,4,0.0);
      gluCylinder(cy2, 0.4, 0.4,L-1.6, 12,1);
      gluDeleteQuadric(cy2);

    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();
}
于 2013-10-13T08:28:40.620 に答える