openGL:无法沿x或y轴移动,负缩放可以剔除错误的面

时间:2013-10-25 14:05:17

标签: java opengl 3d

因此,我使用所有投影数学和事物实现了可移动相机。我有一些输入条件,当我点击A或D时我想分别向左和向右移动,但我不能这样做,相机只在Z轴上移动。不仅如此,当我在任何轴上按负数进行缩放时,我正在渲染的立方体被反转并且很奇怪,正面被剔除而不是我不想看到的那些。这个问题可能与我的四元数,矩阵或向量类无关,因为我从github复制它们(以及跟随它们连接的youtube系列)。

向左或向右移动我使用:

public void input(){
        float movAmt = (float)(10 * Time.getDelta());
        float rotAmt = (float)(100 * Time.getDelta());

        if(Input.getKey(Input.KEY_W)){
            move(getForward(), movAmt);
        }
        if(Input.getKey(Input.KEY_S)){
            move(getForward(), -movAmt);
        }
        if(Input.getKey(Input.KEY_A)){
            move(getLeft(), movAmt);
        }
        if(Input.getKey(Input.KEY_D)){
            move(getRight(), movAmt);
        }

        if(Input.getKey(Input.KEY_UP)){
            rotateX(-rotAmt);
        }
        if(Input.getKey(Input.KEY_DOWN)){
            rotateX(rotAmt);
        }
        if(Input.getKey(Input.KEY_LEFT)){
            rotateY(-rotAmt);
        }
        if(Input.getKey(Input.KEY_RIGHT)){
            rotateY(rotAmt);
        }
    }

    public void move(Vector3f dir, float amt){
        pos = pos.add(dir.mult(amt));
    }

    public void rotateY(float angle){
        Vector3f Haxis = yAxis.cross(forward);
        Haxis.normalize();

        forward.rotate(angle, yAxis);
        forward.normalize();

        up = forward.cross(Haxis);
        up.normalize();
    }

    public void rotateX(float angle){
        Vector3f Haxis = yAxis.cross(forward);
        Haxis.normalize();

        forward.rotate(angle, Haxis);
        forward.normalize();

        up = forward.cross(Haxis);
        up.normalize();
    }

    public Vector3f getLeft(){
        return forward.cross(up).normalize();
    }

    public Vector3f getRight(){
        return up.cross(forward).normalize();
    }

我应该在哪里找到问题? (一般在整个计划中)

1 个答案:

答案 0 :(得分:2)

你的问题对我来说有点混乱,因为我认为你在谈论两件事。

但是当您使用glScalef(1f, -1f, 1f);之类的负值进行缩放时,则需要使用glFrontFace();

反转front face

示例:

// Render stuff

glPushMatrix();
glFrontFace(GL_CW);

// Render negatively scaled stuff

glFrontFace(GL_CCW);
glPopMatrix();

// Render stuff

注意:我只使用了已弃用的show方法,所以如果你已经创建了自己的矩阵堆栈,那么你只需更改我的示例以适合你的代码。