Q1. three.js 读取不同格式模型,学会控制不同格式模型的最小部分,探索前期模型的组合
方式是否和后期的数据是否相关?
Q2. 根据地理坐标,怎样保持相对位置的一致?
模型: 两个立方体或更多
格式选择:
(1)obj+mtl
(2)ply
(3)stl
(4)josn
(5)collada
根据组合的顺序不同查看数组的顺序是否发生变换
Ctrl+j(join)
CTRL+g(group)
Ctrl+p(父级 parent)
查看导入模型的相对位置是否变换
最终根据地图实际导入到 web 中查看相对位置是否变换
(1) obj+mtl :obj 是一种简单的三维文件格式。它是使用最广泛的三维文件
格式,用来定义对象的几何体。MTL 文件常和 OBJ 文件一起使用。在一个 OBJ 文件中,用
MTL 文件定义对象的材质
实验步骤:
1. 先将一个简单的立方体使用 blender 以 obj 格式导出,blender 自动生成两个文件:
一个 obj 文件和一个 mtl 文件
根据控制台窗口发现结构如下
Object {type=“Group” }
Children[0]
{type=“Object3D” }
Children[0] {type=“Mesh” }
Children[1] {type=“Mesh” }
这时出现一个问题,明明只有一个立方体,为什么会出现两个 Mesh 对象,经过对两个
对象的仔细比较,发现他们的 geometry 属性中 vertices(顶点坐标)属性中数据都一致,
但 faces 属性不同,children[1]具有正确的 faces 属性,而 children[0]的 faces 属性中没有数
据!除了 geometry 属性,更大的差异在于 material 属性,children[1]中的 material 的 type=
“MeshPhongMaterial”,而 children[0]中的 material 的 type 属性为“MeshLambertMateria l”,因
此可以判断 three.js 基于两个不同材质创建了两个实例(THREE.Mesh 对象),将这些实例放
在了一个组里面(THREE.Object3D 对象)。
弄清楚以上问题,我们开始将导入两个立方体进行探讨。
2. 导入两个立方体(未进行 join、group、parent 操作)
Blender:
Cube.006 相对于 Cube.007 沿 y 轴正向移动了 5 个单位
Web:
Cube.006 相对于 Cube.007 沿 z 轴负向移动了 5 个单位
由控制台窗口得结构如下
Object {type=“Group” }
Children[0] (Cube.007)
{type=“Object3D” }
Children[1] (Cube.006)
{type=“Object3D” }
Children[0] {type=“Mesh” }
Children[1] {type=“Mesh” }
Children[0] {type=“Mesh” }
Children[1] {type=“Mesh” }
(a)坐标的问题可能是由于 blender 自身得原因,先不予讨论,但也可以看出但如果导入
之前的模型如果有相对位置关系,那么导入 web 中也会有相对位置关系。
(b) 我们发现 object 的第一个子对象是我们在建模软件中后创建的立方体,第二个对象
是我们先创建的立方体,检查 obj 文件,第一个对象是 Cube.007,第二个是 Cube.006,(私
下我又创建了一个具有 3 个立方体的场景,发现 three.js 导入立方体的顺序和我们创建的顺
序确实是相反的,即先创建的物体后导入,后创建的物体先导入)。
(c)接下来我们将实现对立方体的逐层控制。首先希望实现对一个立方体的着色,此时发
现改变一个 mesh.material.color 的值,另一个立方体的颜色也发生了变化。
这是怎么回事?
经过查看四个 mesh 对象的 material 属性发现除了 object.children[0].children[0].mater
Ial.type 为“MeshLambertMaterial”其余三个 mesh 的 material 的 type 属性均为“MeshPhongMa
terial”,并且均为同一引用对象,根据 JavaScript 对引用对象的描述,不难知道为什么两个
立方体的颜色均发生了变换。
解决方法为使他们指向不同的引用对象。
由于三角形为基本形状,我们只要为每个面的顶点指定颜色,将 material 中的 vertexC
olors 属性开启即可(此时得出的颜色为线性插值得到的结果),或者为每个面直接进行指定
颜色,最后将 material 的 vertexColors 属性设置为 FaceColor。由控制台窗口中的数据可知
立方体顶点顺序如下。
效果图如下:
由此可知,能够对几何体的 geometry 属性中的 vertices 和 faces 进行操作
从而控制几何体的顶点和面。
3. 导入两个立方体(进行 join 操作)
Blender: Cube.006 相对于 Cube.007 沿 y 轴正向移动了 5 个单位,先点击 Cube.007,,
后点击 Cube.006。(我们可以发现只剩下 Cube.006,Cube.007 已经被合并了)
Web:
由控制台窗口可知结构如下
Object {type=“Group” }
Children[0]
{type=“Object3D” }
Children[0] {type=“Mesh” }
Children[1] {type=“Mesh” }
其实非常容易理解,两个物体合成了一个物体,发生改变的是网格对象中的顶点个数从
8 变成了 16,顶点的顺序仍之前的一致
并且我们发现顶点数组中先计入的是 Cube.006 的坐标,后计入 Cube.007 坐标。因为
是 Cube.007 并入了 Cube.006,所以 three.js 先导入 Cube.006 的坐标,后导入 Cube.007 的
坐标。同理我们也可以控制这个对象的顶点和面(颜色或坐标)
代码如下
效果图如下
4. 导入两个立方体(进行 group 操作)
Blender:
Cube.006 相对于 Cube.007 沿 y 轴正向移动了 5 个单位,先点击 Cube.007,,
后点击 Cube.006。
Web:
由控制台窗口可得结构如下
Object {type=“Group” }
Children[0] (Cube.007)
{type=“Object3D” }
Children[1] (Cube.006)
{type=“Object3D” }
Children[0] {type=“Mesh” }
Children[1] {type=“Mesh” }
Children[0] {type=“Mesh” }
Children[1] {type=“Mesh” }
可以看出与没有进行 group 操作没有什么区别,是不是两个立方体太少了呢,下面我们来
在加一个立方体,并为他创建一个组
Blender:
Cube.006 相对于 Cube.007 沿 y 轴正向移动了 5 个单位,Cube.011 相对于
Cube.007 沿 x 轴正向移动了 5 个单位,先点击 Cube.007,后点击 Cube.006,进行组合。