我试图在OpenGL 2.1中使用GLU和GLUT原语(如gluCylinder,glutSolidCylinder等)绘制类似的内容。
基本上它是一个实心圆柱体,中间有一个洞。到目前为止,我无法实现它。
我还尝试将Blender中的wavefront obj导入到我的C ++程序中,但我得到的就是这个。
glBegin(GL_TRIANGLES);
for(int i = 0; i < wheel->faces.size(); i++) {
int nx = atoi(wheel->faces.at(i).at(0).substr(wheel->faces.at(i).at(0).find_last_of('/') + 1).c_str()) - 1;
int ny = atoi(wheel->faces.at(i).at(1).substr(wheel->faces.at(i).at(1).find_last_of('/') + 1).c_str()) - 1;
int nz = atoi(wheel->faces.at(i).at(2).substr(wheel->faces.at(i).at(2).find_last_of('/') + 1).c_str()) - 1;
int vx = atoi(wheel->faces.at(i).at(0).substr(0, wheel->faces.at(i).at(0).find_first_of('/')).c_str()) - 1;
int vy = atoi(wheel->faces.at(i).at(1).substr(0, wheel->faces.at(i).at(1).find_first_of('/')).c_str()) - 1;
int vz = atoi(wheel->faces.at(i).at(2).substr(0, wheel->faces.at(i).at(2).find_first_of('/')).c_str()) - 1;
glNormal3f(wheel->normals.at(nx).x, wheel->normals.at(ny).y, wheel->normals.at(nz).z);
glVertex3f(wheel->vertices.at(vx).x, wheel->vertices.at(vy).y, wheel->vertices.at(vz).z);
}
glEnd();
解析应该是正确的,我逐行检查它。我想这是我试图绘制它的错误方法。
但是我不想使用obj,因为我的绘图方式使得动画变得很慢(我对OpenGL来说相当新)。我也不想使用OpenGL 3+。
有什么建议吗?
答案 0 :(得分:1)
在你的代码中,你用一个面绘制一个点,但是这里的面(三角形)应该有三个点。
您可以尝试以下代码:
glBegin(GL_TRIANGLES);
for(int i = 0; i < wheel->faces.size(); i++) {
int v0 = atoi(wheel->faces.at(i).at(0).substr(0, wheel->faces.at(i).at(0).find_first_of('/')).c_str()) - 1;
int v1 = atoi(wheel->faces.at(i).at(1).substr(0, wheel->faces.at(i).at(1).find_first_of('/')).c_str()) - 1;
int v2 = atoi(wheel->faces.at(i).at(2).substr(0, wheel->faces.at(i).at(2).find_first_of('/')).c_str()) - 1;
glVertex3f(wheel->vertices.at(v0).x, wheel->vertices.at(v0).y, wheel->vertices.at(v0).z);
glVertex3f(wheel->vertices.at(v1).x, wheel->vertices.at(v1).y, wheel->vertices.at(v1).z);
glVertex3f(wheel->vertices.at(v2).x, wheel->vertices.at(v2).y, wheel->vertices.at(v2).z);
}
glEnd();
我删除了正常部分,因为我认为你现在不需要它。您可以稍后再添加。
<强> EDTIED:强>
这似乎更好:
glBegin(GL_TRIANGLES);
for(int i = 0; i < wheel->faces.size(); i++)
for (int j = 0; j < 3; j++)
{
int v_id = atoi(wheel->faces.at(i).at(j).substr(0, wheel->faces.at(i).at(j).find_first_of('/')).c_str()) - 1;
glVertex3f(wheel->vertices.at(v_id).x, wheel->vertices.at(v_id).y, wheel->vertices.at(v_id).z);
}
glEnd();
答案 1 :(得分:1)
找到我自己的this小型库,用于打开obj文件。
使用下一个代码绘制加载的网格物体:
glBegin(GL_TRIANGLES);
for (size_t f = 0; f < shapes[0].mesh.indices.size(); f++) {
glVertex3f(shapes[0].mesh.positions[3*f+0],
shapes[0].mesh.positions[3*f+1],
shapes[0].mesh.positions[3*f+2]);
}
glEnd();
加载网格:
std::vector<tinyobj::shape_t> shapes;
int loadMesh(const char *file) {
const char* basepath = NULL;
std::string err = tinyobj::LoadObj(shapes, file, basepath);
if (!err.empty()) {
std::cerr << err << std::endl;
return 0;
}
std::cout << "# of shapes : " << shapes.size() << std::endl;
return 1;
}