2014-07-02 67 views
0

所以我一直在盯着這個代碼看起來像一個半年。當談到lwjgl時,我是一個新手,但我已經運行了一些代碼。問題是我想要一個立方體,而且它真的很奇怪。從技術上講,目標只是能夠渲染隨機數量的立方體,但由於我遇到的錯誤,我已將其縮減爲只有一個。lwjgl生成3D立方體給出奇怪的形狀

我已經看過VBO,但是我的小組的其餘成員都使用GL11-GL13,並且看到這是最後一部分,我們希望堅持使用它。

總而言之,我試圖渲染當前的多維數據集,但後來我可以使用當前的設置添加任意數量的多維數據集。任何幫助都會很棒。我研究過改變x,y和z。

非常感謝大家的幫助!希望這是主題。

package citygeneratorv0; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 
import org.lwjgl.opengl.GL11; 
import org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; 
import static org.lwjgl.opengl.GL11.GL_MODELVIEW; 
import static org.lwjgl.opengl.GL11.GL_PROJECTION; 
import static org.lwjgl.opengl.GL11.glBegin; 
import static org.lwjgl.opengl.GL11.glClear; 
import static org.lwjgl.opengl.GL11.glColor3f; 
import static org.lwjgl.opengl.GL11.glEnd; 
import static org.lwjgl.opengl.GL11.glMatrixMode; 
import static org.lwjgl.opengl.GL11.glOrtho; 
import static org.lwjgl.opengl.GL11.glVertex3f; 

public class CityGeneratorV0 { 

private static final List<Box> city = new ArrayList<>(16); 


static void generateCity(int numBuildings) { 
    city.add(new Box()); 
    } 
} 

public static void main(String args[]) { 
    try { 
    Display.setDisplayMode(new DisplayMode(640, 480)); 
    Display.setTitle("Input Demo"); 
    Display.create(); 
    } catch (LWJGLException e) { 
    e.printStackTrace(); 
    Display.destroy(); 
    System.exit(1); 
    } 

    int numBuildings = 1; 
    generateCity(numBuildings); 

    glMatrixMode(GL_PROJECTION); 
    glOrtho(0, 640, 480, 0, 1, -1); 
    glMatrixMode(GL_MODELVIEW); 
    while (!Display.isCloseRequested()) { 
    glClear(GL_COLOR_BUFFER_BIT); 
    while (Keyboard.next()) { 
     if (Keyboard.getEventKey() == Keyboard.KEY_C && Keyboard.getEventKeyState()) { 
     } 
    } 
    if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { 
     Display.destroy(); 
     System.exit(0); 
    } 
    for (final Box box : city) { 
     box.draw(); 
    } 
    Display.update(); 
    Display.sync(5000); 
    } 
    System.out.print(city.size()); 
    Display.destroy(); 
} 

private static class Box { 
    private float rquad;     

