【问题标题】:LWJGL glTranslatef not rendering depthLWJGL glTranslatef 不渲染深度
【发布时间】:2014-09-19 04:30:30
【问题描述】:

我在 3D 空间中渲染一个正方形。当我使用 glTranslatef() 方法并添加 z 坐标时,正方形不再可见。当 z 坐标高于 1 或低于 -1 时,不再显示正方形(我通过将 z 坐标设置为 1 来测试它。如果它没有显示)。

Main.java

import java.util.logging.Level;
import java.util.logging.Logger;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

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

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        initDisplay();
        gameLoop();
        cleanUp();
    }

    public static void initDisplay(){
        try {
            Display.setDisplayMode(new DisplayMode(800, 600));
            Display.setTitle("AWESOMENESS!");
            Display.create();
        } catch (LWJGLException e) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public static void gameLoop(){
        Camera cam = new Camera(70, (float)Display.getWidth() / (float)Display.getHeight(), 0.3f, 1000);


        while(!Display.isCloseRequested()){

            glClear(GL_COLOR_BUFFER_BIT);
            glLoadIdentity();
            cam.useView();

            glPushMatrix();{
                glColor3f(1.0f, 0.5f, 0f);
                //This is the problematic line. When the 3rd param goes above 1 or below -1 the
                //square disappers.
                glTranslatef(0,0,-10);
                glBegin(GL_QUADS);{
                    glVertex3f(0,0,0);
                    glVertex3f(0,1,0);
                    glVertex3f(1,1,0);
                    glVertex3f(1,0,0);
                }
                glEnd();
            }
            glPopMatrix();

            Display.update();
        }
    }

    public static void cleanUp(){
        Display.destroy();
    }

}

Camera.java

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

public class Camera {

    //Position
    private float x;
    private float y;
    private float z;
    //Rotation
    private float rx;
    private float ry;
    private float rz;

    private float fov;
    private float aspect;
    private float near;
    private float far;

    public Camera(float fov, float aspect, float near, float far) {
        x = 0;
        y = 0;
        z = 0;
        rx = 0;
        ry = 0;
        rz = 0;
        this.fov = fov;
        this.aspect = aspect;
        this.near = near;
        this.far = far;
        initProjection();
    }

    private void initProjection(){
        glMatrixMode(GL_PROJECTION_MATRIX);
        glLoadIdentity();
        gluPerspective(fov, aspect, near, far);
        glMatrixMode(GL_MODELVIEW);
    }

    public void useView(){
        glRotatef(rx, 1, 0, 0);
        glRotatef(ry, 0, 1, 0);
        glRotatef(rz, 0, 0, 1);
        glTranslatef(x, y, z);
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }

    public float getZ() {
        return z;
    }

    public float getRx() {
        return rx;
    }

    public float getRy() {
        return ry;
    }

    public float getRz() {
        return rz;
    }

    public float getFov() {
        return fov;
    }

    public float getAspect() {
        return aspect;
    }

    public float getNear() {
        return near;
    }

    public float getFar() {
        return far;
    }

    public void setX(float x) {
        this.x = x;
    }

    public void setY(float y) {
        this.y = y;
    }

    public void setZ(float z) {
        this.z = z;
    }

    public void setRx(float rx) {
        this.rx = rx;
    }

    public void setRy(float ry) {
        this.ry = ry;
    }

    public void setRz(float rz) {
        this.rz = rz;
    }

    public void setFov(float fov) {
        this.fov = fov;
    }

    public void setAspect(float aspect) {
        this.aspect = aspect;
    }

    public void setNear(float near) {
        this.near = near;
    }

    public void setFar(float far) {
        this.far = far;
    }

}

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:
    glMatrixMode(GL_PROJECTION_MATRIX);
    

    应该是:

     glMatrixMode(GL_PROJECTION);
    

    GL_PROJECTION_MATRIX 不渲染第三维。没有关于此问题的进一步文档。

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • @UwePlonus:为什么你会投票支持这不是一个答案?它正确地指出了发布代码中的一个关键问题。
    • @RetoKoradi 如我的评论所述,这只是对本网站的评论。答案应该有更多的文字解释,例如两种模式的区别。
    • @UwePlonus 第一个示例无效,因为常量GL_PROJECTION_MATRIX 不是传递给glMatrixMode 的有效常量。区别在于一个有效,另一个无效。答案很好。
    • @UwePlonus 我相信这将是一个足够的答案,因为我确实回答了这个问题。不幸的是,我无法解释两者之间的区别。我实际上通过反复试验找到了解决方法。我找不到关于此的文档。如果有人可以指导我查看 LWJGL 文档(我不是指 javadoc,我是指实际解释内容的文档),我将不胜感激
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多