opengl关于obj文件相关知识

首先看一下obj文件格式:

 obj文件中可以有v(顶点位置)、vt(顶点纹理坐标)、vn(顶点法向量)、f(面)开头的四种类型数据。

 所有的obj文件中都有v型数据。格式如下:

v 0.437500 0.164062 0.765625
v -0.437500 0.164062 0.765625
v 0.500000 0.093750 0.687500

  1. vt(顶点纹理坐标),格式如下:
    vt 0.651583 0.342268
    vt 0.652889 0.355515
    vt 0.641220 0.366408
    vt 0.628246 0.364052
    vt 0.654194 0.368763
    2. vn(顶点法向量坐标),格式如下:
    vn 0.837179 -0.311379 0.449639
    vn 0.878055 0.385575 0.283465
    vn 0.276184 0.130417 0.952215
    vn 0.287141 -0.526486 0.800227
    vn 0.255366 0.316928 0.913425
    3.f(面),格式如下:
    f 6203/4489/4130 1062/4483/4124 6215/4510/4151 3078/4513/4154
    f 5471/2749/2665 3078/4513/4154 6216/4514/4155 710/2752/2668
    f 3078/4513/4154 6215/4510/4151 1067/4512/4153 6216/4514/4155
    f 1006/3940/3718 6008/3937/3734 3079/4515/4156 6218/4516/4157
    f 6008/3937/3734 714/2761/2677 5476/2760/2676 3079/4515/4156
    现一一分析介绍:
1.v(顶点坐标位置):
 可以看到v后面有三个参数,分别代表该顶点的x、y、z三个坐标值。
2.vt(顶点纹理坐标):
 vt后面两个参数,分别代表纹理的U、V值。
3.vn(顶点法向量):
 vn后面三个参数,分别代表法向量的x、y、z值。
对于顶点法向量想说的是:我们向opengl中导入3D模型时,如果obj文件中没有vn,就需要我们手动计算面片的法向量,
否则显示出来的图形可能不正确。如果obj文件中有vn,那么,我们就一个点一个点进行绘制,不需要计算面的法向量。
vn表示的是顶点的法向量,不是面的法向量。
 举个例子:如果绘制的是四角面片(网上太多例子是三角面片了)
VN[0] = (vnSets[firstVertexIndexf])[0];//第一个点的法向量的x
VN[1] = (vnSets[firstVertexIndexf])[1];//第一个点的法向量的y
VN[2] = (vnSets[firstVertexIndexf])[2];//第一个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V1[0], V1[1], V1[2]);

VN[0] = (vnSets[secondVertexIndexf])[0];//第二个点的法向量的x
VN[1] = (vnSets[secondVertexIndexf])[1];//第二个点的法向量的y
VN[2] = (vnSets[secondVertexIndexf])[2];//第二个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V2[0], V2[1], V2[2]);

VN[0] = (vnSets[thirdVertexIndexf])[0];//第三个点的法向量的x
VN[1] = (vnSets[thirdVertexIndexf])[1];//第三个点的法向量的y
VN[2] = (vnSets[thirdVertexIndexf])[2];//第三个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V3[0], V3[1], V3[2]);

VN[0] = (vnSets[fourthVertexIndexf])[0];//第四个点的法向量的x
VN[1] = (vnSets[fourthVertexIndexf])[1];//第四个点的法向量的y
VN[2] = (vnSets[fourthVertexIndexf])[2];//第四个点的法向量的z
glNormal3f(VN[0], VN[1], VN[2]);
glVertex3f(V4[0], V4[1], V4[2]);
这样就可以绘制出四边形了。