    Boolean draw() { 
    GL11.glLoadIdentity();       // Reset The Current Modelview Matrix 
    GL11.glTranslatef(1.5f, 0.0f, -7.0f);    // Move Right 1.5 Units And Into The Screen 6.0 
    GL11.glRotatef(rquad, 1.0f, 0.0f, 0.0f);    // Rotate The Quad On The X axis (NEW) 
    glColor3f(0.5f, 0.5f, 1.0f);     // Set The Color To Blue One Time Only 

    glBegin(GL11.GL_QUADS);      // Draw A Quad 
    { 
     glColor3f(0.0f, 1.0f, 0.0f);    // Set The Color To Green 
     glVertex3f(400, 200, -100);   // Top Right Of The Quad (Top) 
     glVertex3f(300, 200, -100);   // Top Left Of The Quad (Top) 
     glVertex3f(300, 200, -50);   // Bottom Left Of The Quad (Top) 
     glVertex3f(400, 200, -50);   // Bottom Right Of The Quad (Top) 

     glColor3f(1.0f, 0.5f, 0.0f);    // Set The Color To Orange 
     glVertex3f(400, 100, -50);   // Top Right Of The Quad (Bottom) 
     glVertex3f(300, 100, -50);   // Top Left Of The Quad (Bottom) 
     glVertex3f(300, 100, -100);   // Bottom Left Of The Quad (Bottom) 
     glVertex3f(400, 100, -100);   // Bottom Right Of The Quad (Bottom) 

     glColor3f(1.0f, 0.0f, 0.0f);    // Set The Color To Red 
     glVertex3f(400, 200, -50);   // Top Right Of The Quad (Front) 
     glVertex3f(300, 200, -50);   // Top Left Of The Quad (Front) 
     glVertex3f(300, 100, -50);   // Bottom Left Of The Quad (Front) 
     glVertex3f(400, 100, -50);   // Bottom Right Of The Quad (Front) 

     glColor3f(1.0f, 1.0f, 0.0f);    // Set The Color To Yellow 
     glVertex3f(400, 100, -100);   // Bottom Left Of The Quad (Back) 
     glVertex3f(300, 100, -100);   // Bottom Right Of The Quad (Back) 
     glVertex3f(300, 200, -100);   // Top Right Of The Quad (Back) 
     glVertex3f(400, 200, -100);   // Top Left Of The Quad (Back) 

     glColor3f(0.0f, 0.0f, 1.0f);    // Set The Color To Blue 
     glVertex3f(300, 200, -50);   // Top Right Of The Quad (Left) 
     glVertex3f(300, 200, -100);   // Top Left Of The Quad (Left) 
     glVertex3f(300, 100, -100);   // Bottom Left Of The Quad (Left) 
     glVertex3f(300, 100, -50);   // Bottom Right Of The Quad (Left) 

     glColor3f(1.0f, 0.0f, 1.0f);    // Set The Color To Violet 
     glVertex3f(400, 200, -100);   // Top Right Of The Quad (Right) 
     glVertex3f(400, 200, -50);   // Top Left Of The Quad (Right) 
     glVertex3f(400, 100, -50);   // Bottom Left Of The Quad (Right) 
     glVertex3f(400, 100, -100);   // Bottom Right Of The Quad (Right) 
    } 
    glEnd();          // Done Drawing The Quad 

    rquad -= 0.15f;         
    return true; 
    } 
    } 

}

+0

不應該是glOrtho(0,640,0,480,1,-1); – Dawnkeeper

回答

1

TL; DR在底部。

這有幾個問題。當你撥打glOrtho時,你轉換了第三和第四個號碼,應該是Dawnkeeper所說的glOrtho(0, 640, 0, 480, 1, -1);。但即使如此,也可能存在問題,因爲您爲glOrtho放置的深度對於您要呈現的立方體來說太小。嘗試使用glOrtho(0, 640, 0, 480, 1000, -1000);,以便渲染整個多維數據集而不是-1和1內的部分。

另一個問題是您甚至使用正交視圖。如果您嘗試實現等軸測視圖,那麼正確的拼寫將是合適的,但要在現實生活中看到立方體,您應該使用透視圖。我相信還有其他方法可以做到這一點,但我通過使用gluPerspective方法來實現這一點,該方法出現在lwjgl-util jar中。進口是import org.lwjgl.util.glu.GLU;,用它你只需更換glOrtho方法GLU.gluPerspective(fovy, aspect, near, far);其中fovy是視場,通常在75左右,這是寬度/高度,或在你的情況下,640/480和nearfar是種類似glOrtho中的最後兩個參數,其中near通常是0.3ffar是您能夠看到任何內容的最大距離,並且可以是您想要的任何數字。但使用透視法,您還必須將立方體從相機移開,否則它將位於相機後面。我建議將glTranslatef()中的參數更改爲(-400, 0, -400)

一件事,你可能要啓用通過調用GL11.glEnable(GL11.GL_DEPTH_TEST);深度測試在渲染之前多維數據集,並更改glClear(GL_COLOR_BUFFER_BIT);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER BIT);,或者您可以直接在添加glClear(GL_DEPTH_BUFFER_BIT);。它所做的只是確保在旋轉時,無法看到立方體的另一側,以最後呈現的邊位於第一邊呈現的邊的前方。

TL; DR,將glOrtho方法更改爲glOrtho(0, 640, 0, 480, 1000, -1000);以便能夠看到立方體。以上兩段只是建議。

我希望這個答案能夠解決您的問題。