【问题标题】:How do faces in .obj work?.obj 中的面孔如何工作?
【发布时间】:2011-05-18 17:49:21
【问题描述】:

在解析带有顶点和顶点面的 .obj 文件时,很容易将顶点传递给着色器并使用顶点面使用 glDrawElements。

在解析具有顶点和纹理坐标的 .obj 文件时,会出现另一种类型的面:纹理坐标面。

在显示纹理时,除了加载图像、绑定它们并将纹理坐标传递给解析器之外,如何使用纹理坐标面? 它们与顶点面不同,我认为纹理坐标面在显示纹理时是有目的的?

问候尼古拉斯

【问题讨论】:

    标签: iphone opengl-es textures .obj


    【解决方案1】:

    不确定您在问什么,但如果我理解正确,您想知道如何存储纹理坐标的数据以渲染带纹理的 3d 对象。如果是这样,则以交错格式存储顶点法线纹理坐标数据,如下所示:

    vertexX vertexY vertexZ normalX normalY normalZ textureX textureY textureZ
    

    一旦你有了这些数组,你就可以创建指向数组不同部分的指针,并呈现如下:

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
    glVertexPointer(3, GL_FLOAT, sizeof(vertexArray[0])*9, &vertexArray[0]);
    glNormalPointer(3, GL_FLOAT, sizeof(vertexArray[0])*9, &vertexArray[3]);
    glTexCoordPointer(GL_FLOAT, sizeof(vertexArray[0])*9, &vertexArray[6]);
    
    glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, &indices[0]);
    

    至少我是这样做的。可能有更好的方法,如果有,我很高兴知道。

    【讨论】:

    • 嗨。首先,我的问题是关于 Opengl ES 2。抱歉不准确。但我真正想知道的是索引部分,.obj 文件中有 3 种类型的索引。顶点面、纹理坐标面和法线面。为了能够正确映射纹理,我相信我也必须使用 Texture-coordinates-faces。
    • 是的,这是正确的。如果在初始化对象时映射顶点纹理坐标,则在其上放置纹理时它会正确显示。如果您以前曾经使用过 3D 动画包,它们有一种叫做纹理映射的东西。它基本上告诉每个顶点对应于加载到这些面上的图像在 UV 坐标(0 到 1)中的哪个位置。如果您在 3d 包中对对象进行纹理映射,然后将其导出为 obj 文件,则纹理坐标将确保您的图像被放入正确的位置。
    猜你喜欢
    • 2021-04-06
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多