2016-09-11 6 views
0

OpenGLを使用してJavaでサークルシェイプのサイズを変更するにはどうすればよいですか?私はJavaとOpenGLを初めて使っているので、サークルのサイズが変更されていない理由を理解できません。私は別のパラメータで再び関数を呼び出していますが、何らかの理由で私の円はまったく同じで、変化しません。どうしてですか?OpenGLを使用してJavaでサークルのサイズを変更するには

私が最初に私のdisplay(..)機能でdrawCircle(..,..,..,..)を呼び出して、円を描く

あなたはキーが押されたときことに気づくでしょう。 'a'は、私はそれだけでも全く描かれた私の最初のサークルを変更しませんが、何らかの理由で円

@Override 
    public void keyTyped(KeyEvent e) 
    { 
     // TODO Auto-generated method stub 
     char key= e.getKeyChar(); 
     System.out.printf("Key typed: %c\n", key); 

     // Make shape bigger 
     // increase size of circle 
     if(key == 'a') 
     { 

      drawCircle(test, 10.0f, 10.0f, 10.0f); 
     } 

     // move right 
     if(key == 'f') 
     { 

     } 
    } 

のサイズを増やすことをお勧めします。

私が持っている:

JoglEventListener.java

package helloOpenGL; 

/************************************************************************************* 
* IMPORTS  
**************************************************************************************/ 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import com.jogamp.opengl.*; 
import com.jogamp.opengl.glu.GLU; 

/************************************************************************************* 
* JoglEventListener 
**************************************************************************************/ 
public class JoglEventListener implements GLEventListener, KeyListener 
{ 


    float rot; 
    GL2 gl = null; 
    GLAutoDrawable test = null; 
    // Instantiate GLU thing? 
    private GLU glu = new GLU(); 

    /************************************************************************************* 
    * displayChanged 
    * What does this do? 
    **************************************************************************************/ 
    public void displayChanged(GLAutoDrawable gLDrawable, 
       boolean modeChanged, boolean deviceChanged) 
    { 
     // Function that does nothing? 
    } 

    /** Called by the drawable immediately after the OpenGL context is 
    * initialized for the first time. Can be used to perform one-time OpenGL 
    * initialization such as setup of lights and display lists. 
    * @param gLDrawable The GLAutoDrawable object. 
    */ 

    /************************************************************************************* 
    * init  
    **************************************************************************************/ 
    public void init(GLAutoDrawable gLDrawable) 
    { 
     GL2 gl = gLDrawable.getGL().getGL2(); 
     //gl.glShadeModel(GL.GL_LINE_SMOOTH);    // Enable Smooth Shading 
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background 
     gl.glClearDepth(1.0f);      // Depth Buffer Setup 
     gl.glEnable(GL.GL_DEPTH_TEST);    // Enables Depth Testing 
     gl.glDepthFunc(GL.GL_LEQUAL);    // The Type Of Depth Testing To Do 
     // Really Nice Perspective Calculations 
     //gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); 
    } 

    /************************************************************************************* 
    * reshape ? 
    * ? 
    **************************************************************************************/  
    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, 
       int height) 
    { 
     gl = gLDrawable.getGL().getGL2(); 

     if (height <= 0) // avoid a divide by zero error! 
      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, 200.0); 
     gl.glMatrixMode(GL2.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     gl.glTranslatef(0.0f, 0.0f, -40.0f); 
    } 

    public void drawCircle(GLAutoDrawable gLDrawable, float x, float y, float radius) 
    { 
     GL2 gl = gLDrawable.getGL().getGL2(); 
     int i; 
     test = gLDrawable; 
     //GLfloat radius = 0.8f; //radius 
     float twicePi = (float) (2.0f * Math.PI); 

     gl.glBegin(GL.GL_LINE_LOOP); 
      for(i = 0; i <= 360;i++) 
      { 
       gl.glVertex2f(
        x + ((float)(radius * Math.cos(i * twicePi/360))), 
        y + ((float)(radius* Math.sin(i * twicePi/360))) 
       ); 
      } 
     gl.glEnd(); 
    } 



    @Override 
    public void display(GLAutoDrawable gLDrawable) 
    { 
     // TODO Auto-generated method stub 
     final GL2 gl = gLDrawable.getGL().getGL2(); 

     gl.glClearColor(backrgb[0], 0, 1, 1); 
     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

     backrgb[0]+=0.0005; 
     if (backrgb[0]> 1) backrgb[0] = 0; 

     // DRAW STUFF IN THIS FUNCTION 
     drawCircle(gLDrawable, 5.0f, 5.0f, 3.0f); 

    } 

    @Override 
    public void dispose(GLAutoDrawable arg0) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent e) 
    { 
     // TODO Auto-generated method stub 
     char key= e.getKeyChar(); 
     System.out.printf("Key typed: %c\n", key); 

     // Move Horizontally 
     // move left 
     if(key == 'a') 
     { 

      drawCircle(test, 10.0f, 10.0f, 10.0f); 
     } 

     // move right 
     if(key == 'f') 
     { 

     } 
    } 

    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyReleased(KeyEvent e) 
    { 
     // TODO Auto-generated method stub 

    } 



} 

答えて

0

あなたはそれが描か取得するdisplay機能で更新された半径を与える必要があります。さもなければイメージはそれによって上書きされます。例えばfloat rot;のような変数に半径を格納し、 'a'を押すと描画しないで、変数のみを更新します。そして、表示機能に変数を使用します。

drawCircle(gLDrawable, 5.0f, 5.0f, radius); 
+0

を私は腐敗に値を格納し、「」押され、その後、私は渡すことによって再び表示(..)関数を呼び出すしようとしたときにそれを更新してみました以前と同じGLAutoDrawableのparmとそれはまだ変更されませんでした..任意のアイデア? –

+0

updatedRadius変数を表示関数に渡すだけですか? –

+0

@Shammy 'JoglEventListener'のメンバーにして、' if(key == 'a') ' – SurvivalMachine

関連する問題