Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解现代OpenGL中的代码绘制.obj并设置不同的位置_C++_Opengl_Wavefront - Fatal编程技术网

C++ 理解现代OpenGL中的代码绘制.obj并设置不同的位置

C++ 理解现代OpenGL中的代码绘制.obj并设置不同的位置,c++,opengl,wavefront,C++,Opengl,Wavefront,我正在看现代OpenGL教程,但我不完全理解绘制.obj文件的代码。我的意思是,它工作得很好,但我有一个小问题,改变显示对象的位置 顶点数组是由glgenvertexarray()生成的,我认为有一条线我应该更改,但不知道如何更改 我使用以下代码: Mesh::Mesh(const std::string& fileName) { InitMesh(OBJModel(fileName).ToIndexedModel()); } void Mesh::InitMesh(const

我正在看现代OpenGL教程,但我不完全理解绘制.obj文件的代码。我的意思是,它工作得很好,但我有一个小问题,改变显示对象的位置

顶点数组是由glgenvertexarray()生成的,我认为有一条线我应该更改,但不知道如何更改

我使用以下代码:

Mesh::Mesh(const std::string& fileName)
{
    InitMesh(OBJModel(fileName).ToIndexedModel());
}

void Mesh::InitMesh(const IndexedModel& model)
{
    m_numIndices = model.indices.size();

    glGenVertexArrays(1, &m_vertexArrayObject);
    glBindVertexArray(m_vertexArrayObject);

    glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(model.positions[0]) * model.positions.size(), &model.positions[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[TEXCOORD_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(model.texCoords[0]) * model.texCoords.size(), &model.texCoords[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[NORMAL_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(model.normals[0]) * model.normals.size(), &model.normals[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vertexArrayBuffers[INDEX_VB]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(model.indices[0]) * model.indices.size(), &model.indices[0], GL_STATIC_DRAW);

    glBindVertexArray(0);
}
我的对象是从(0,0,0)位置绘制的,我希望它在Y轴上平移(-1.0f)。我知道如何翻译矩阵,但不知道如何使用.obj进行管理

编辑: 谢谢你的回答

我的vs代码如下所示:

#version 330

uniform mat4 P;
uniform mat4 V;
uniform mat4 M;


layout (location=0) in vec4 vertex;
layout (location=2) in vec2 texCoord; 

out vec2 i_tc;

void main(void) {
    gl_Position=P*V*M*vertex;
    i_tc=texCoord;
}
如果您的问题是“如何在空间中移动obj”(在现代opengl中),则可以使用着色器(模型视图投影)矩阵中的平移矩阵和MVP矩阵来完成。 您的代码本身,只是在gpu上设置要绘制的顶点,但根本不绘制

在选择缓冲区后,您将需要一个GLDraweElements操作。 此外,还需要设置着色器和矩阵,否则obj将始终在原点(0,0.)上渲染

如果有glDraw,则需要显示正在使用的着色器

如果您的问题是“如何在空间中移动obj”(在现代opengl中),则可以使用着色器(模型视图投影)矩阵中的平移矩阵和MVP矩阵来完成。 您的代码本身,只是在gpu上设置要绘制的顶点,但根本不绘制

在选择缓冲区后,您将需要一个GLDraweElements操作。 此外,还需要设置着色器和矩阵,否则obj将始终在原点(0,0.)上渲染


如果有glDraw,则需要显示正在使用的着色器

更改透视是在实际渲染调用中执行的操作,而不是在网格中。顶点着色器代码应包含从顶点属性中的
获取输入并将其指定给
gl\u位置
的代码。在那里应用您的转换,最好通过体现翻译的
mat4
统一的方式。如果所有这些对你来说都是中文的,请发布你的着色器代码(和绘图代码),这样我们可以给出具体的建议。这种设置非常标准:你有三个统一的矩阵,一个用于投影、视图和模型。有关这些矩阵的作用以及它们如何协同工作的讨论,请参见,但简短的要点是,您应该将
M
矩阵的旋转部分设置为单位矩阵,并将其平移部分设置为
(0,-1,0)
现在可以工作了,你们太棒了,非常感谢!波前已经被解析,你的函数只是将这些数据绑定到着色器GPU程序。检查传输M、V和P矩阵的代码是否一致。您需要转换视图矩阵。另外,最好将预乘MVP矩阵传输到共享以提高渲染性能。更改透视图是在实际渲染调用中执行的操作,而不是在网格中。顶点着色器代码应包含从
顶点属性中的
获取输入并将其指定给
gl\u位置
的代码。在那里应用您的转换,最好通过体现翻译的
mat4
统一的方式。如果所有这些对你来说都是中文的,请发布你的着色器代码(和绘图代码),这样我们可以给出具体的建议。这种设置非常标准:你有三个统一的矩阵,一个用于投影、视图和模型。有关这些矩阵的作用以及它们如何协同工作的讨论,请参见,但简短的要点是,您应该将
M
矩阵的旋转部分设置为单位矩阵,并将其平移部分设置为
(0,-1,0)
现在可以工作了,你们太棒了,非常感谢!波前已经被解析,你的函数只是将这些数据绑定到着色器GPU程序。检查传输M、V和P矩阵的代码是否一致。您需要转换视图矩阵。另外,最好将预乘MVP矩阵传输到共享,以提高渲染性能。