4.f(面):
面较为复杂,如果是简单的obj文件,面的格式可以为:
f 47 1 3
f 4 2 48
f 45 3 5
f 6 4 46
复杂的可以为:
f 3643/6900/6406 7305/6826/6332 1602/6797/6303 7332/6880/6386
f 1592/6749/6259 7343/6901/6407 3644/6902/6408 7269/6750/6260
f 7343/6901/6407 1631/6903/6409 7344/6904/6410 3644/6902/6408
f 7269/6750/6260 3644/6902/6408 7345/6905/6411 1595/6753/6263
面是由点构成的。一行有几个空格(n)区分,就有n+1个点。opengl允许绘制多边形,所以一行可以有多个点构成。
每个点又分为3项:顶点位置坐标索引、顶点纹理坐标索引、顶点法向量坐标索引。
注意:这里都是索引。为什么引入索引? --方便查找。
顶点位置坐标索引对应obj文件的v数据;
顶点纹理坐标索引对应obj文件的vt数据;
顶点法向量坐标索引对应obj文件的vn数据;
我们要根据索引一步一步找到obj文件中各个点对应的真实数据。这样才能进行绘制。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qtopengl是一个用于实现跨平台OpenGL应用程序的C++库。在导入3D模型方面,可以使用Qtopengl中的QGLWidget类和OpenGL相关函数进行加载和渲染。 在加载3D模型之前,需要将模型转换为支持的格式,如obj、dae、fbx等。在此可以使用开源的3D建模软件Blender来进行转换,也可以使用其他支持的软件。 加载3D模型时,可以使用OpenGL中的glTranslatef()、glScalef()和glRotatef()函数对模型进行缩放、旋转和平移。然后使用glBegin()和glEnd()函数对模型进行绘制,可以使用三角形和四边形来绘制3D模型。 同时,还可以使用纹理来给模型添加图片或其他视觉效果。在OpenGL中,可以使用glGenTextures()、glBindTexture()和glTexImage2D()等函数来加载和应用纹理。 总的来说,导入3D模型需要先将其转换为支持的格式,然后使用Qtopengl中的QGLWidget类和OpenGL相关的函数进行加载、渲染和绘制。在这个过程中,还可以使用纹理来增强模型的视觉效果。 ### 回答2: qtopengl是一个强大的3D渲染工具,可以导入3D模型并进行渲染。在导入3D模型之前,需要准备好一个3D模型文件,目前比较常用的3D模型文件格式有OBJ、FBX、3DS等。 首先需要在qtopengl中创建一个OpenGL窗口,然后加载3D模型文件,这可以通过使用OpenGL的glLoadModel函数来完成。在加载完成之后,需要设置好3D场景中的参数,例如相机位置、光照等。 在qtopengl中操作3D模型需要用到渲染循环,通常我们可以把渲染部分写在paintGL函数中。在计算好相机位置和光照后,可以用OpenGL的glDraw函数来进行3D模型的渲染。 在渲染过程中需要注意的是,不同的3D模型文件格式可能会有一些差异,例如在OBJ文件中,一个模型可能会包含多个材质和纹理,需要分别进行处理。此外,当3D模型非常大时,可能会导致内存溢出的问题,这时可以使用一些优化技巧来减少内存的使用。 总的来说,qtopengl是一个非常强大的3D渲染工具,可以方便地导入3D模型并进行高效的渲染。对于想要进行3D开发的人来说,掌握qtopengl的技巧是非常重要的。 ### 回答3: 使用QOpenGL导入3D模型,一般需要经历如下步骤: 第一步,需要先对3D模型进行导出。通常,3D模型的导出格式有很多种,比如OBJ、FBX、3DS等等。因此,首先需要根据模型的实际情况选择合适的导出格式。 第二步,引入QOpenGL库。在Qt中,可以通过在.pro文件中加入QT += opengl语句来引入OpenGL库。 第三步,加载模型文件。这需要用到Qt中的QFileDialog类,通过打开文件对话框获取用户选择的3D模型文件路径和名称。 第四步,模型解析。在此步骤中,可能需要使用第三方库,如Assimp、FBX SDK等。根据所选的模型文件格式,解析该模型文件中包含的顶点、纹理、材质、法线等信息。 第五步,绑定和渲染。这一步骤是将解析得到的数据绑定到OpenGL中,并在渲染时进行相关的操作,如顶点缓冲区对象的绑定,着色器程序的编译和链接,材质贴图的绑定等。 最后,需要在OpenGL的渲染循环函数中进行模型的绘制和更新操作,以达到不断刷新画面的效果。 总之,QOpenGL导入3D模型的过程需要较多的技术支持和编程经验,建议在进行相关开发时认真学习相关知识和技术,确保在实现功能的同时也保证开发的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

allein_STR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值