2011-11-23 3 views
1

나는 LWJGL을 사용하여 게시판을 만들려고 노력 중이었고 부분적으로 성공했습니다. 쿼드가 나타납니다. 그러나 어느 축에서나 카메라를 회전 시키면 쿼드도 다른 방식으로 축을 따라 이동합니다. 다음은 내가 사용하는 코드입니다 :빌보드 in LWJGL

/*************************************************************************************************************************************************************************************************** 
* All rendering happens here... 
**************************************************************************************************************************************************************************************************/ 
private void render() { 

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer 
    GL11.glLoadIdentity(); // Reset The View 

    //GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, lightPosition); // Position The Light 

    GL11.glRotatef(360.0f - yrot, 0, 1.0f, 0); 
    GL11.glRotatef(lookupdown, 1.0f, 0, 0); 

    GL11.glTranslatef(-xpos, 0, -zpos); 


    GL11.glCallList(blocksList); 
    GL11.glCallList(tilesList); 
    GL11.glCallList(roofList); 

    /* Render billboards */ 
    Billboard bb = lvLoader.currentLevel.billboards[0]; 
    GL11.glPushMatrix(); 
    GL11.glRotatef(360.0f - yrot, 0, -1.0f, 0); 
    GL11.glRotatef(lookupdown, -1.0f, 0, 0); 
    GL11.glBegin(GL11.GL_QUADS); 
    GL11.glVertex3f(bb.origin.x + 0.5f, bb.origin.y + 0.5f, bb.origin.z); 
    GL11.glVertex3f(bb.origin.x - 0.5f, bb.origin.y + 0.5f, bb.origin.z); 
    GL11.glVertex3f(bb.origin.x - 0.5f, bb.origin.y - 0.5f, bb.origin.z); 
    GL11.glVertex3f(bb.origin.x + 0.5f, bb.origin.y - 0.5f, bb.origin.z); 
    GL11.glEnd(); 
    GL11.glPopMatrix(); 

다음은 lookupdown 및 yrot을 제어하는 ​​함수입니다.

if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { // Is PageUp Being Pressed? 
     lookupdown -= 1.0f; // Rotate The Secene Downwards 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { // Is PageDown Being Pressed? 
     lookupdown += 1.0f; // Rotate The Scene Upwards 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) 
    { 
     yrot -= 1.5f; // Rotate The Scene To The Left 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) 
    { 
     yrot += 1.5f; // Rotate The Scene To The Left 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_W)) 
    { 
     adjustXZ((float) Math.sin(yrot * piover180) * 0.05f, (float) Math.cos(yrot * piover180) * 0.05f, false, false); 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_S)) 
    { 
     adjustXZ((float) Math.sin(yrot * piover180) * 0.05f, (float) Math.cos(yrot * piover180) * 0.05f, true, true); 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_D)) 
    { 
     adjustXZ((float) Math.sin((yrot-90) * piover180) * 0.05f, (float) Math.cos((yrot-90) * piover180) * 0.05f, false, false); 
    } 

    if (Keyboard.isKeyDown(Keyboard.KEY_A)) 
    { 
     adjustXZ((float) Math.sin((yrot+90) * piover180) * 0.05f, (float) Math.cos((yrot+90) * piover180) * 0.05f, false, false); 
    } 

private void adjustXZ(float x, float z, boolean xAdd, boolean zAdd) 
{ 
    if (collisionCheck(x, z, xAdd, zAdd)) 
     return; 

    if (xAdd) 
     xpos += x; 
    else if (!xAdd) 
     xpos -= x; 

    if (zAdd) 
     zpos += z; 
    else if (!zAdd) 
     zpos -= z; 
} 
+0

'yrot'과 'lookupdown'을 어디에서 얻을 수 있는지 조금 설명해 주시겠습니까? 그것들이 카메라의 가치일지도 모르지만 더 많은 정보가 없으면 확신하기가 어렵습니다. – vaughandroid

+0

예, 카메라를 제어합니다. 메인 포스트에 추가했습니다. – Myzreal

답변

0

나는 당신이 당신의 행렬이 잘못된에 변환있어 매우 같은 소리 다른 3D API의의 내 경험을 바탕으로 그래서 나는 그것이 무엇을 기대 100 % 확실하지 않다 LWJGL에 익숙하지 해요,하지만 주문.

다음과 같이 코드를 변경해보십시오 :

GL11.glPushMatrix(); 
GL11.glTranslatef(bb.origin.x, bb.origin.y, bb.origin.z); // Translation here 
GL11.glRotatef(360.0f - yrot, 0, -1.0f, 0); 
GL11.glRotatef(lookupdown, -1.0f, 0, 0); 
GL11.glBegin(GL11.GL_QUADS); 
GL11.glVertex3f(0.5f, 0.5f, 0); // No translation here anymore 
GL11.glVertex3f(0.5f, 0.5f, 0; 
GL11.glVertex3f(0.5f, 0.5f, 0); 
GL11.glVertex3f(0.5f, 0.5f, 0); 
GL11.glEnd(); 

을 별도의 메모에서, 당신은 기존의 billboarding 기술을 사용하지 않는 것입니다. 빌보드가 항상 카메라를 향하게하는 대신, 카메라에 항상 직각이되게하십시오. 이는보기 절두체의 가장자리 근처에있는 광고 게시판 개체에서 눈에.니다. 나는 이것을 더 깊이 생각하기 위해 당신에게 맡길 것입니다!

+0

감사합니다. 문제가 해결되었습니다. OpenGL에서 번역과 회전이 어떻게 작동하는지 더 잘 이해할 필요가 있습니다. 아마 이것에 관한 기사가 있습니까? 필자의 작은 프로젝트에는 수직 빌보드가 충분할 것으로 생각되지만이 문제를 더 연구 할 것입니다. 시간 내 주셔서 감사합니다. – Myzreal

+0

죄송합니다. 기사/자습서 소싱에 많은 도움이 될 수 있습니다. 그래픽 프로그래머보다 게임 플레이 프로그래머에 가깝기 때문에 OpenGL을 직접 사용해 본 이래로 꽤 오래되었습니다. 거기에 많은 것들이 있지만, 그냥 인터넷 검색을 얻을 조만간 또는 귀하의 학습 스타일과 경험의 수준에 맞는 괜찮은 자습서와 함께 사이트 또는 2 건너 올거야 ... 행운을 빕니다! – vaughandroid