2013-11-01 6 views
0

그래서 오브젝트를 회전시키고 싶다. glPushMatrix()를 호출하여 매트릭스를 저장한다. glTranslatef는 객체가 자신의 축을 갖기를 원하기 때문에, 그때는 회전을 호출 glPopMatrix가()와 아무 반응이 없습니다 : D오브젝트가 움직이지 않는다.

package Tanc; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.input.Mouse; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 
import org.lwjgl.opengl.GL11; 
import org.lwjgl.*; 
public class Tanc{ 

public Tanc(){ 
    try{ 
     Display.setDisplayMode(new DisplayMode(640,480)); 
     Display.setTitle("Tancc"); 
     Display.create(); 
    }catch(LWJGLException e){ 
     e.printStackTrace(); 
    } 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    GL11.glLoadIdentity(); 
    GL11.glOrtho(1, 1, 1, 1, 1, -1); 
    GL11.glEnable(GL11.GL_TEXTURE_2D); 
    GL11.glMatrixMode(GL11.GL_PROJECTION); 

    float y_angle = 0; 

    while (!Display.isCloseRequested()) { 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 
     GL11.glPushMatrix(); 

/*  
     GL11.glRectd(0, 0, 0.2f, 0.3f); 
     // GL11.glRotated(50, 1, 0, 0); 
     // GL11.glRotated(50, 0, 1, 0); 
     GL11.glRotated(1, 0, 0, 1); 
    // GL11.glTranslatef(0, 0, 0); 
     GL11.glTranslatef(-0.1f, -0.15f, 0); 
    // GL11.glTranslatef(-1f, -0.15f, 0); 
     GL11.glPopMatrix(); 
*/ 
     GL11.glLoadIdentity(); 
     GL11.glPushMatrix(); 
     GL11.glBegin(GL11.GL_QUADS); 
     GL11.glVertex2f(0f, 0f); 
     GL11.glVertex2f(0.2f, 0f); 
     GL11.glVertex2f(0.2f, 0.3f); 
     GL11.glVertex2f(0f, 0.3f); 
     GL11.glEnd(); 
     GL11.glTranslatef(-0.1f, -0.15f, 0); 
     GL11.glRotatef(30, 1, 0, 1); 
     GL11.glPopMatrix(); 
     Display.update(); 
     Display.sync(60); 
    }  
    Display.destroy(); 
    System.exit(0); 
} 

public static void main(String[] args){ 
    new Tanc(); 
} 

}

답변

2

같은 일이 각 프레임을하고있는 때문이다.

당신은 삼각형을 만들고, 번역하고, 0에서 30도까지 회전시킵니다. 다음 프레임에서는 모든 것이 재설정되고 똑같은 동작을하며 0에서 30도까지 회전합니다.

어떤 종류의 영구 데이터가 필요합니다.

GL11.glRotatef(xRot, 1, 0, 1); 
//... 
xRot = xRot > 360 ? 0 : xRot + 10; 
+0

아무것도 변경되지 않습니다. –

+0

의미가 없습니다. 코딩 배경이 있습니까? 그렇지 않다면 3D 프로그래밍을 시작하기 전에 기본으로 돌아갈 것입니다. –

+0

또한 while 루프 외부에서 xRot을 선언해야합니다. 그렇지 않으면 같은 문제가 발생합니다. –

1

캡틴 스카이 호크의 답변은 정확합니다.

또한 그림을 그리기 전에 변환 작업을 수행하십시오.

0

마침내 그것을 고쳤습니다. :) 그리고 하나의 개체 만 회전시킵니다. D.

package Tanc; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.input.Mouse; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 
import org.lwjgl.opengl.GL11; 
import org.lwjgl.*; 
public class Tanc{ 
private void useless(){ 
    /*  
    GL11.glRectd(0, 0, 0.2f, 0.3f); 
    // GL11.glRotated(50, 1, 0, 0); 
    // GL11.glRotated(50, 0, 1, 0); 
    GL11.glRotated(1, 0, 0, 1); 
// GL11.glTranslatef(0, 0, 0); 
    GL11.glTranslatef(-0.1f, -0.15f, 0); 
// GL11.glTranslatef(-1f, -0.15f, 0); 
    GL11.glPopMatrix(); 
*/ 

     //   GL11.glLoadIdentity(); 
     } 
    public Tanc(){ 

    try{ 
     Display.setDisplayMode(new DisplayMode(640,480)); 
     Display.setTitle("Tancc"); 
     Display.create(); 
    }catch(LWJGLException e){ 
     e.printStackTrace(); 
    } 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    GL11.glLoadIdentity(); 
    GL11.glOrtho(1, 1, 1, 1, 1, -1); 
    GL11.glEnable(GL11.GL_TEXTURE_2D); 
    GL11.glMatrixMode(GL11.GL_PROJECTION); 

    float y_angle = 0; 
    float xrot= Mouse.getDY(); 
    float yrot =Mouse.getDX(); 
    float a=0,b=0,c=0; 
    while (!Display.isCloseRequested()) { 

     GL11.glPushMatrix(); 
     GL11.glRotatef(yrot, 0, 0, 1); 
     GL11.glRotatef(xrot, 0, 0, 1); 
     GL11.glTranslatef(a, b, 0); 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 


     GL11.glBegin(GL11.GL_QUADS); 
     GL11.glVertex2f(0f, 0f); 
     GL11.glVertex2f(0.2f, 0f); 
     GL11.glVertex2f(0.2f, 0.3f); 
     GL11.glVertex2f(0f, 0.3f); 
     GL11.glEnd(); 



     if(Keyboard.isKeyDown(Keyboard.KEY_A)){ 
     xrot = xrot > 360 ? 0 : xrot + 5; 
    // a += 0.01f; 
     // b += 0.01f; 
     } 
    // if(Keyboard.isKeyDown(Keyboard.KEY_D)){ 
      // if(xrot>360){ 
      // xrot = 0; 
      //}else { 
       xrot += Mouse.getDY()*1f; 
       yrot -= Mouse.getDX()*1f; 
      // } 
    // } 
     GL11.glPopMatrix(); 

     GL11.glBegin(GL11.GL_QUADS); 


     GL11.glVertex2f(0.2f, 0.2f); 
     GL11.glVertex2f(0.3f, 0.2f); 
     GL11.glVertex2f(0.3f, 0.3f); 
     GL11.glVertex2f(0.2f, 0.3f); 
     GL11.glEnd(); 

     Display.update(); 
     Display.sync(60); 
    }  
    Display.destroy(); 
    System.exit(0); 
} 

public static void main(String[] args){ 
    new Tanc(); 
} 

}

관련 문제