1

我遇到了 setLookAtM 函数的问题。我的目标是在像这样的立方体中创建一个立方体(是的,它是油漆:P):

在此处输入图像描述

所以基本上一切正常......几乎......我有一个较小的立方体,我有一个更大的立方体。但是,有一个问题。我用 -1 到 1 的坐标创建了更大的坐标,现在我想升级它。使用 scale 1.0fi 有这样的东西(内部立方体正在旋转):

在此处输入图像描述

这很好,但是现在......当我尝试缩放更大的立方体(使它看起来像在油漆图中)时,图像变成黑色或白色(我想这是因为“相机”看着白色立方体但仍然我不知道为什么我的内部立方体消失了:/我不明白我做错了什么。这是我的代码:

public void onDrawFrame(GL10 unused) {
    float[] scratch = new float[16];
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5.0f, 0f, 0f, -1.0f, 0f, 1.0f, 0.0f);

    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

    mRoom.mScale = 1.0f;
    Matrix.setIdentityM(mScaleMatrix, 0);
    Matrix.scaleM(mScaleMatrix, 0, mRoom.mScale, mRoom.mScale, mRoom.mScale);

    float[] scaleTempMatrix = new float[16];
    Matrix.multiplyMM(scaleTempMatrix, 0, mMVPMatrix, 0, mScaleMatrix, 0);

    mRoom.draw(scaleTempMatrix);

当我设置例如:

mRoom.mScale = 3.0f;

Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -2.0f, 0f, 0f, 0.0f, 1.0f, 1.0f, 0.0f);

我的相机应该在 (0, 0, -2) 看着 (0,0, -1) 并且它应该在白色立方体内(因为比例是 3.0 所以坐标应该是从 -3 到 3 对吧?)但是我得到的只是一个白色的屏幕,里面没有旋转较小的立方体:/

4

1 回答 1

2

如果您在此代码中的比例是 3 倍,那么您的可见坐标范围实际上将是 [ -1/3 , 1/3 ]。

您正在向后考虑事情,如果您考虑应用缩放操作的顺序可能会有所帮助。现在,您正在缩放对象空间坐标,然后应用视图矩阵,然后进行投影。看起来可能不是那样,但这就是 GL 中矩阵乘法的工作原理;GL 在进行矩阵乘法并且矩阵乘法不可交换时有效地翻转操作数。

我相信这是你真正想要的:

public void onDrawFrame(GL10 unused) {
    float[] scratch = new float[16];
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5.0f, 0f, 0f, -1.0f, 0f, 1.0f, 0.0f);

    mRoom.mScale = 3.0f;
    Matrix.setIdentityM(mScaleMatrix, 0);
    Matrix.scaleM(mScaleMatrix, 0, mRoom.mScale, mRoom.mScale, mRoom.mScale);

    Matrix.multiplyMM(mMVPMatrix, 0, mScaleMatrix, 0, mProjectionMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mMVPMatrix,   0, mViewMatrix,       0);

    mRoom.draw(mMVPMatrix);
于 2014-05-18T19:58:51.000 回答