马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、步伐功能计划
在步伐中读取带纹理的obj文件,载入相应的纹理图片文件,将带纹理的模子表如今步伐窗口中。实现带纹理的OBJ文件读取与表现功能,具体计划如下:
OBJ文件分析与数据存储
通过实现TriMesh类中的readObj函数,分析OBJ文件中的极点、法线、UV纹理坐标等信息,将其存储在指定的数据布局中:
- vertex_positions:存储极点多少坐标。
- vertex_normals:存储极点法线,用于光照盘算。
- vertex_textures:存储UV纹理坐标,用于纹理映射。
- faces:存储面片极点的索引信息,用于界说多少形状。
- normal_index和texture_index:分别存储面片极点对应的法线索引和纹理坐标索引。
别的,由于OBJ文件不包罗极点颜色数据,本实行利用极点法线的数值作为颜色数据举行渲染。
数据构造与存储逻辑美满
通过补全storeFacesPoints函数,进一步美满面片极点的索引分析与数据存储过程:
- 遍历面片数据,按极点、法线、UV坐标的索引构造极点信息。
- 确保全部多少数据、法线数据和UV数据逐一对应,以便后续渲染时准确应用纹理。
纹理加载与表现
在main.cpp文件中修改init函数,通过以下步调实现带纹理模子的加载与表现:
- 加载纹理图片文件并绑定到模子的UV坐标上。
- 根据模子的极点、法线、纹理坐标等数据渲染模子。
- 表现玩偶和桌子模子,通过调解它们的位置与比例,天生公道的场景布局。
实现结果
实现了多模子、多纹理的加载和表现功能。步伐窗口中,带有纹理的玩偶模子和桌子模子准确表现,纹理映射结果清楚且无失真。
二、步伐代码实现
补全TriMesh.cpp中的storeFacesPoints函数
通过补全storeFacesPoints函数,根据读取的模子数据,将三角面片的极点属性(包罗极点位置、法线、颜色、纹理等)整理成得当转达给GPU的数据格式,为后续的渲染做预备。
极点数据分析与存储(根据三角面片的索引将属性数据构造到GPU须要的格式):遍历每个三角面片的数据,根据极点的索引将极点属性依次存入对应的容器(points、colors、normals、textures)。每个三角面片的极点属性都要按照极点索引依次写入。要注意的是:
- faces:存储三角形面片的极点索引。
- color_index:存储面片极点的颜色索引。
- normal_index:存储面片极点法线的索引。
- texture_index:存储面片极点纹理坐标的索引。
补全TriMesh.cpp中的generateDisk函数和generateCone函数
generateDisk 函数天生圆盘,天生一个圆盘的网格,包罗底面和相应的三角面片。generateCone 函数天生圆锥,天生一个圆锥体的网格,包罗底面和圆锥侧面。两个函数分别用来天生圆盘和圆锥体(同实行4.1),依赖于三角形扇形的方式来毗连底面和顶部(尖端)的极点,天生相应的三角面片。
- 天生极点:利用循环盘算每个切片的界限点(极点坐标 x, y, z),此中 z 始终为 0(在 xy 平面上),并根据该极点的法向量(法向量始终为 (0, 0, 1))添加颜色(这里简化为与法向量类似的颜色)。在循环竣过后,添加一个圆盘的中央点(极点坐标为 (0, 0, 0))。
- 天生三角面片:利用三角形扇形的方式将每个切片毗连起来,形成三角面片,通过 faces.push_back() 存储每个三角形的三个极点索引。为每个极点天生相应的纹理坐标,并存储索引。
- 法向量和颜色设置:通过 normal_index 和 color_index 将每个三角面片的极点与法向量和颜色的索引关联起来。
- 天生底部极点:利用循环盘算圆锥底部的每个极点坐标(x, y, z),此中 z 始终为 0。根据每个极点位置天生法向量(平面上每个极点的法向量为 (x, y, 0) 的归一化向量),并天生颜色(与法向量类似)。
- 添加圆锥的极点:圆锥顶端添加一个极点,坐标为 (0, 0, height),法向量为 (0, 0, 1)。
- 天生圆锥侧面三角面片:每两个相邻的底面极点和圆锥极点毗连,形成一个三角形。通过 faces.push_back() 将每个侧面三角形的三个极点索引存储起来。对每个三角面片的三个极点天生纹理坐标并存储。
- 法向量和颜色设置:通过 normal_index 和 color_index 将三角面片与法向量、颜色的索引关联起来。
终极,全部的极点、法向量、颜色、纹理坐标和面片索引通过 storeFacesPoints() 存储起来,以便后续利用。
补全TriMesh.cpp中的readObj函数
readObj函数实现了从 .obj 文件中读取三维模子的极点数据、法向量数据、纹理坐标数据和面片数据,并将这些数据存储在类的成员变量中,供后续的渲染或盘算利用。须要增补的代码逻辑如下:
- 极点数据 ("v"):读取极点坐标(x, y, z),将其存入 vertex_positions 向量中。
- 法向量数据 ("vn"):读取法向量坐标(x, y, z),将其存入 vertex_normals 向量中。
- 纹理坐标数据 ("vt"):读取纹理坐标(x, y),将其存入 vertex_textures 向量中。
- 面数据 ("f"):读取面数据,包罗三个极点的索引(极点、纹理和法向量索引),这些索引会被转换为从0开始的索引,并存储在 faces、texture_index、normal_index 中。
每一行的面数据包罗三个极点,利用索引(如 a0, b0, c0)来表现这些极点在对应的数组中的位置。索引是从1开始的,因此须要将其减去1来转换为从0开始的索引。
在 vertex_colors 中存储的是法向量(即 vertex_normals),由于通常情况下法向量用作极点的颜色。
补全main.cpp中的init函数
在init() 函数加载桌子和娃娃的三维模子,并根据指定的平移、旋转和缩放变更举行调解。将这些模子添加到绘制管线(painter)中,供渲染利用。
- 创建一个新的 TriMesh 对象 table,并读取桌子模子文件 table.obj。
- 通过 setNormalize(true) 方法确保模子数据被归一化。
- 利用 readObj("./assets/table.obj") 函数加载桌子的多少数据。
- 设置桌子的平移(setTranslation)、旋转(setRotation)、缩放(setScale)变更。
平移:glm::vec3(-0.7, 0.0, 0.0) 将桌子稍微平移。
旋转:glm::vec3(-90.0, 0.0, 0.0) 将桌子旋转 -90 度。
缩放:glm::vec3(2.0, 2.0, 2.0) 放大桌子的巨细。
将桌子模子添加到 painter 中,通过 painter->addMesh 方法加载模子并指定纹理和着色器。
加载并设置娃娃模子
- 创建一个新的 TriMesh 对象 wawa,并读取娃娃模子文件 wawa.obj。
- 同样通过 setNormalize(true) 方法归一化模子数据,并利用 readObj("./assets/wawa.obj") 函数加载娃娃的多少数据。
- 设置娃娃的平移、旋转和缩放变更:
平移:glm::vec3(0.7, 0.0, 0.0) 将娃娃平移。
旋转:glm::vec3(-90.0, 0.0, 0.0) 旋转 -90 度。
缩放:glm::vec3(2.0, 2.0, 2.0) 放大娃娃的巨细。
将娃娃模子添加到 painter 中,指定纹理和着色器。
三、步伐运行结果
运行步伐初始界面
举行程度方向左右旋转
举行竖直方向旋转
|