不久前在项目中碰到一个问题,实时的在XZ平面上产生一系列顶点,并且是一个闭环,用于表示建筑物。我需要渲染一个有高度的建筑物,还需要带有纹理。
一. 首先根据顶点生成三角形,构成物体,构成物体分两步:物体的墙壁和屋顶。
1. 墙壁的生成策略如下:根据相邻的两个顶点,深克隆它们,并且这两个克隆的顶点在Y轴上位移一段距离(这个距离就是建筑物的高度),这样就有了四点顶点,通过这四个顶点生成一个平面(注意两个三角形顶点的顺序都是逆时针)。
2. 屋顶的生成策略如下:根据墙壁生成时的克隆顶点,查找出X最大值和最小值,以及Z的最大和最小值,然后根据这些最大最小值计算出X轴和Z轴的中心点。然后每两个相邻的克隆顶点和中心点,构成一个三角形。
二. 到这里建筑物已经生成完毕,但是不能放松,因为还有很棘手的一步:给建筑物贴图。给建筑物贴图我用到了两个纹理,一个用于墙壁,一个用于屋顶。
(1). 墙壁纹理坐标的生成策略如下:
1. 将纹理uv坐标在u轴上分割为很多片段,piece = 1 /(XZ轴上顶点数量-1)
2. 为墙壁上的每个三角形生成纹理坐标,在XZ平面上每个顶点uv坐标的u值比前一个顶点的u值加上piece(第一个顶点的u值为0), v值一直为0;克隆出的每个顶点的纹理u值也比前一个顶点的u值加上piece, v值一直为1
(2). 屋顶纹理坐标的生成策略如下:
1. 保存在前面得到的屋顶在X轴的最大最小值和Z轴的最大最小值,并且分别计算出最大值和最小值之间的距离,分别记为distaceX, distanceZ
2. 每一个顶点的纹理坐标u值 = (每一个顶点的X - 最小的X值)/distanceX
3. 每一个顶点的纹理坐标v值 = (每一个顶点的Z - 最小的Z值)/distanceZ
来源:oschina
链接:https://my.oschina.net/u/1273706/blog/3162539