Jogl-3d-triangle

提供:Dev Guides
移動先:案内検索

JOGL-3Dトライアングル

前の章では、3Dシェイプの描画方法を見てきましたが、この章では、3D三角形の描画方法と回転方法について説明します。

以下は、3D三角形を描画して回転させるプログラムです。

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

import com.jogamp.opengl.util.FPSAnimator;

public class Triangle3d implements GLEventListener {

   private GLU glu = new GLU();
   private float rtri = 0.0f;

   @Override
   public void display(GLAutoDrawable drawable) {
      final GL2 gl = drawable.getGL().getGL2();

     //Clear The Screen And The Depth Buffer
      gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
      gl.glLoadIdentity();//Reset The View
      gl.glTranslatef( -0.5f, 0.0f, -6.0f );//Move the triangle
      gl.glRotatef( rtri, 0.0f, 1.0f, 0.0f );
      gl.glBegin( GL2.GL_TRIANGLES );

     //drawing triangle in all dimensions
     //Front
      gl.glColor3f( 1.0f, 0.0f, 0.0f );//Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top Of Triangle (Front)

      gl.glColor3f( 0.0f, 1.0f, 0.0f );//Green
      gl.glVertex3f( -1.0f, -1.0f, 1.0f );//Left Of Triangle (Front)

      gl.glColor3f( 0.0f, 0.0f, 1.0f );//Blue
      gl.glVertex3f( 1.0f, -1.0f, 1.0f );//Right Of Triangle (Front)

     //Right
      gl.glColor3f( 1.0f, 0.0f, 0.0f );//Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top Of Triangle (Right)

      gl.glColor3f( 0.0f, 0.0f, 1.0f );//Blue
      gl.glVertex3f( 1.0f, -1.0f, 1.0f );//Left Of Triangle (Right)

      gl.glColor3f( 0.0f, 1.0f, 0.0f );//Green
      gl.glVertex3f( 1.0f, -1.0f, -1.0f );//Right Of Triangle (Right)

     //Left
      gl.glColor3f( 1.0f, 0.0f, 0.0f );//Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top Of Triangle (Back)

      gl.glColor3f( 0.0f, 1.0f, 0.0f );//Green
      gl.glVertex3f( 1.0f, -1.0f, -1.0f );//Left Of Triangle (Back)

      gl.glColor3f( 0.0f, 0.0f, 1.0f );//Blue
      gl.glVertex3f( -1.0f, -1.0f, -1.0f );//Right Of Triangle (Back)

     //left
      gl.glColor3f( 0.0f, 1.0f, 0.0f );//Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top Of Triangle (Left)

      gl.glColor3f( 0.0f, 0.0f, 1.0f );//Blue
      gl.glVertex3f( -1.0f, -1.0f, -1.0f );//Left Of Triangle (Left)

      gl.glColor3f( 0.0f, 1.0f, 0.0f );//Green
      gl.glVertex3f( -1.0f, -1.0f, 1.0f );//Right Of Triangle (Left)

      gl.glEnd();//Done Drawing 3d triangle (Pyramid)
      gl.glFlush();
      rtri += 0.2f;
   }

   @Override
   public void dispose( GLAutoDrawable drawable ) {
     //method body
   }

   @Override
   public void init( GLAutoDrawable drawable ) {
     //method body
   }

   @Override
   public void reshape( GLAutoDrawable drawable, int x, int y, int width, int height ) {

     //TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      if(height lt;=;)
         height = 1;

      final float h = ( float ) width/( float ) height;
      gl.glViewport( 0, 0, width, height );
      gl.glMatrixMode( GL2.GL_PROJECTION );
      gl.glLoadIdentity();

      glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
      gl.glMatrixMode( GL2.GL_MODELVIEW );
      gl.glLoadIdentity();
   }

   public static void main( String[] args ) {

     //TODO Auto-generated method stub
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities( profile );

     //The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      Triangle3d triangle = new Triangle3d();

      glcanvas.addGLEventListener( triangle );
      glcanvas.setSize( 400, 400 );

      final JFrame frame = new JFrame ( "3d Triangle (shallow)" );

      frame.getContentPane().add( glcanvas );
      frame.setSize( frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );

      final FPSAnimator animator = new FPSAnimator(glcanvas,300,true);
      animator.start();
   }

}

上記のプログラムをコンパイルして実行すると、次の出力が生成されます。 ここには、回転する3D三角形のスナップショットがあります。 このプログラムには深度テストが含まれていないため、三角形は中空に生成されます。

トライアングル3D

三角形を固くするには、* glEnable(GL_DEPTH_TEST)を使用して深度テストを有効にする必要があります。 深度バッファを有効にすると、空白の画面が表示されます。 これは、 glClear(GL_COLOR_BUFFERBIT | GL_DEPTH_BUFFER_BIT)メソッドを使用して色をクリアすることでクリアできます。 init()メソッドまたは glDisplay()*メソッドで深度テストを有効にするには、次のコードを記述します-

