Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用透视投影矩阵?_Java_Opengl_Lwjgl - Fatal编程技术网

Java 如何使用透视投影矩阵?

Java 如何使用透视投影矩阵?,java,opengl,lwjgl,Java,Opengl,Lwjgl,我写了这个程序,但是我想让正方形随着距离的增加而改变大小 package com.ncom.src; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GL11; import static org.lwjgl.util.glu.GLU.*; import static org.lwjgl.

我写了这个程序,但是我想让正方形随着距离的增加而改变大小

package com.ncom.src;

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

import static org.lwjgl.opengl.GL11.*;

public class Main {
    public void start() {
        float y = 0;
        try {
            Display.setDisplayMode(new DisplayMode(800,600));
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }
        while (!Display.isCloseRequested()) {
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(0, 800, 600, 0, 500000000, -500000000);
            glMatrixMode(GL_MODELVIEW);
            glClear(GL_COLOR_BUFFER_BIT);
            glBegin(GL_QUADS);
                glVertex3f(350, 250, y);
                glVertex3f(350, 270, y);
                glVertex3f(370, 270, y);
                glVertex3f(370, 250, y);
            glEnd();
            Display.update();
            y -= 20;
        }

        Display.destroy();
        System.exit(0);
    }
    public static void main(String[] argv) {
        Main quadExample = new Main();
        quadExample.start();
    }
 }

如果你想看到一个透视图,那么我会从使用透视投影开始

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        near = 1; // near should be chosen as far into the scene as possible
        far  = 100;
        fov  = 1; // 1 gives you a 90° field of view. It's tan(fov_angle)/2.
        glFrustum(-aspect*near*fov, aspect*near*fov, -fov, fov, near, far);
代码
glOrtho(0800600000,-500000000)用于正交视图,请尝试使用GLU.glupperspective()。例如:

GL11.glMatrixMode(GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(field_of_vision, Display.getWidth()/Display.getHeight(), zNear, zFar);
GL11.glMatrixMode(GL_MODELVIEW);
GL11.glLoadIdentity();

不,我不在乎数学,只是我看的地方都没有实际的代码。我如何编程一个正方形,使其在深度上绘制,或者在透视图中“不在屏幕上”绘制?@Dr\N:好吧,通过理解数学。编程是将数学符号转换为编程语言源代码的过程。从“代码示例”中学习不会教你有趣的部分。特别是对于图形,一行简短的数学符号可能会扩展成一个充满代码的屏幕。@datenwolf:你能给我一个开始学习的地方吗?我真的不知道去哪里look@Dr_N:首先是Nicol Bolas的一套教程,其中还包括一些数学知识。我强烈建议你买一本线性代数的本科教材。在我学习的时候,我推荐了查尔斯河媒体公司的埃里克·伦吉尔的《3D游戏编程数学与计算机图形学》一书。至于在线资源,有一些关于数学的有价值的材料,除了许多高级主题由不同的研究小组(如alice.loria.fr)和游戏工作室(Valve software发布了很多)在线发布之外。@Dr_N:当你阅读一些研究论文时,也总是遵循参考文献。这就像挖掘一座金矿,只会变得更富有。请注意,我提到的那本书不是关于线性代数的。我建议把它作为补充材料。对于线性代数来说,进入本科数学部分,远离计算机科学文献!对于那些对此感到疑惑的人。对于那些喜欢通过scratch学习的人来说,它非常有用。