纹理映射结果不正确?

我一直在debugging这个程序几天,但还没有得到任何改善。

我想添加纹理到我的三角形。

我使用左手坐标,我的三角形的顶点是逆时针定义的。

这是我的“obj”文件:

m // mesh vertices 4 0.0 0.0 4.22 4.63 0.0 4.22 0.0 0.0 0.0 4.63 0.0 0.0 texturecoords 4 floor.ppm -0.260944 0.490887 3.619507 0.490887 3.619507 -3.043434 -0.260944 -3.043434 triangles 1 0 3 2 0 2 3 // [vertex idx] [txt idx] 

和我用来做纹理映射的那段代码:

  Triangle *tri = dynamic_cast<Triangle *>(record.obj); // Triangle instance owns a pointer to the mesh it belongs to: mesh_ptr // tri->vertexIndex is the triangle's vertex indices in all vertices, // stored in tri->mesh_prt->verts vec3f A = tri->mesh_ptr->verts[tri->vertexIndex[0]]; vec3f B = tri->mesh_ptr->verts[tri->vertexIndex[1]]; vec3f C = tri->mesh_ptr->verts[tri->vertexIndex[2]]; vec3f P = record.p; // intersect point // texture coordinates, stored in float* (size is 2) float *tA = tri->mesh_ptr->_txts[tri->txtIndex[0]]; float *tB = tri->mesh_ptr->_txts[tri->txtIndex[1]]; float *tC = tri->mesh_ptr->_txts[tri->txtIndex[2]]; float baryA, baryB, baryC; // barycentric coordinates Triangle::barycentric(P, A, B, C, baryA, baryB, baryC); float tP[2]; tP[0] = baryA*tA[0] + baryB*tB[0] + baryC*tC[0]; tP[1] = baryA*tA[1] + baryB*tB[1] + baryC*tC[1]; int tmp_u = tP[0] * tri->mesh_ptr->texture->mWidth; // scale u coord proportional to texture image size int tmp_v = tP[1] * tri->mesh_ptr->texture->mHeight; int tmp_idx = tmp_v * tri->mesh_ptr->texture->mWidth + tmp_u; col.e[0] = tri->mesh_ptr->texture->mRGB[tmp_idx + 0]; col.e[1] = tri->mesh_ptr->texture->mRGB[tmp_idx + 1]; col.e[2] = tri->mesh_ptr->texture->mRGB[tmp_idx + 2]; 

重心()实现

 static inline void barycentric(vec3f P, vec3f A, vec3f B, vec3f C, float &baryA, float &baryB, float &baryC) { vec3f v0 = B - A, v1 = C - A, v2 = P - A; float d00 = dot(v0, v0); float d01 = dot(v0, v1); float d11 = dot(v1, v1); float d20 = dot(v2, v0); float d21 = dot(v2, v1); float denom = d00 * d11 - d01 * d01; baryA = (d11 * d20 - d01 * d21) / denom; baryB = (d00 * d21 - d01 * d20) / denom; baryC = 1.0 - baryA - baryB; return; } 

所以,当我debugging时,我有

 vec3f A is 0.0 0.0 0.0 vec3f B is 4.63 0.0 0.0 vec3f C is 0.0 0.0 4.22 vec3f P is 0.00376689434 0.000000000 0.0710537434 

我认为P接近于A, baryA应该非常接近1.0fbaryB略大于baryB但都接近0.0f

不过,我的barycentric()函数似乎有一些错误,它给出了

 baryA = 0.000813584076 baryB = 0.0168373808 baryC = 0.982349038 

但是我不知道该如何修复我的barycentric()方法。

我不知道它是否与坐标系统的手感和顶点的顺序有关?

即使我改变参数列表的顺序,得到预期的重心坐标,结果图片仍然不正确。

任何人都可以提供一个提示吗?

在这里输入图像说明