opengl obj文件打开失败是什么原因
bool load_obj_file(const char *path, vector<float> &verts, vector<unsigned int> &faces, bool centerize = false, bool normalize = false)
{
FILE *file = fopen(path, "r");
if (file == NULL)
return false;
float minx, miny, minz, maxx, maxy, maxz;
minx = miny = minz = maxx = maxy = maxz = 0.0f;
while (true) {
char lineHeader[128];
int res = fscanf(file, "%s", lineHeader);
if (res == EOF)
break;
if (strcmp(lineHeader, "v") == 0) {
float vx, vy, vz;
fscanf(file, "%f %f %f\n", &vx, &vy, &vz);
verts.push_back(vx);
verts.push_back(vy);
verts.push_back(vz);
minx = min(vx, minx); maxx = max(vx, maxx);
miny = min(vy, miny); maxy = max(vy, maxy);
minz = min(vz, minz); maxz = max(vz, maxz);
}
else if (strcmp(lineHeader, "f") == 0) {
std::string vertex1, vertex2, vertex3;
unsigned int vertexIndex[3];
int matches = fscanf(file, "%d %d %d\n", &vertexIndex[0], &vertexIndex[1], &vertexIndex[2]);
if (matches != 3){
printf("File format error. Please check the file content.\n");
return false;
}
faces.push_back(vertexIndex[0] - 1);
faces.push_back(vertexIndex[1] - 1);
faces.push_back(vertexIndex[2] - 1);
}
else {
char stupidBuffer[1000];
fgets(stupidBuffer, 1000, file);
}
}
if (centerize) {
float cenx = 0.5f * (maxx + minx);
float ceny = 0.5f * (maxy + miny);
float cenz = 0.5f * (maxz + minz);
for (unsigned int i = 0; i < verts.size();) {
verts[i++] -= cenx;
verts[i++] -= ceny;
verts[i++] -= cenz;
}
}
if (normalize) {
float scale = 1.0f / max(0.00001f, max(maxx - minx, max(maxy - miny, maxz - minz)));
for (unsigned int i = 0; i < verts.size();) {
verts[i++] *= scale;
}
}
return true;
}
初始化的一部分if (!load_obj_file(path, _verts, _faces, true, true)) {
printf("Error occured when initilizing the scene.");
return;
}
编译错误:错误 1 error C2143: 语法错误 : 缺少“;”(在“常量”的前面) e:\miniengine\miniengine\miniengine\models\cube.obj 4 1 MiniEngine
错误 2 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int e:\miniengine\miniengine\miniengine\models\cube.obj 4 1 MiniEngine
上一封 下一封« 返回
{
FILE *file = fopen(path, "r");
if (file == NULL)
return false;
float minx, miny, minz, maxx, maxy, maxz;
minx = miny = minz = maxx = maxy = maxz = 0.0f;
while (true) {
char lineHeader[128];
int res = fscanf(file, "%s", lineHeader);
if (res == EOF)
break;
if (strcmp(lineHeader, "v") == 0) {
float vx, vy, vz;
fscanf(file, "%f %f %f\n", &vx, &vy, &vz);
verts.push_back(vx);
verts.push_back(vy);
verts.push_back(vz);
minx = min(vx, minx); maxx = max(vx, maxx);
miny = min(vy, miny); maxy = max(vy, maxy);
minz = min(vz, minz); maxz = max(vz, maxz);
}
else if (strcmp(lineHeader, "f") == 0) {
std::string vertex1, vertex2, vertex3;
unsigned int vertexIndex[3];
int matches = fscanf(file, "%d %d %d\n", &vertexIndex[0], &vertexIndex[1], &vertexIndex[2]);
if (matches != 3){
printf("File format error. Please check the file content.\n");
return false;
}
faces.push_back(vertexIndex[0] - 1);
faces.push_back(vertexIndex[1] - 1);
faces.push_back(vertexIndex[2] - 1);
}
else {
char stupidBuffer[1000];
fgets(stupidBuffer, 1000, file);
}
}
if (centerize) {
float cenx = 0.5f * (maxx + minx);
float ceny = 0.5f * (maxy + miny);
float cenz = 0.5f * (maxz + minz);
for (unsigned int i = 0; i < verts.size();) {
verts[i++] -= cenx;
verts[i++] -= ceny;
verts[i++] -= cenz;
}
}
if (normalize) {
float scale = 1.0f / max(0.00001f, max(maxx - minx, max(maxy - miny, maxz - minz)));
for (unsigned int i = 0; i < verts.size();) {
verts[i++] *= scale;
}
}
return true;
}
初始化的一部分if (!load_obj_file(path, _verts, _faces, true, true)) {
printf("Error occured when initilizing the scene.");
return;
}
编译错误:错误 1 error C2143: 语法错误 : 缺少“;”(在“常量”的前面) e:\miniengine\miniengine\miniengine\models\cube.obj 4 1 MiniEngine
错误 2 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int e:\miniengine\miniengine\miniengine\models\cube.obj 4 1 MiniEngine
上一封 下一封« 返回
...全文
相关推荐
OpenGL 打开 Obj文件(本Demo是将Obj文件放在assets文件夹下)
本应用是通过使用OpenGL ES 将存放在assets中的.obj文件打开,Demo中实现对obj模型的手势操作
OBJ格式导入OpenGL中遇到的问题
首先,确保指定的文件路径是正确的,并且文件位于指定路径下。最后,确保文件的扩展名为.obj,且文件名大小写与代码中的一致。确保在加载OBJ文件时,正确解析并存储每个顶点的法线信息。在渲染时,使用正确的法线信息进行光照计算,并将其传递给OpenGL的顶点着色器或固定功能管线。在加载OBJ文件时,确保正确解析并存储每个顶点的纹理坐标信息。在渲染时,使用正确的纹理坐标与顶点坐标进行插值,以便正确贴图。当尝试加载OBJ文件时,可能会遇到加载失败的情况。在加载OBJ文件时,模型的法线信息对于光照计算和渲染非常重要。
Qt 5.9.6 + OpenGL 加载显示 OBJ 模型的完整实战指南
三维模型可视化是工业软件与组态系统中的常见需求,其核心在于将几何数据高效送入GPU并正确渲染。OpenGL作为跨平台图形API,配合Qt框架可快速构建轻量级模型查看器。本文从OBJ文件解析出发,讲解顶点、法线、纹理坐标的组织与索引重排原理,并基于QOpenGLWidget与VBO/VAO实现数据上传与绘制。针对实际工程中的兼容性问题,例如老版本Qt、低端显卡驱动及Shader版本差异,提供了回退策略与调试技巧。该方案适用于离线模型浏览、设备预览及三维组态等场景。文章结合具体代码展示了相机控制、法线计算及交互
OBJ模型读取并显示
VS2010行编写的OBJ模型读取。
GLWaveLoad:OBJ加载和显示库-开源
一个使用OpenTK简化加载和渲染.OBJ模型的库。


图形处理/算法
