2014-07-02 68 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);以便能够看到立方体。以上两段只是建议。

我希望这个答案能够解决您的问题。