模型:
Mesh Line LineSegment Sprite
等模型所有的父对象都是Object3D
都可以添加到场景中。
1. 设置场景的背景
-
场景的背景可以是一张图片、一种颜色、一个图形、一个纹理等。
-
为场景设置一种颜色:
this.scene.background = new THREE.Color(0x0000ff)
- 为场景设置一个纹理:
let bgTextureLoader = new TextureLoader()
this.scene.background = bgTextureLoader.load(require('../../assets/girl.jpg'))
2. Mesh网格的介绍和使用
Mesh 继承于Object3D;
2.1 Mesh主要有两部分组成:
-
Geometry:几何体形状、立方体、球体、以及各种不规则的形状;
-
Material:光照反射和折射等各种信息,物体的本身物理性质决定。
2.2 Line 线
- 创建线,线是连续的。
- 使用
new Float32BufferAttribute
创建一个形状 ,这里的数组中每三个数为一个点。一个点中的三个数分别代表的首 x ,y ,z。
/** 创建一个线段和线 线段和线的区别 线段不是连续的 线是连续的 **/
let lineGeometry = new BufferGeometry()
// 创建线段时数组中每三个数表示为一个点
lineGeometry.setAttribute("position" , new Float32BufferAttribute([-10,-10,-10,8,8,8,15,15,15],3))
let line = new Line(lineGeometry , new LineBasicMaterial({color:0xff0000}))
this.scene.add(line)
2.3 LineSegment 线段
- 线段不是连续的,如果要做到连续需要第一条线的终点和第二条线的起点一致。
/**
* 创建线段对象 创建线段时 每两个点位一个线段 不是连续的 如果要做到连续需要第一条线的终点和第二条线的起点一致
*/
let lineSegmentGeo = new BufferGeometry()
lineSegmentGeo.setAttribute("position" , new Float32BufferAttribute([-30,-10,-10,-20,8,8,-20,8,8,-30,15,15],3))
let lineSeg = new LineSegments(lineSegmentGeo,new LineBasicMaterial({color:0x00ff00}))
this.scene.add(lineSeg)
2.4 Sprite 精灵
- 创建精灵时不需要创建形状因为精灵默认就是一个正方形。
// 创建纹理加载器
let textureLoader = new TextureLoader()
let sprite = new Sprite(new SpriteMaterial({
map: textureLoader.load(require('../../assets/girl.jpg')),
// sizeAttenuation:false // false的话 不随着相机拉远而变小
}))
// 将精灵添加到场景中
this.scene.add(sprite)
2.5 Points 点云
- 点云就是由一组精灵组成的:每个点显示一个精灵
/**
* 创建点云
*/
let pointGeometry = new BufferGeometry()
// 点云就是很多精灵组成的 一个点代表一个精灵的位置
pointGeometry.setAttribute('position',new Float32BufferAttribute([-30,-10,-10,-20,8,8,-30,15,15],3))
// 创建点云
let points = new Points(pointGeometry, new PointsMaterial({
map:textureLoader.load(require('../../assets/girl.jpg'))
}))
this.scene.add(points)
3. 位置、缩放、旋转
只有继承了
Object3D
的对象都是可以进行方位变换的。
3.1 位置
-
可以通过物体的
position
属性设置物体的位置。 -
位置写法有两种一种是分开的写法,一种是组合的写法:
// 5. 创建一个简单的形状
let boxGeometry = new BoxGeometry(10,10,10)
// 创建材质
let boxMaterial = new MeshPhongMaterial()
// 根据形状和材质创建一个网格
let boxMesh = new Mesh(boxGeometry,boxMaterial)
/** 对形状进行方位的改变
* 1. 平移
* 2. 旋转
* 3. 缩放
* **/
// 1. 平移
// boxMesh.position.x = 10
// boxMesh.position.y = 10
// boxMesh.position.z = 10
boxMesh.position.set(10,10,20)
3.2 缩放
-
物体可以通过
scale
属性改变物体的大小。 -
对物体进行缩放也可以有两种写法,一种分开的写法和组合写法:
// 3. 缩放
boxMesh.scale.x = 1
boxMesh.scale.y = 0.5
boxMesh.scale.z = 2
// boxMesh.scale.set(1,2,3)
3.3 旋转
-
物体通过
rotation
属性可以对物体进行绕x 、 y 、 z轴进行旋转操作。 -
物体除了绕 x 、 y、 z 轴旋转还可以绕任意轴旋转。 使用
rotateOnAxis
方法可以实现。传递一个向量的方式让物绕任意指定的轴进行旋转,但是这个任意轴需要保证旋转轴的长度为1,否则物体就会发生变形。保证任意旋转轴的长度为1使用normalize
方法可以实现。
// 2. 旋转 绕 x y z 轴旋转 或者 任意轴旋转
// boxMesh.rotation.x = Math.PI / 4 // ( Math.PI 代表 180 度 π )
// boxMesh.rotation.y = Math.PI / 3 // ( Math.PI 代表 180 度 π )
// 可以组合写法
// boxMesh.rotation.set(0,0,Math.PI / 3)
// 可以沿任意轴旋转
let axis = new Vector3(15,15,15)
axis.normalize() // 需要进行单位话 保证旋转轴的长度为1 否则就会产生变形
boxMesh.rotateOnAxis(axis , Math.PI / 3)
网友评论