初学者学习本章节如果感觉有些困难,或者急于实现某些功能,可以暂时跳过。不过学习本章节的好处是,你可以理解Threejs所谓的几何体Geometry本质上是什么,通过本章节的学习建立Threejs顶点的概念,更有助于后面很多课程的学习。
当然了,如果你有一定的WebGL基础,对于来说早就建立了顶点的概念,那么你学习本章节课,和没有WebGL基础的初学者策略可以不同,可以把重心放在Threejs几何体相关方法和属性具体知识学习,同时从Threejs引擎封装WebGL的角度去学习。
顶点位置数据解析渲染
如果你没有WebGL基础,可以先不用记忆每个的threejs 具体内容,有一个大致印象即可,学习本节课的重点是建立顶点的概念。如果你建立了顶点的概念,那么对于你深入理解学习Three.js很有帮助。
如果你已经有WebGL基础或者说图形学基础,说明你肯定有顶点的概念,本节课重点可以放在学习threejs的API使用细节,threejs引擎是如何封装webgl的。
JavaScript类型化数组
本节课会用到javascript的类型化数组,你如果不了解,可查看MDN关于javascript类型化数组的介绍,也可以查看文章类型化数组。
自定义几何体
你可以直接调用BoxGeometry直接创建一个立方体几何体,调用SphereGeometry创建一个球体几何体。不过为了大家更好的建立顶点概念,通过下面的代码自定义了一个几何体,通过网格模型可以渲染出来两个三角形效果。
下面代码通过Threejs引擎的BufferGeometry和BufferAttribute两个API自定义了一个具有六个顶点数据的几何体。
var geometry = new THREE.BufferGeometry(); //创建一个Buffer类型几何体对象 //类型数组创建顶点数据 var vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 50, 0, 0, //顶点2坐标 0, 100, 0, //顶点3坐标 0, 0, 10, //顶点4坐标 0, 0, 100, //顶点5坐标 50, 0, 10, //顶点6坐标 ]); // 创建属性缓冲区对象 var attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组,表示一个顶点的xyz坐标 // 设置几何体attributes属性的位置属性 geometry.attributes.position = attribue;
通过自定义的几何体创建一个网格模型。对于网格模型而言,几何体所有顶点每三个顶点为一组可以确定一个三角形,几何体是六个顶点,也就是说可以绘制两个三角形,当然了你可以自己再增加三个顶点位置坐标数据,测试下渲染效果。
// 三角面(网格)渲染模式 var material = new THREE.MeshBasicMaterial({ color: 0x0000ff, //三角面颜色 side: THREE.DoubleSide //两面可见 }); //材质对象 var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
点模型Points
为了更好的理解几何体是由顶点构成的,可以把几何体geometry作为点模型Points而不是网格模型Mesh的参数,你会发现上面的六个点坐标会渲染为六个方形的点区域,可以用下面代码代替上面的网格模型部分代码测试效果。
对于网格模型Mesh而言,几何体geometry三个顶点为一组渲染出来一个三角形,对于点模型Points而言,几何体的每个顶点对应位置都会渲染出来一个方形的点区域,该区域可以设置大小。
// 点渲染模式 var material = new THREE.PointsMaterial({ color: 0xff0000, size: 10.0 //点对象像素尺寸 }); //材质对象 var points = new THREE.Points(geometry, material); //点模型对象 scene.add(points); //点对象添加到场景中
线模型Line
上面两个案例适用点模型和网格模型去渲染几何体的顶点数据,下面代码是把几何体作为线模型Line参数,你会发现渲染效果是从第一个点开始到最后一个点,依次连成线。
// 线条渲染模式 var material=new THREE.LineBasicMaterial({ color:0xff0000 //线条颜色 });//材质对象 var line=new THREE.Line(geometry,material);//线条模型对象 scene.add(line);//线条对象添加到场景中
在上面的案例中,由于坐标系的某个轴颜色和线材质重合,所以将坐标系暂时隐藏。
几何体本质
查看下面一段代码,你可以看出来立方体网格模型Mesh是由立方体几何体geometry和材质material两部分构成,立方体几何体BoxGeometry本质上就是一系列的顶点构成,只是Threejs的APIBoxGeometry把顶点的生成细节封装了,用户可以直接使用。比如一个立方体网格模型,有6个面,每个面至少两个三角形拼成一个矩形平面,每个三角形三个顶点构成,对于球体网格模型而言,同样是通过三角形拼出来一个球面,三角形数量越多,网格模型表面越接近于球形。
var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry var material = new THREE.MeshLambertMaterial({ color: 0x0000ff }); //材质对象Material var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
顶点颜色数据插值计算
上节课自定义几何体给大家介绍了一个顶点位置坐标概念,本节课给大家介绍一个新的几何体顶点概念,就是几何体顶点颜色。
通常几何体顶点位置坐标数据和几何体顶点颜色数据都是一一对应的,比如顶点1有一个顶点位置坐标数据,也有一个顶点颜色数据,顶点2同样也有一个顶点位置坐标数据,也有一个顶点颜色数据...
每个顶点设置一种颜色
你可以在上节课代码更改为下面代码设置,你可以看到几何体的六个顶点分别渲染为几何体设置的顶点颜色数据。
var geometry = new THREE.BufferGeometry(); //声明一个缓冲几何体对象 //类型数组创建顶点位置position数据 var vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 50, 0, 0, //顶点2坐标 0, 100, 0, //顶点3坐标 0, 0, 10, //顶点4坐标 0, 0, 100, //顶点5坐标 50, 0, 10, //顶点6坐标 ]); // 创建属性缓冲区对象 var attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组,作为一个顶点的xyz坐标 // 设置几何体attributes属性的位置position属性 geometry.attributes.position = attribue; //类型数组创建顶点颜色color数据 var colors = new Float32Array([ 1, 0, 0, //顶点1颜色 0, 1, 0, //顶点2颜色 0, 0, 1, //顶点3颜色 1, 1, 0, //顶点4颜色 0, 1, 1, //顶点5颜色 1, 0, 1, //顶点6颜色 ]); // 设置几何体attributes属性的颜色color属性 geometry.attributes.color = new THREE.BufferAttribute(colors, 3); //3个为一组,表示一个顶点的颜色数据RGB //材质对象 var material = new THREE.PointsMaterial({ // 使用顶点颜色数据渲染模型,不需要再定义color属性 // color: 0xff0000, vertexColors: THREE.VertexColors, //以顶点颜色为准 size: 10.0 //点对象像素尺寸 }); // 点渲染模式 点模型对象Points var points = new THREE.Points(geometry, material); //点模型对象 scene.add(points); //点对象添加到场景
材质属性.vertexColors
你可以看到上面案例的材质代码和前面稍有不同,原来是通过材质的颜色属性color设置模型颜色,而本案例并没有这样设置,而是设置了材质属性.vertexColors。
var material = new THREE.PointsMaterial({ // 使用顶点颜色数据渲染模型,不需要再定义color属性 // color: 0xff0000, vertexColors: THREE.VertexColors, //以顶点颜色为准 size: 10.0 //点对象像素尺寸 });
属性.vertexColors的默认值是THREE.NoColors,这也就是说模型的颜色渲染效果取决于材质属性.color,如果把材质属性.vertexColors的值设置为THREE.VertexColors,threejs渲染模型的时候就会使用几何体的顶点颜色数据geometry.attributes.color。
Threejs提供的接口BufferAttribute目的是为了创建各种各样顶点数据,比如顶点颜色数据,顶点位置数据,然后作为几何体BufferGeometry的顶点位置坐标属性BufferGeometry.attributes.position、顶点颜色属性BufferGeometry.attributes.color的值。
缓冲类型几何体BufferGeometry除了顶点位置、顶点颜色属性之外还有其他顶点属性,后面课程都会讲解到。
颜色插值
如果你把几何体作为网格模型Mesh或者线模型Line构造函数的参数,你会发现渲染出渐变的彩色效果。
之所以出现渐变是因为Threejs通过底层WebGL进行渲染的时候会对顶点的颜色数据进行插值计算。颜色插值计算简单点说,比如一条直线的端点1设置为红色,端点2设置为蓝色,整条直线就会呈现出从点1到红色点2的蓝色颜色渐变,对于网格模型Mesh而言,就是三角形的三个顶点分别设置一个颜色,三角形内部的区域像素会根据三个顶点的颜色进行插值计算。
var line=new THREE.Line(geometry,material);//线条模型对象 scene.add(line);//线条对象添加到场景中
线材模型对象会使得线段呈现出渐变的颜色。
var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh scene.add(mesh); //网格模型添加到场景中
网格会呈现如下颜色:
插值计算示意图:
顶点法向量数据光照计算
如果你有初高中物理的光学基础,应该会有漫反射、镜面反射的概念。比如太阳光照在一个物体表面,物体表面与光线夹角位置不同的区域明暗程度不同,WebGL中为了计算光线与物体表面入射角,你首先要计算物体表面每个位置的法线方向,在Threejs中表示物体的网格模型Mesh的曲面是由一个一个三角形构成,所以为了表示物体表面各个位置的法线方向,可以给几何体的每个顶点定义一个方向向量。
下面代码仅仅定义了几何体BufferGeometry的顶点位置数据,没有定义顶点法向量数据。没有法向量数据,点光源、平行光等带有方向性的光源不会起作用,三角形平面整个渲染效果相对暗淡,而且两个三角形分界位置没有棱角感。
var geometry = new THREE.BufferGeometry(); //声明一个空几何体对象 //类型数组创建顶点位置position数据 var vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 50, 0, 0, //顶点2坐标 0, 100, 0, //顶点3坐标 0, 0, 0, //顶点4坐标 0, 0, 100, //顶点5坐标 50, 0, 0, //顶点6坐标 ]); // 创建属性缓冲区对象 var attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组 // 设置几何体attributes属性的位置position属性 geometry.attributes.position = attribue
定义几何体顶点法向量数据
在上面顶点位置数据基础上定义顶点法向量数据,这时候除了环境光以外,点光源也会参与光照计算,三角形整个表面比较明亮,同时两个三角形表面法线不同,即使光线方向相同,明暗自然不同,在分界位置有棱角感。
var normals = new Float32Array([ 0, 0, 1, //顶点1法向量 0, 0, 1, //顶点2法向量 0, 0, 1, //顶点3法向量 0, 1, 0, //顶点4法向量 0, 1, 0, //顶点5法向量 0, 1, 0, //顶点6法向量 ]); // 设置几何体attributes属性的位置normal属性 geometry.attributes.normal = new THREE.BufferAttribute(normals, 3); //3个为一组,表示一个顶点的法向量数据
顶点法向量数据和前面两节课讲解到的顶点位置数据、顶点颜色数据一样都是一一对应的。
// 访问几何体顶点位置数据 BufferGeometry.attributes.position // 访问几何体顶点颜色数据 BufferGeometry.attributes.color // 访问几何体顶点法向量数据 BufferGeometry.attributes.normal
几何体BufferGeometry的顶点法向量数据和几何体位置、颜色等顶点数据一样使用BufferAttribute表示。
// 设置几何体attributes属性的位置normal属性 geometry.attributes.normal = new THREE.BufferAttribute(normals, 3); //3个为一组,表示一个顶点的法向量数据
顶点索引复用顶点数据
通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据,如果你有WebGL基础很容易理解顶点索引的概念,如果没有也没有关系,下面会通过一个简单的例子形象说明。
比如绘制一个矩形网格模型,至少需要两个三角形拼接而成,两个三角形,每个三角形有三个顶点,也就是说需要定义6个顶点位置数据。对于矩形网格模型而言,两个三角形有两个顶点位置是重合的。也就是说可以重复的位置可以定义一次,然后通过通过顶点数组的索引值获取这些顶点位置数据。
不使用顶点索引
下面通过几何体六个顶点定义了两个三角形,几何体的顶点位置数据、顶点法向量数据都是6个。
var geometry = new THREE.BufferGeometry(); //声明一个空几何体对象 //类型数组创建顶点位置position数据 var vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 80, 0, 0, //顶点2坐标 80, 80, 0, //顶点3坐标 0, 0, 0, //顶点4坐标 和顶点1位置相同 80, 80, 0, //顶点5坐标 和顶点3位置相同 0, 80, 0, //顶点6坐标 ]); // 创建属性缓冲区对象 var attribute = new THREE.BufferAttribute(vertices, 3); //3个为一组 // 设置几何体attributes属性的位置position属性 geometry.attributes.position = attribute var normals = new Float32Array([ 0, 0, 1, //顶点1法向量 0, 0, 1, //顶点2法向量 0, 0, 1, //顶点3法向量 0, 0, 1, //顶点4法向量 0, 0, 1, //顶点5法向量 0, 0, 1, //顶点6法向量 ]); // 设置几何体attributes属性的位置normal属性 geometry.attributes.normal = new THREE.BufferAttribute(normals, 3); //3个为一组,表示一个顶点的xyz坐标
这个例子的知识点在上一节中已经提到过,这里不再提供案例。
顶点索引.index
下面代码通过几何体BufferGeometry的顶点索引BufferGeometry.index定义了一个矩形。通过顶点索引组织网格模型三角形的绘制,因为矩形的两个三角形有两个顶点位置重复,所以顶点位置数据、顶点法向量数据都只需要定义4个就可以。
var geometry = new THREE.BufferGeometry(); //声明一个空几何体对象 //类型数组创建顶点位置position数据 var vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 80, 0, 0, //顶点2坐标 80, 80, 0, //顶点3坐标 0, 80, 0, //顶点4坐标 ]); // 创建属性缓冲区对象 var attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组 // 设置几何体attributes属性的位置position属性 geometry.attributes.position = attribue var normals = new Float32Array([ 0, 0, 1, //顶点1法向量 0, 0, 1, //顶点2法向量 0, 0, 1, //顶点3法向量 0, 0, 1, //顶点4法向量 ]); // 设置几何体attributes属性的位置normal属性 geometry.attributes.normal = new THREE.BufferAttribute(normals, 3); //3个为一组,表示一个顶点的xyz坐标
通过顶点索引组织顶点数据,顶点索引数组indexes通过索引值指向顶点位置geometry.attributes.position、顶点法向量geometry.attributes.normal中顶面数组。
// Uint16Array类型数组创建顶点索引数据 var indexes = new Uint16Array([ // 0对应第1个顶点位置数据、第1个顶点法向量数据 // 1对应第2个顶点位置数据、第2个顶点法向量数据 // 索引值3个为一组,表示一个三角形的3个顶点 0, 1, 2, 0, 2, 3, ]) // 索引数据赋值给几何体的index属性 geometry.index = new THREE.BufferAttribute(indexes, 1); //1个为一组
创建顶点索引数组的时候,可以根据顶点的数量选择类型数组Uint8Array、Uint16Array、Uint32Array。对于顶点索引而言选择整型类型数组,对于非索引的顶点数据,需要使用浮点类型数组Float32Array等。
类型数组 | 位数 | 字节 | 类型描述 | C语言等价类型 |
---|---|---|---|---|
Int8Array | 8 | 1 | 有符号8位整型 | int8_t |
Uint8Array | 8 | 1 | 无符号8位整型 | uint8_t |
Int16Array | 16 | 2 | 有符号16位整型 | int16_t |
Uint16Array | 16 | 2 | 无符号16位整型 | int16_t |
Int32Array | 32 | 4 | 有符号32位整型 | int32_t |
Uint32Array | 32 | 4 | 无符号32位整型 | uint32_t |
Float32Array | 32 | 4 | 单精度(32位)浮点数 | float |
Float64Array | 64 | 8 | 双精度(64位)浮点数 | double |
BufferGeometry总结
设置Geometry顶点位置、顶点颜色数据
前4节通过缓冲类型几何体BufferGeometry给大家讲解了顶点位置、颜色、法向量、索引数据,本节课给大家引入一个新的threejs几何体API:Geometry。几何体Geometry和缓冲类型几何体BufferGeometry表达的含义相同,只是对象的结构不同,Threejs渲染的时候会先把Geometry转化为BufferGeometry再解析几何体顶点数据进行渲染。
实测中发现,只有低版本支持这个几何体API:Geometry,因此这里只做简介,没有具体案例。
Vector3定义顶点位置坐标数据
Vector3是threejs的三维向量对象,可以通过Vector3对象表示一个顶点的xyz坐标,顶点的法线向量。
几何体Geometry的顶点位置属性geometry.vertices和缓冲类型几何体BufferGeometry顶点位置属性BufferGeometry.attributes.position是对应的。
var geometry = new THREE.Geometry(); //声明一个几何体对象Geometry var p1 = new THREE.Vector3(50, 0, 0); //顶点1坐标 var p2 = new THREE.Vector3(0, 70, 0); //顶点2坐标 var p3 = new THREE.Vector3(80, 70, 0); //顶点3坐标 //顶点坐标添加到geometry对象 geometry.vertices.push(p1, p2, p3);
Color定义顶点颜色数据
通过threejs顶点颜色对象Color可以定义几何体顶点颜色数据,然后顶点颜色数据构成的数组作为几何体Geometry顶点颜色属性geometry.colors的值。
几何体Geometry的顶点颜色属性geometry.colors和缓冲类型几何体BufferGeometry顶点颜色属性BufferGeometry.attributes.color是对应的。
// Color对象表示顶点颜色数据 var color1 = new THREE.Color(0x00ff00); //顶点1颜色——绿色 var color2 = new THREE.Color(0xff0000); //顶点2颜色——红色 var color3 = new THREE.Color(0x0000ff); //顶点3颜色——蓝色 //顶点颜色数据添加到geometry对象 geometry.colors.push(color1, color2, color3);
注意设置几何体Geometry顶点颜色属性geometry.colors,对网格模型Mesh是无效的,对于点模型Points、线模型Line是有效果。网格模型情况几何体Geometry顶点颜色如何设置可以参考下一节课。
材质属性.vertexColors
注意使用顶点颜色数据定义模型颜色的时候,要把材质的属性vertexColors设置为THREE.VertexColors,这样顶点的颜色数据才能取代材质颜色属性.color起作用。
//材质对象 var material = new THREE.MeshLambertMaterial({ // color: 0xffff00, vertexColors: THREE.VertexColors, //以顶点颜色为准 side: THREE.DoubleSide, //两面可见 });
Face3对象定义Geometry的三角形面
几何体Geometry的三角面属性geometry.faces和缓冲类型几何体BufferGeometry顶点索引属性BufferGeometry.index类似都是顶点位置数据的索引值,用来组织网格模型三角形的绘制。
学习本节课最好对照顶点索引复用数据学习。
下面代码自定义了一个由两个三角形构成的几何体,两个三角形有两个顶点坐标位置是重合的。
var geometry = new THREE.Geometry(); //声明一个几何体对象Geometry var p1 = new THREE.Vector3(0, 0, 0); //顶点1坐标 var p2 = new THREE.Vector3(0, 100, 0); //顶点2坐标 var p3 = new THREE.Vector3(50, 0, 0); //顶点3坐标 var p4 = new THREE.Vector3(0, 0, 100); //顶点4坐标 //顶点坐标添加到geometry对象 geometry.vertices.push(p1, p2, p3,p4); // Face3构造函数创建一个三角面 var face1 = new THREE.Face3(0, 1, 2); //三角面每个顶点的法向量 var n1 = new THREE.Vector3(0, 0, -1); //三角面Face1顶点1的法向量 var n2 = new THREE.Vector3(0, 0, -1); //三角面2Face2顶点2的法向量 var n3 = new THREE.Vector3(0, 0, -1); //三角面3Face3顶点3的法向量 // 设置三角面Face3三个顶点的法向量 face1.vertexNormals.push(n1,n2,n3); // 三角面2 var face2 = new THREE.Face3(0, 2, 3); // 设置三角面法向量 face2.normal=new THREE.Vector3(0, -1, 0); //三角面face1、face2添加到几何体中 geometry.faces.push(face1,face2);
设置四个顶点
两个三角形有6个顶点,但是两个顶点位置重合的,可以设置4个顶点即可。
var p1 = new THREE.Vector3(0, 0, 0); //顶点1坐标 var p2 = new THREE.Vector3(0, 100, 0); //顶点2坐标 var p3 = new THREE.Vector3(50, 0, 0); //顶点3坐标 var p4 = new THREE.Vector3(0, 0, 100); //顶点4坐标 //顶点坐标添加到geometry对象 geometry.vertices.push(p1, p2, p3,p4);
Face3构建三角形
threejs提供了Face3对象构建三角形,通过Face3构建一个三角形,不要设置顶点位置坐标数据,只需要通过数组索引值从geometry.vertices数组中获得顶点位置坐标数据。
geometry.vertices数组索引0, 1, 2对应的顶点位置坐标数据表示三角形1的三个顶点坐标,索引0, 2, 3对应的顶点位置坐标数据表示三角形2的三个顶点坐标。
// Face3构造函数创建一个三角面 var face1 = new THREE.Face3(0, 1, 2); // 三角面2 var face2 = new THREE.Face3(0, 2, 3);
三角形法线设置
前面课程将结果网格模型Mesh的几何体Geometry本质上都是一个一个三角形拼接而成,所以可以通过设置三角形的法线方向向量来表示几何体表面各个位置的法线方向向量。
设置三角形法线方向向量有两种方式,一种是直接定义三角形面的法线方向,另一个是定义三角形三个顶点的法线方向数据来表示三角形面法线方向。
使用三维向量THREE.Vector3表示三角形法线方向数值,然后赋值给三角形对象Face3的法线属性Face3.normal。
// 三角面2 var face2 = new THREE.Face3(0, 2, 3); // 设置三角面法向量 face2.normal=new THREE.Vector3(0, -1, 0);
换另一种方式,通过三角形面Face3的Face3.vertexNormals属性给三角形的三个顶点分别设置一个顶点法线方向数据。
// Face3构造函数创建一个三角面 var face1 = new THREE.Face3(0, 1, 2); //三角面每个顶点的法向量 var n1 = new THREE.Vector3(0, 0, -1); //三角面Face1顶点1的法向量 var n2 = new THREE.Vector3(0, 0, -1); //三角面2Face2顶点2的法向量 var n3 = new THREE.Vector3(0, 0, -1); //三角面3Face3顶点3的法向量 // 设置三角面Face3三个顶点的法向量 face1.vertexNormals.push(n1,n2,n3);
三角形颜色设置
三角形颜色设置和三角形法线方向设置类型,可以直接设置三角形颜色,也可以设置三角形三个顶点的颜色。
// 三角形1颜色 face1.color = new THREE.Color(0xffff00); // 设置三角面face1三个顶点的颜色 face1.color = new THREE.Color(0xff00ff);
通过三角形面Face3的.vertexColors属性设置三角形三个顶点颜色。
三个顶点颜色不同三角形面渲染的时候会进行颜色插值计算,测到一个颜色渐变效果。
face1.vertexColors = [ new THREE.Color(0xffff00), new THREE.Color(0xff00ff), new THREE.Color(0x00ffff), ]
使用顶点颜色数据的时候,注意设置材质的属性vertexColors属性值为THREE.VertexColors。
注意设置三角形Face3的颜色对threejs网格模型Mesh有效,对于点模型Points、线模型Line是无效果,如果想设置点、线模型对应的几何体Geometry的顶点颜色,可以通过Geometry的顶点颜色属性geometry.colors实现。
访问几何体对象的数据
实际开发项目的时候,可能会加载外部模型,有些时候需要获取模型几何体的顶点数据,如果想获取几何体的顶点数据首先要熟悉three.js几何体BoxGeometry和BufferGeometry的结构。
访问几何体顶点数据其实很简单,刚开始学习不用刻意记忆,直接查看threejs文档,就像访问javascript对象的属性一样。
测试BoxGeometry
调用BoxGeometry创建一个立方体,执行THREE.BoxGeometry构造函数会自动生成几何体对象的顶点位置坐标、顶点法向量等数据。
你可以通过执行下面代码,然后查看浏览器控制台打印的数据
var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry console.log(geometry); console.log('几何体顶点位置数据',geometry.vertices); console.log('三角行面数据',geometry.faces);
将产生类似下面的控制台信息:
BoxGeometry、PlaneGeometry、SphereGeometry等几何体类的基类是Geometry。
测试PlaneBufferGeometry
PlaneBufferGeometry表示一个矩形平面几何体,执行下面代码,你可以查看该几何体的相关顶点数据。
//创建一个矩形平面几何体 var geometry = new THREE.PlaneBufferGeometry(100, 100); console.log(geometry); console.log('几何体顶点位置数据',geometry.attributes.position); console.log('几何体索引数据',geometry.index);
BoxBufferGeometry、PlaneBufferGeometry、SphereBufferGeometry等几何体类的基类是BufferGeometry。
几何体旋转、缩放、平移变换
通过前面的学习,我相信你已经对Threejs几何体内部顶点构成有了一定了解。下面我们来学习几何体的旋转,缩放和各种变换,主要的变换如下:
几何体Geometry对象有一系列的顶点属性,也封装了一系列的方法,通过.scale()、.translate()、.rotateX()等方法可以对几何体本身进行缩放、平移、旋转等几何变换。通过.scale()、.translate()、.rotateX()这些方法对几何体进行变换,注意本质上都是改变结合体顶点位置坐标数据。你可以执行测斜方法,然后在浏览器控制打印顶点位置坐标数据console.log(geometry.vertices);,然后对比几何体变化前后定点位置坐标是否变化。下面这个几何体,由正方体,变成了一个
var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry // 几何体xyz三个方向放大倍数 geometry.scale(1, 2, 2); // 几何体沿着x轴平移50 geometry.translate(50, 0, 0); // 几何体绕着x轴旋转45度 geometry.rotateX(Math.PI / 4); // 居中:偏移的几何体居中 geometry.center(); console.log(geometry.vertices);
BufferGeometry和几何体Geometry 一样具有.scale()、.rotateZ()、.rotateX()等几何体变换的方法。
注意
注意网格模型Mesh进行缩放旋转平移变换和几何体Geometry可以实现相同的渲染效果,但是网格模型Mesh进行这些变换不会影响几何体的顶点位置坐标,网格模型缩放旋转平移变换改变的是模型的本地矩阵、世界矩阵。
你可以执行下面代码测试。
// 几何体xyz方向分别缩放0.5,1.5,2倍 geometry.scale(0.5, 1.5, 2);
// 网格模型xyz方向分别缩放0.5,1.5,2倍 mesh.scale.set(0.5, 1.5, 2)
转载本站内容时,请务必注明来自W3xue,违者必究。