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

时间:2019-05-15 10:41:35

标签: c++ opengl wavefront

我正在看现代OpenGL教程,但我不太了解绘制.obj文件的代码。我的意思是效果很好,但是更改显示对象的位置会遇到一些问题。

顶点数组是由glGenVertexArrays()生成的,我认为我应该更改这一行,但是不知道如何。

我使用的代码是

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;
}

1 个答案:

答案 0 :(得分:0)

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

选择缓冲区后,您将需要glDrawElements操作。 另外,您将需要设置着色器,并且矩阵或obj将始终在原点(0.,0。)上呈现。

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