Matrix 在Opengl ES 2.0上设置透视投影会使对象消失

Matrix 在Opengl ES 2.0上设置透视投影会使对象消失,matrix,opengl-es-2.0,projection-matrix,Matrix,Opengl Es 2.0,Projection Matrix,我正在使用opengl es 2.0进行一个项目,在设置透视投影时遇到了一些问题 如果我没有设置透视投影,只是将对象到世界矩阵(我相信它也被称为模型矩阵)乘以顶点位置,屏幕上的对象被正确渲染,它们看起来是拉伸的,但据我所知,投影矩阵会解决这个问题。问题是,每当我设置透视矩阵并使用它时,屏幕上的对象就会消失,无论我如何移动它们,它们都不会出现在屏幕上 获取模型视图投影矩阵的计算在CPU中完成,MVP矩阵与实际对象空间顶点数据的最后一次相乘在顶点着色器中完成,这就是为什么我认为获取MVP矩阵的过程中

我正在使用opengl es 2.0进行一个项目,在设置透视投影时遇到了一些问题

如果我没有设置透视投影,只是将对象到世界矩阵(我相信它也被称为模型矩阵)乘以顶点位置,屏幕上的对象被正确渲染,它们看起来是拉伸的,但据我所知,投影矩阵会解决这个问题。问题是,每当我设置透视矩阵并使用它时,屏幕上的对象就会消失,无论我如何移动它们,它们都不会出现在屏幕上

获取模型视图投影矩阵的计算在CPU中完成,MVP矩阵与实际对象空间顶点数据的最后一次相乘在顶点着色器中完成,这就是为什么我认为获取MVP矩阵的过程中可能会出现问题。我已经运行了一系列单元测试,但根据这些测试(以及我对线性代数的基本知识),这些矩阵的计算是正确的,而我整天在互联网上进行的研究目前没有帮助-/

这是我用来计算MVP矩阵的代码:

Matrix4D projection_matrix;
projection_matrix.makePerspective(45.0f, 0.001f, 100.0f, 480.0f/320.0f);

Matrix4D view_matrix;
view_matrix.makeIdentity(); //Should be a real view matrix. TODO.

Matrix4D model_matrix(getWorldMatrix());

Matrix4D mvp_matrix(projection_matrix);
mvp_matrix *= view_matrix;
mvp_matrix *= model_matrix;

mMesh->draw(time, mvp_matrix.getRawData());
我认为这段代码很容易解释,但为了以防万一,那些Matrix4D是4x4矩阵,对它们调用makePerspective/makeIdentity将使该矩阵成为透视矩阵或标识矩阵。Matrix4D对象上的getRawData()调用以列主符号的浮点数组形式返回矩阵数据,而mMesh变量是另一个对象,当调用draw时,它只会将所有顶点和材质数据发送到着色器

makePerspective函数的代码如下所示:

Matrix4D& Matrix4D::makePerspective(const float field_of_view, 
        const float near, const float far, const float aspect_ratio) {
    float size = near * tanf(DEGREES_TO_RADIANS(field_of_view) / 2.0f); 

    return this->makeFrustum(-size, size, -size / aspect_ratio,
             size / aspect_ratio, near, far);
}

Matrix4D& Matrix4D::makeFrustum(const float left, const float right, 
        const float bottom, const float top, const float near, 
        const float far) {
    this->mRawData[0] = 2.0f * near / (right - left);  
    this->mRawData[1] = 0.0f; 
    this->mRawData[2] = 0.0f; 
    this->mRawData[3] = 0.0f;

    this->mRawData[4] = 0.0f; 
    this->mRawData[5] = 2.0f * near / (top - bottom); 
    this->mRawData[6] = 0.0f; 
    this->mRawData[7] =  0.0f;

    this->mRawData[8] = (right + left) / (right - left);
    this->mRawData[9] = (top + bottom) / (top - bottom); 
    this->mRawData[10] = - (far + near) / (far - near); 
    this->mRawData[11] = -1.0f;

    this->mRawData[12] = 0.0f; 
    this->mRawData[13] = 0.0f; 
    this->mRawData[14] = -2.0f * far * near / (far - near); 
    this->mRawData[15] = 0.0f;

    return *this;
}
getWorldMatrix()调用实现了这一点(使用一些相关代码):

