obj文件中v、vt、vn、f这四个参数的含义

自己也没建过3D模型,但在学习中碰到了这类文件,虽然不是很懂,但还是记录一下。
下面就是一个.ojb文件里的内容。

v -0.500000 -0.500000 0.500000 
v 0.500000 -0.500000 0.500000 
v -0.500000 0.500000 0.500000 
v 0.500000 0.500000 0.500000 
v -0.500000 0.500000 -0.500000 
v 0.500000 0.500000 -0.500000 
v -0.500000 -0.500000 -0.500000 
v 0.500000 -0.500000 -0.500000 
vt 0.001992 0.001992 
vt 0.998008 0.001992 
vt 0.001992 0.998008 
vt 0.998008 0.998008 
vt 0.001992 0.001992 
vt 0.998008 0.001992 
vt 0.001992 0.998008 
vt 0.998008 0.998008 
vt 0.001992 0.001992 
vt 0.998008 0.001992 
vt 0.001992 0.998008 
vt 0.998008 0.998008 
vt 0.001992 0.001992 
vt 0.998008 0.001992 
vt 0.001992 0.998008 
vt 0.998008 0.998008 
vt 0.001992 0.001992 
vt 0.998008 0.001992 
vt 0.001992 0.998008 
vt 0.998008 0.998008 
vt 0.998008 0.998008 
vt 0.001992 0.998008 
vt 0.998008 0.001992 
vt 0.001992 0.001992 
vn 0.000000 0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 1.000000 0.000000 
vn 0.000000 1.000000 0.000000 
vn 0.000000 1.000000 0.000000 
vn 0.000000 1.000000 0.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 -1.000000 0.000000 
vn 0.000000 -1.000000 0.000000 
vn 0.000000 -1.000000 0.000000 
vn 0.000000 -1.000000 0.000000 
vn 1.000000 0.000000 0.000000 
vn 1.000000 0.000000 0.000000 
vn 1.000000 0.000000 0.000000 
vn 1.000000 0.000000 0.000000 
vn -1.000000 0.000000 0.000000 
vn -1.000000 0.000000 0.000000 
vn -1.000000 0.000000 0.000000 
vn -1.000000 0.000000 0.000000
f 1/1/1 2/2/2 3/3/3 
f 3/3/3 2/2/2 4/4/4
f 3/13/5 4/14/6 5/15/7 
f 5/15/7 4/14/6 6/16/8
f 5/21/9 6/22/10 7/23/11 
f 7/23/11 6/22/10 8/24/12
f 7/17/13 8/18/14 1/19/15 
f 1/19/15 8/18/14 2/20/16
f 2/5/17 8/6/18 4/7/19 
f 4/7/19 8/6/18 6/8/20
f 7/9/21 1/10/22 5/11/23 
f 5/11/23 1/10/22 3/12/24

该obj得到的模型(立方体)如下:
立方体的三角面片显示
现在来解释各参数的含义:
v: 表示顶点,即组成图的点,如立方体有8个顶点,每个顶点有x,y,z三个值。
vt: 纹理坐标,其值为u, v。纹理应该是指某个面的粗糙程度(我暂且没看出这个变化),那纹理为什么有坐标呢?想象一块可以自由拉伸的布,坐标表示这个布的一角要放在这个位置,这就是纹理坐标。我们知道一个面最少由三个顶点才能构成,如果此时将一块布拉伸到这三个顶点上,则这块布会变成一个三角形。
vn:顶点法向量,其值为x,y,z,你可能好奇为什么顶点有法向量,其实这个法向量是表示顶点的朝向。如果有三个顶点组成一个面,面是有两个朝向,向里或向外,所以可以通过顶点的朝向来确定面的朝向。而且这三个顶点的法向量是一样的。
f:表示一个面,由三个v/vt/vn的索引形式组成。比如obj文件中f 5/15/7 4/14/6 6/16/8 ,表示由第5、第4、第6这三个顶点组成了一个三角平面,平面的纹理由第15、第14、第16这三个纹理坐标形成,这个平面的朝向是第7、第6、第8这三个顶点的法向量求平均值。

在QT使用OpenGL渲染一个obj文件可以通过以下步骤完成: 1. 在QT创建一个OpenGL窗口,可以使用QOpenGLWidget或QGLWidget类。 2. 在OpenGL加载并渲染obj文件需要使用一个库,比如Assimp。 3. 首先安装Assimp库,可以通过以下命令在Ubuntu安装: ``` sudo apt-get install libassimp-dev ``` 4. 在QT添加Assimp库的头文件和库文件路径,可以通过以下方式在.pro文件添加: ``` INCLUDEPATH += /usr/include/assimp LIBS += -L/usr/lib/x86_64-linux-gnu -lassimp ``` 5. 编写OpenGL代码,使用Assimp库加载并渲染obj文件。 下面是一个简单的示例代码: ``` #include <QOpenGLWidget> #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h> class OpenGLWidget : public QOpenGLWidget { public: void initializeGL() { glClearColor(0.0, 0.0, 0.0, 1.0); } void paintGL() { glClear(GL_COLOR_BUFFER_BIT); Assimp::Importer importer; const aiScene *scene = importer.ReadFile("filename.obj", aiProcess_Triangulate | aiProcess_FlipUVs); if (!scene) { qDebug() << "Failed to load obj file"; return; } for (unsigned int i = 0; i < scene->mNumMeshes; i++) { const aiMesh *mesh = scene->mMeshes[i]; glBegin(GL_TRIANGLES); for (unsigned int j = 0; j < mesh->mNumFaces; j++) { const aiFace &face = mesh->mFaces[j]; for (unsigned int k = 0; k < face.mNumIndices; k++) { unsigned int index = face.mIndices[k]; glVertex3fv(&mesh->mVertices[index].x); } } glEnd(); } } }; ``` 这个例子使用Assimp库加载obj文件,并使用OpenGL渲染它。你需要将上述代码集成到QT项目,并将“filename.obj”替换为你想要渲染的obj文件的路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值