public void init(GLAutoDrawable drawable) {
   final GL2 gl = drawable.getGL().getGL2();

   gl.glShadeModel(GL2.GL_SMOOTH);
   gl.glClearColor(0f, 0f, 0f, 0f);
   gl.glClearDepth(1.0f);
   gl.glEnable(GL2.GL_DEPTH_TEST);
   gl.glDepthFunc(GL2.GL_LEQUAL);
   gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
 }

以下は、深度テストで3D三角形を描画するプログラムです。

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import javax.swing.JFrame;

import com.jogamp.opengl.util.FPSAnimator;

public class Triangledepthtest implements GLEventListener {

   private GLU glu = new GLU();
   private float rtri = 0.0f;

   @Override
   public void display( GLAutoDrawable drawable ) {

      final GL2 gl = drawable.getGL().getGL2();

      gl.glShadeModel( GL2.GL_SMOOTH );
      gl.glClearColor( 0f, 0f, 0f, 0f );
      gl.glClearDepth( 1.0f );
      gl.glEnable( GL2.GL_DEPTH_TEST );
      gl.glDepthFunc( GL2.GL_LEQUAL );
      gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);

     //Clear The Screen And The Depth Buffer
      gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
      gl.glLoadIdentity();//Reset The View
      gl.glTranslatef( -0.5f,0.0f,-6.0f );//Move the triangle
      gl.glRotatef( rtri, 0.0f, 1.0f, 0.0f );
      gl.glBegin( GL2.GL_TRIANGLES );

     //drawing triangle in all dimensions
     //front
      gl.glColor3f( 1.0f, 0.0f, 0.0f );//Red
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top

      gl.glColor3f( 0.0f, 1.0f, 0.0f );//Green
      gl.glVertex3f( -1.0f, -1.0f, 1.0f );//Left

      gl.glColor3f( 0.0f, 0.0f, 1.0f );//Blue
      gl.glVertex3f( 1.0f, -1.0f, 1.0f );//Right)

     //right
      gl.glColor3f( 1.0f, 0.0f, 0.0f );
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top

      gl.glColor3f( 0.0f, 0.0f, 1.0f );
      gl.glVertex3f( 1.0f, -1.0f, 1.0f );//Left

      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( 1.0f, -1.0f, -1.0f );//Right

     //left
      gl.glColor3f( 1.0f, 0.0f, 0.0f );
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top

      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( 1.0f, -1.0f, -1.0f );//Left

      gl.glColor3f( 0.0f, 0.0f, 1.0f );
      gl.glVertex3f( -1.0f, -1.0f, -1.0f );//Right

     //top
      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( 1.0f, 2.0f, 0.0f );//Top

      gl.glColor3f( 0.0f, 0.0f, 1.0f );
      gl.glVertex3f( -1.0f, -1.0f, -1.0f );//Left

      gl.glColor3f( 0.0f, 1.0f, 0.0f );
      gl.glVertex3f( -1.0f, -1.0f, 1.0f );//Right

      gl.glEnd();//Done Drawing 3d triangle (Pyramid)

      gl.glFlush();
      rtri += 0.2f;
   }

   @Override
   public void dispose( GLAutoDrawable drawable ) {
   }

   @Override
   public void init( GLAutoDrawable drawable ) {

      final GL2 gl = drawable.getGL().getGL2();

      gl.glShadeModel( GL2.GL_SMOOTH );
      gl.glClearColor( 0f, 0f, 0f, 0f );
      gl.glClearDepth( 1.0f );
      gl.glEnable( GL2.GL_DEPTH_TEST );
      gl.glDepthFunc( GL2.GL_LEQUAL );
      gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST );
   }

   @Override
   public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height ) {

     //TODO Auto-generated method stub
      final GL2 gl = drawable.getGL().getGL2();
      if( height <= 0 )
         height = 1;

      final float h = ( float ) width/( float ) height;
      gl.glViewport( 0, 0, width, height );
      gl.glMatrixMode( GL2.GL_PROJECTION );
      gl.glLoadIdentity();

      glu.gluPerspective( 45.0f, h, 1.0, 20.0 );
      gl.glMatrixMode( GL2.GL_MODELVIEW );
      gl.glLoadIdentity();
   }

   public static void main( String[] args ) {

     //TODO Auto-generated method stub
      final GLProfile profile = GLProfile.get( GLProfile.GL2 );
      GLCapabilities capabilities = new GLCapabilities( profile );

     //The canvas
      final GLCanvas glcanvas = new GLCanvas( capabilities );
      Triangledepthtest triangledepthtest = new Triangledepthtest();

      glcanvas.addGLEventListener( triangledepthtest );
      glcanvas.setSize( 400, 400 );

      final JFrame frame = new JFrame ( "3d Triangle (solid)" );
      frame.getContentPane().add(glcanvas);
      frame.setSize( frame.getContentPane().getPreferredSize() );
      frame.setVisible( true );
      final FPSAnimator animator = new FPSAnimator( glcanvas, 300,true);

      animator.start();
   }

}

上記のプログラムをコンパイルして実行すると、次の出力が生成されます。

ここでは、回転する3D三角形のスナップショットを見ることができます。 このプログラムには深度テスト用のコードが含まれているため、三角形はソリッドで生成されます。

三角深度テスト