tuomasiyyq 2016-06-02 05:28 采纳率: 33.3%
浏览 2061

OpenGL导入3D模型,为什么显示的都是2D的,怎样才能显示3D的?

图片说明
如图所示,我用OpenGL打开一个3D模型,为什么都显示的是这样的2D平面图,怎样才能显示3D效果,代码如下:
#include"obj.h"
#include
#include
man obj;
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BITS);
obj.Man_View();
}
void myInit()
{
glClearColor(1.0, 1.0, 1.0, 0.0);

glColor3f(0.5, 0.5, 0.5);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, 64 / 48.0, 2.0, 4.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);

}
void main(int argc, char ** argv)
{
obj.In_File("man.obj");
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB);
glutInitWindowSize(640.0, 480.0);
glutInitWindowPosition(0.0, 0.0);
glutCreateWindow("man");
glutDisplayFunc(myDisplay);
myInit();
glutMainLoop();

}
#include"obj.h"
#include
#include
#include
man::man()
{}
man::~man()
{}
void man::In_File(char * FileName)
{
std::fstream in(FileName);
char buffer[1024];
while (in.getline(buffer, 1024))
{
if (buffer[0] == 'v')
{
if (buffer[1] == 't')
{
Vte V1;
sscanf_s(buffer, "vt %lf %lf", &V1.u, &V1.v);
Vt.push_back(V1);
}
else
{
if (buffer[1] == 'n')
{
Normal n;
sscanf_s(buffer, "vn %lf %lf %lf", &n.x, &n.y, &n.z);
Nor.push_back(n);
}
else
{
Vertex V2;
sscanf_s(buffer, "v %lf %lf %lf", &V2.x, &V2.y, &V2.z);
Ve.push_back(V2);
}
}
}
if (buffer[0] == 'f')
{
FaIndex F1 = { 0 };
VtIndex Vt1 = { 0 };
VnIndex Vn1 = { 0 };
sscanf_s(buffer, "f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d", &F1.a, &Vt1.a, &Vn1.a, &F1.b, &Vt1.b, &Vn1.b, &F1.c, &Vt1.c, &Vn1.c, &F1.d, &Vt1.d, &Vn1.d);
VtI.push_back(Vt1);
VnI.push_back(Vn1);
FaI.push_back(F1);
}

}

}
void man::Man_View()
{
for (unsigned int i = 0; i < FaI.size(); i++)
{
if (FaI[i].d == 0)
{
glBegin(GL_TRIANGLES);
Vertex v1 = Ve[FaI[i].a - 1];
Vertex v2 = Ve[FaI[i].b - 1];
Vertex v3 = Ve[FaI[i].c - 1];
Normal n1 = Nor[VnI[i].a - 1];
Normal n2 = Nor[VnI[i].b - 1];
Normal n3 = Nor[VnI[i].c - 1];
Vte vte1 = Vt[VtI[i].a - 1];
Vte vte2 = Vt[VtI[i].b - 1];
Vte vte3 = Vt[VtI[i].c - 1];
glNormal3b(n1.x, n1.y, n1.z);
glTexCoord2d(vte1.u, vte1.v);
glVertex3d(v1.x, v1.y, v1.z);
glNormal3b(n2.x, n2.y, n2.z);
glTexCoord2d(vte2.u, vte2.v);
glVertex3d(v2.x, v2.y, v2.z);
glNormal3b(n3.x, n3.y, n3.z);
glTexCoord2d(vte3.u, vte3.v);
glVertex3d(v3.x, v3.y, v3.z);
glEnd();
}
else
{
glBegin(GL_POLYGON);
Vertex v1 = Ve[FaI[i].a - 1];
Vertex v2 = Ve[FaI[i].b - 1];
Vertex v3 = Ve[FaI[i].c - 1];
Vertex v4 = Ve[FaI[i].d - 1];
Normal n1 = Nor[VnI[i].a - 1];
Normal n2 = Nor[VnI[i].b - 1];
Normal n3 = Nor[VnI[i].c - 1];
Normal n4 = Nor[VnI[i].d - 1];
Vte vte1 = Vt[VtI[i].a - 1];
Vte vte2 = Vt[VtI[i].b - 1];
Vte vte3 = Vt[VtI[i].c - 1];
Vte vte4 = Vt[VtI[i].d - 1];
glNormal3b(n1.x, n1.y, n1.z);
glTexCoord2d(vte1.u, vte1.v);
glVertex3d(v1.x, v1.y, v1.z);
glNormal3b(n2.x, n2.y, n2.z);
glTexCoord2d(vte2.u, vte2.v);
glVertex3d(v2.x, v2.y, v2.z);
glNormal3b(n3.x, n3.y, n3.z);
glTexCoord2d(vte3.u, vte3.v);
glVertex3d(v3.x, v3.y, v3.z);
glNormal3b(n4.x, n4.y, n4.z);
glTexCoord2d(vte4.u, vte4.v);
glVertex3d(v4.x, v4.y, v4.z);
glEnd();
}
}
glFlush();
}
#ifndef OBJ_H
#define OBJ_H
#include
typedef struct
{
double x, y, z;
}Vertex, Normal;
struct Vte
{
double u, v;
};
typedef struct
{
int a, b, c, d;
}FaIndex, VtIndex, VnIndex;

class man
{
public:
man();
~man();
void In_File(char *);
void Man_View();

private:
std::vector Ve;
std::vector Nor;
std::vector Vt;
std::vector FaI;
std::vector VtI;
std::vector VnI;

};
#endif
求OpenGL高手解答。

  • 写回答

2条回答

  • 阿卡阿卡 2016-08-05 00:42
    关注

    开启不填充,glPolygonMode(GL_FONT, GL_LINE);

    评论

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