最后,顶点着色器大致如下所示:

#version 110

const float c_one = 1.0;
const float c_cero = 0.0;

uniform float time;
uniform mat4 mvp_matrix;

attribute vec3 position;
attribute vec3 normal;
attribute vec2 texture_coordinate;

varying vec2 v_texture_coordinate;

void main()
{   
    gl_Position = mvp_matrix * vec4(position, c_one);
    v_texture_coordinate = texture_coordinate;
}
以防万一,正在渲染的对象在位置(0.0f,0.0f,-3.0f)上渲染,且0.5f比例应用于所有三个轴

我真的不知道会出什么问题,我希望有人能发现我可能错过了什么,任何帮助都将不胜感激。如果我可以在着色器上获得逐顶点结果,调试这将容易得多:-/

作为旁注,我对如何计算视图或摄影机矩阵有疑问,据我所知,它只是一个矩阵,具有摄影机必须进行的反向变换,通过这种变换,我可以理解,如果我想将摄影机向右移动100个单位,我会将其向左移动100个单位,对吗

编辑:只是想提供更多信息,也许有人能帮我。我注意到模型矩阵与上面的代码不正确,主要是因为矩阵顺序,我将其更改为以下内容,现在模型矩阵看起来不错:

const Matrix4D& getWorldMatrix() {
    return mWorldMatrix = 
            getScaleMatrix() * getRotationMatrix() * getTranslationMatrix();
}
尽管如此,还是没有运气。根据我的测试数据得出的矩阵如下:

Projection matrix:
[1.609506,0.000000,0.000000,0.000000]
[0.000000,2.414258,0.000000,0.000000]
[0.000000,0.000000,-1.000020,-0.002000]
[0.000000,0.000000,-1.000000,0.000000]



Model matrix:
[0.500000,0.000000,0.000000,0.000000]
[0.000000,0.500000,0.000000,0.000000]
[0.000000,0.000000,0.500000,-3.000000]
[0.000000,0.000000,0.000000,1.000000]



MVP matrix:
[0.804753,0.000000,0.000000,0.000000]
[0.000000,1.207129,0.000000,0.000000]
[0.000000,0.000000,2.499990,-0.001000]
[0.000000,0.000000,-1.000000,0.000000]

我用来测试这一切的网格是一个简单的立方体,在每个轴上从1.0f到-1.0f,以原点为中心。据我所知,这将使顶点最接近z轴上-2.0f位置的近极限(0.0001f),因此立方体位于摄影机前面,并带有视锥台。有人给我线索吗?

所以我终于解决了这个问题,结果是MVP矩阵计算的矩阵顺序是向后的,所以我的所有顶点都不在视图体积内。请详细说明?什么是对的,什么是错的。谢谢我还建议使用
mvp\u matrix=proj\u mat*view\u mat*model\u mat而不是
mvp_矩阵*=视图_矩阵;mvp_矩阵*=模型_矩阵所以我最终解决了这个问题,结果是MVP矩阵计算的矩阵顺序是向后的,所以我所有的顶点都不在视图体积内。请详细说明?什么是对的,什么是错的。谢谢我还建议使用
mvp\u matrix=proj\u mat*view\u mat*model\u mat而不是
mvp_矩阵*=视图_矩阵;mvp_矩阵*=模型_矩阵
Projection matrix:
[1.609506,0.000000,0.000000,0.000000]
[0.000000,2.414258,0.000000,0.000000]
[0.000000,0.000000,-1.000020,-0.002000]
[0.000000,0.000000,-1.000000,0.000000]



Model matrix:
[0.500000,0.000000,0.000000,0.000000]
[0.000000,0.500000,0.000000,0.000000]
[0.000000,0.000000,0.500000,-3.000000]
[0.000000,0.000000,0.000000,1.000000]



MVP matrix:
[0.804753,0.000000,0.000000,0.000000]
[0.000000,1.207129,0.000000,0.000000]
[0.000000,0.000000,2.499990,-0.001000]
[0.000000,0.000000,-1.000000,0.000000]