【问题标题】:openGL: cant move along x or y axis and negative scaling culls the wrong facesopenGL:无法沿 x 或 y 轴移动,负缩放剔除错误的面
【发布时间】:2013-10-26 05:29:04
【问题描述】:

所以我已经使用所有投影数学和东西实现了一个可移动的相机。我有一些输入条件,当我点击 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();
    }

我应该在哪里寻找问题? (一般贯穿整个程序)

【问题讨论】:

  • 为什么要按负数缩放?如果要使其更小,请使用 0 的数字。
  • 这不是重点,它应该只是翻转而不是奇怪地剔除,我的主要问题是在 x 和 y 上的移动。
  • 该代码似乎没问题,我假设在您未发布的部分代码的渲染中考虑了 pos。它是某种全局变量或成员。向前和向上一样吗? normalize() 对向量进行归一化并返回它对我来说听起来很奇怪。确保它做正确的事情(通常有两种方法来规范化向量: normalize 和 normalizeSelf )
  • 我的 normalize() 代码只是简单地获取向量的每个部分,将其除以自身并返回结果向量。
  • @SamWalls 这就是重点。按负值缩放将改变哪个面是背面,这就是剔除所使用的。

标签: java opengl 3d


【解决方案1】:

你的问题让我有点困惑,因为我认为你在谈论两件事。

但是当您使用像 glScalef(1f, -1f, 1f); 这样的负值进行缩放时,您需要使用 glFrontFace(); 反转 front face

例子:

// Render stuff

glPushMatrix();
glFrontFace(GL_CW);

// Render negatively scaled stuff

glFrontFace(GL_CCW);
glPopMatrix();

// Render stuff

注意:我只使用不推荐使用的方法进行显示,所以如果您创建了自己的矩阵堆栈,那么您可以简单地更改我的示例以适合您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多