2011-11-23 114 views
1

我試圖用LWJGL製作廣告牌,並且我部分成功了。我出現時,出現並確實面對相機。但是,只要我在任何一個軸上旋轉攝像頭,四邊形也會以不同的方式沿軸線移動。這裏是我使用的代碼: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

我不熟悉LWJGL所以我不是100%肯定它預期,但基於我與其他3D API的經驗,這聽起來很像你有你的矩陣在錯誤的轉換訂購。

試着改變你的代碼如下:

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(); 

在一個單獨的說明,你不使用傳統的廣告牌效果的技術。廣告牌並不總是面向相機,而是讓它們始終垂直於相機。這對於您的視野邊緣附近的廣告牌物體來說是顯而易見的。我會留給你看看這個更進一步,但!

+0

謝謝,這確實解決了這個問題。我真的需要更好地理解翻譯和旋轉在openGL中的工作原理。也許你有這方面的一些文章? 我認爲,垂直廣告牌對於我的小項目已經足夠了,但我會進一步研究這個問題。 感謝您的時間! – Myzreal

+0

對不起,我不知道我可以幫助採購文章/教程。從我與OpenGL直接合作起,這是一段時間,因爲我更像是一名遊戲程序員,而不是圖形程序員。雖然有很多東西,只是得到谷歌搜索,遲早你會遇到一個或兩個有適合你的學習風格和經驗水平的體面的教程...祝你好運! – vaughandroid