**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
6天前关闭
截至4天前,社区正在审查是否重新开放此问题。
Improve this question
我最近尝试在我的OpenGL应用程序中导入一个网格时遇到了一个问题。网格导入成功,但是在渲染时它看起来完全变形了。在我看来,网格的顶点位置没有正确加载。下面是问题的图像。**注意:**这里导入的.obj是Blender的默认猴子网格。可以看出,网格的 * 一般轮廓 * 保持不变,但是,它完全偏离了目标。
我不能在这里问最好的问题,因为我似乎不能确定代码在哪一点失败。没有构建或运行时错误。然而,我最好的猜测是代码在加载网格时失败。下面的代码是加载器函数。
bool Loader::LoadObject(
std::string objectFP,
std::vector<glm::vec3>& VBD,
std::vector<glm::vec2>& UVBD,
std::vector<glm::vec3>& NBD,
std::vector<unsigned int>& IBD
)
{
Helpers::Log(LOG, "Loading object (" + objectFP + ")...");
std::vector<glm::vec3> VertexData;
std::vector<glm::vec2> UVData;
std::vector<glm::vec3> NormalData;
FILE* file = fopen(objectFP.c_str(), "r");
if (file == 0)
{
Helpers::Error(ERR, L"Failed to load object.");
return false;
}
else
{
while (true)
{
char lineHeader[128] = { 0 };
int res = fscanf(file, "%s", lineHeader);
/* RUN CHECKS */
// End of File (EOF)
if (res == EOF)
{
break;
}
else
{
if (res <= 0)
{
Helpers::Error(ERR, L"(RES) Failed to load object.");
break;
}
else
{
if (strcmp(lineHeader, "v") == 0)
{
glm::vec3 vertex = glm::vec3(0.0f, 0.0f, 0.0f);
// Return value is not needed here, just to get rid of the warning
int out = fscanf(file, "%f %f %f\n", &vertex.x, &vertex.y, &vertex.z);
VertexData.push_back(vertex);
}
else if (strcmp(lineHeader, "vt") == 0)
{
glm::vec2 uv = glm::vec2(0.0f, 0.0f);
int out = fscanf(file, "%f %f\n", &uv.x, &uv.y);
UVData.push_back(uv);
}
else if (strcmp(lineHeader, "vn") == 0)
{
glm::vec3 normal = glm::vec3(0.0f, 0.0f, 0.0f);
int out = fscanf(file, "%f %f %f\n", &normal.x, &normal.y, &normal.z);
NormalData.push_back(normal);
}
else
{
char fillBuffer[1000];
fgets(fillBuffer, 100, file);
}
VBD.reserve(VertexData.size());
UVBD.reserve(UVData.size());
NBD.reserve(NormalData.size());
for (unsigned int i = 0; i < VertexData.size(); i++)
{
VBD.push_back(VertexData[i]);
}
for (unsigned int i = 0; i < UVData.size(); i++)
{
UVBD.push_back(UVData[i]);
}
for (unsigned int i = 0; i < NormalData.size(); i++)
{
NBD.push_back(NormalData[i]);
}
}
}
}
ComputeIndexBuffer(VBD, IBD);
fclose(file);
return true;
}
}
如果这是不是的问题。源代码是公开的here。
着色器也可能有问题。
1条答案
按热度按时间ippsafx71#
我从你的仓库检查了你的
monkey.obj
,正如我所怀疑的,你的网格没有三角化。当从blender导出时。选中下面所示的Triangulated Mesh
框,将你的网格从多边形转换为三角形,因为你在导入器中将面解释为三角形。在
ComputeIndexBuffer()
函数中:你是假设那面孔是三角形,while
monkey.obj
文件contains mainly quads and therefore the incorrect rendering.为处理n-gons,你必须改进你的进口商或诉诸使用专用进口商象assimp
编辑:为了进一步澄清,我将显示您的'monkey.obj'和三角形的行:
在下面的行中:
这是你的
monkey.obj
的最后一条线,一个面被定义(f
在线的开始)有4个顶点(即一个四边形),每个顶点包含有关位置/uv坐标/法线的信息;而三角化的一个将具有如下定义的所有面:正如你所看到的,有三个
/
组,因此有三个顶点,因此有一个triangle
。