当前位置: 首页 > 知识库问答 >
问题:

3D顶点LWJGL/OpenGL

谢弘阔
2023-03-14

我正在尝试LWJGL库,但我有点困惑。当我尝试渲染具有2d顶点的四边形时:glVertex2f(0,0);glVertex2f(0, 1000);glVertex2f(1000, 1000);glVertex2f(1000, 0);,那么一切似乎都很好,但是当我使用下面的代码时,我只看到黑屏。是我使用了错误的坐标,因此它没有显示在屏幕上,还是其他问题?

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.util.glu.GLU.*;
import static org.lwjgl.opengl.GL11.*;

public class main {

    public void start() throws LWJGLException {
        int height = 600;
        int width = 800;
        DisplayMode standard = new DisplayMode(width, height);
        Display.setDisplayMode(standard);
        Display.create();

        // init OpenGL here
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, width, height, 0, 0, -1);
        glMatrixMode(GL_MODELVIEW);

        while (!Display.isCloseRequested()) {
            // clear the screen and depth buffer
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            // set the color of the quad (R,G,B,A)
            glColor3f(0.5f, 0.5f, 1.0f);

            // draw quad
            glBegin(GL_QUADS);
            glVertex3f(0, 0, 10);
            glVertex3f(0, 1000, 10);
            glVertex3f(1000, 1000, 10);
            glVertex3f(1000, 0, 10);
            glEnd();

            Display.update();
        }

        Display.destroy();
    }

    public static void main(String[] argv) throws LWJGLException {
        main displayExample = new main();
        displayExample.start();
    }
}

共有1个答案

秦禄
2023-03-14

我可能对这个观点做了一些错误的事情。我设法制作了一个功能正常的3d立方体。关键点Q、W、E分别将数字添加到眼点的x、y和z坐标(我没有考虑FPS,因此您可以调整eye*=0.1),A、S和D将数字从x、y、z中转移。

import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.util.glu.GLU.*;
import static org.lwjgl.opengl.GL11.*;

import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;

public class main {
    float eyex, eyey, eyez;

    public void start() throws LWJGLException {
        int height = 600;
        int width = 800;
        eyex = 0;
        eyey = 0;
        eyez = 0;
        DisplayMode standard = new DisplayMode(width, height);
        Display.setDisplayMode(standard);
        Display.create();


        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
        glMatrixMode(GL_PROJECTION);
        gluPerspective(90f, (float) width / (float) height, 1f, 10000f);
        glMatrixMode(GL_MODELVIEW);

        while (!Display.isCloseRequested()) {
            glLoadIdentity();
            gluLookAt(eyex, eyey, eyez, 50f, 50f, 50f, 0f, 0f, 1f);
            glClear(GL_COLOR_BUFFER_BIT);
            glClear(GL_DEPTH_BUFFER_BIT);

            glBegin(GL_QUADS);
            glColor3f(1,0,0);
            glVertex3f(0,0,0);
            glVertex3f( 100,0,0);
            glVertex3f( 100, 100,0);
            glVertex3f(0, 100,0);
            glColor3f(0,100,0);
            glVertex3f(0,0,0);
            glVertex3f(0,0, 100);
            glVertex3f(0, 100, 100);
            glVertex3f(0, 100,0);
            glColor3f(0,0,100);
            glVertex3f( 100,0, 100);
            glVertex3f( 100,0,0);
            glVertex3f( 100, 100,0);
            glVertex3f( 100, 100, 100);
            glColor3f(1,1,0);
            glVertex3f(0,0,0);
            glVertex3f( 100,0,0);
            glVertex3f( 100,0, 100);
            glVertex3f(0,0, 100);
            glColor3f(0,1,1);
            glVertex3f(0,0, 100);
            glVertex3f( 100,0, 100);
            glVertex3f( 100, 100, 100);
            glVertex3f(0, 100, 100);
            glColor3f(1,1,1);
            glVertex3f(0, 100, 100);
            glVertex3f(0, 100,0);
            glVertex3f( 100, 100,0);
            glVertex3f( 100, 100, 100);
            glEnd();
            pollInput();
            Display.update();
        }

        Display.destroy();
    }

    void pollInput() {
        if (Mouse.isButtonDown(0)) {
            int x = Mouse.getX();
            int y = Mouse.getY();

            System.out.println("MOUSE DOWN @ X: " + x + " Y: " + y);
        }

        if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
            System.out.println("SPACE KEY IS DOWN");
        }

        if (Keyboard.isKeyDown(Keyboard.KEY_Q)) {
            eyex += 0.1;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
            eyey += 0.1;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_E)) {
            eyez += 0.1;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
            eyex -= 0.1;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
            eyey -= 0.1;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
            eyez -= 0.1;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_R)) {
            eyex = 0;
            eyey = 0;
            eyez = 0;
        }

    }

    public static void main(String[] argv) throws LWJGLException {
        main displayExample = new main();
        displayExample.start();
    }
}
 类似资料:
  • 我目前正在使用LWJGL / OpenGL创建一个2D,自上而下的游戏,但是在绘制实体之后,在使用顶点缓冲区对象渲染实体后,在让它们四处移动的过程中,我遇到了一些问题。这是渲染线程的 run() 方法,以及设置方法: 实体从抽象超类继承这些方法来设置 VBO 并绘制实体(呈现线程中的 drawEntities 方法仅调用该方法,实体更新方法(见下文),而 setUpEntities 调用 setU

  • 3D物理模拟需要访问着色器中相邻顶点的位置和属性以计算顶点的新位置。2D版本可以工作,但无法将解决方案移植到3D。翻转两个3D纹理似乎是正确的,为一个纹理输入x、y和z坐标集,并获取包含相邻点的位置速度加速度数据的vec4s以用于计算每个顶点的新位置和速度。2D版本使用1次带有帧缓冲区的绘图调用将所有生成的gl_FragColors保存到采样器2D。我想使用帧缓冲区对采样器3D做同样的事情。但它看

  • 我试图实现多边形吹扫和重组效果,类似于: http://na.leagueoflegends.com/en/featured/skins/project-2016 https://tkmh.me/ 在这两个例子中,你可以看到它们是如何将顶点从一个3d模型变形/过渡到另一个模型的,从而产生非常酷的效果。我有类似的工作,但我无法理解它们是如何通过速度偏移过渡顶点的(请参考第一个链接,看看粒子如何不简单

  • 文:youyou Node Api 升级 由于 Cocos Creator 在 v2.1 支持了 3D 的特性,所以相应节点的 api 也需要由 2D 升级到支持 3D 的使用。 影响比较大的改动是 rotation 的类型将在之后的版本中从 Number 改为 cc.Quat,如果要像之前那样在 2D 空间方便旋转节点,那么可以使用 angle 属性。相应的 setRotation 和 getR

  • 通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据,如果你有WebGL基础很容易理解顶点索引的概念,如果没有也没有关系,下面会通过一个简单的例子形象说明。 比如绘制一个矩形网格模型,至少需要两个三角形拼接而成,两个三角形,每个三角形有三个顶点,也就是说需要定义6个顶点位置数据。对于矩形网格模型而言,两个三角形有两个顶点位置是重合的

  • 我对整个APEX服务插件是一个新手,但我想知道Salesforce是否对我在APEX服务平台中创建的REST API的Swagger或任何类似的REST描述语言提供了本地支持? 例如: 我希望能够返回swagger json,一个WADL文档,或者这个REST服务(以及我在里面的所有其他REST服务)的东西。有没有人知道我能做到这一点的方法? 提前道谢!