OpenGL ES 2.0 setLookAtM

时间:2014-05-18 19:24:01

标签: android opengl-es glulookat

我有,setLookAtM函数有问题。我的目标是在多维数据集中创建一个像这样的立方体(是的,它的油漆:P):

enter image description here

所以基本上所有东西都有效... almoust ...我有一个较小的立方体,我有一个更大的立方体。 但是,有一个问题。我用-1到1的coords创建了更大的一个,现在我想升级它。随着比例1.0f我有类似的东西(内部立方体旋转):

enter image description here

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

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之间) ?)但我得到的只是一个白色屏幕,没有较小的立方体在里面旋转:/

1 个答案:

答案 0 :(得分: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);