0

だから私はすべての射影の数学と物事を使って可動カメラを実装しました。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();
    }

問題を見つけるにはどこを見ればよいですか? (通常、プログラム全体を通して)

4

1 に答える 1

2

あなたが2つのことについて話していると思うので、あなたの質問は私をやや混乱させます.

ただし、次のように負の値でスケーリングする場合は、前面glScalef(1f, -1f, 1f);反転する必要がありますglFrontFace();

例:

// Render stuff

glPushMatrix();
glFrontFace(GL_CW);

// Render negatively scaled stuff

glFrontFace(GL_CCW);
glPopMatrix();

// Render stuff

注: 私は非推奨のメソッドのみを show に使用しているため、独自のマトリックス スタックを作成した場合は、コードに合わせて例を変更するだけで済みます。

于 2013-10-25T21:29:04.777 に答える