0

所以我一直盯着这段代码看似乎有一个半岁了。我是 lwjgl 的新手,但我有一些代码正在运行。问题是我想要一个立方体,它回来时真的很奇怪。从技术上讲,目标只是能够渲染随机数量的立方体,但由于我遇到的错误,我将其减少到只有一个。

我研究过 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;
     }
  }

}

4

1 回答 1

1

TL;底部的 DR。

这有一些问题。当你调用glOrtho时,你调换了第三和第四个数字,应该是黎明守卫所说的,glOrtho(0, 640, 0, 480, 1, -1);。但即便如此,也可能会出现问题,因为您放入 glOrtho 的深度对于您尝试渲染的立方体来说太小了。尝试使用glOrtho(0, 640, 0, 480, 1000, -1000);,这样您就可以渲染整个立方体,而不是 -1 和 1 内的部分。

另一个问题是您甚至使用正交视图。如果您想获得等轴测视图,那么正交视图是合适的,但要像在现实生活中一样查看立方体,您应该使用透视图。我相信还有其他方法可以做到这一点,但我使用 lwjgl-util jar 中的 gluPerspective 方法来做到这一点。导入是import org.lwjgl.util.glu.GLU;,您只需将 glOrtho 方法替换为视野在GLU.gluPerspective(fovy, aspect, near, far); 哪里fovy,通常在 75 左右,纵横比,即宽度/高度,或者在您的情况下为 640/480,并且near有点far像最后两个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);以便能够看到立方体。上面两段只是建议。

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

于 2014-07-10T00:27:56.253 回答