- Mesh
- 使用
-
var mesh = THREE.Mesh(geometry, material); # mesh模型 mesh.position.x= x; mesh.rotation.x = rx; scene.add(meshCube); 方法 mesh1.addChild(mesh2) # mesh2加入mesh1, 组成一个Mesh api mesh.scale.multiplyScalar(0.35) # 让x y z方向缩放系数到原模型的0.35倍 line THREE.Line( geometry, material, THREE.LinePieces ); # 线 scene.add(line); 例子 var line_material = new THREE.LineBasicMaterial({color: 0x303030}), geometry = new THREE.Geometry(), floor = -75, step = 25; for( var i = 0; i <= 40; i++){ geometry.vertices.push(new THREE.Vector3(-500, floor, i * step - 500)); geometry.vertices.push(new THREE.Vector3(500, floor, i * step - 500)); geometry.vertices.push(new THREE.Vector3(i * step - 500, floor,- 500)); geometry.vertices.push(new THREE.Vector3(i * step - 500, floor, 500)); } var line = new THREE.Line(geometry, line_material, THREE.LinePieces); scene.add(line); MorphAnimMesh 介绍 动画网格模型 包含几个动画帧(一极动画模型),通过播放帧来看动画。 可以设置帧数,播放到哪一帧,顺播还是倒播。 THREE.MorphAnimMesh = function (geometry, material){ THREE.Mesh.call(this, geometry, material); # 调用基类构造函数 this.duration = 1000; # 完成所有帧的时间(milliseconds) this.mirroredLoop = false; # 表示镜像循环(是否循环播放) this.time = 0; # 当前播放时间 this.lastKeyframe = 0; # 上一帧 this.currentKeyframe = 0; # 当前播放的帧 this.direction = 1; # 表示从前向后播放, -1是从后向前 this.directionBackwards = false; # 是否倒播 this.setFrameRange(0, this.geometry.morphTargets.length - 1); # 设置最小帧和最大帧 ## 这里开始帧是0, 结束帧是 总帧数 - 1 } 方法 THREE.MorphAnimMesh.prototype.setDirectionForward = function(){ this.direction = 1; # 1是前进, -1是后退 this.directionBackwords = false; # false表示前进 } # 计算下一帧是哪一帧时,根据上面两个变量计算 THREE.MorphAnimMesh.prototype.setDirectionBackward THREE.MorphAnimMesh.prototype.setAnimationLabel = function(label, start, end){ if( !this.geometry.animations) this.geometry.animation = {}; this.geometry.animations[label] = {start: start, end: end}; } # 设置帧分组标签(为了给每组设置不同的播放速度) THREE.MorphAnimMesh.playAnimation('A', 33) # 播放标签为'A'的组动画,帧数(fps)为33帧/秒 THREE.MorphAnimMesh.prototype.updateAnimation = function(delta # delta表示实际浏览器每次刷新的间隔时间 # 作用: 主要更新lastKeyframe
-
- 使用
- Mesh组件
- Geometry
- THREE.Geometry();
- 空几何体
- geometry.vertices.push(p1);
- p1是一个点
- geometry.vertices.push(p2);
- geometry.colors.push( color1, color2 );
- 属性
- vertices
- 顶点数组
- colors
- morphColors
- 加载json模型后存储颜色的地方
- faces
- 面数组
- color
- faceVertexUvs
- 面法线数组
- 方法
- set # 设置纹理坐标
- faceVertexUvs[0][2][0].set(0, 0)
- faceVertexUvs[0][2][1].set(0, 0)
- faceVertexUvs[0][2][2].set(0, 0)
- faceVertexUvs[0][2][3].set(0, 0)
- 设置第2个面(顶面)的纹理坐标全部为0,这样就去掉了这个面的纹理坐标
- 第一维表示第几种纹理,第二维表示第几个面,第三维表示第几个顶点的纹理坐标
- set # 设置纹理坐标
- vertices
- BufferGeometry
- 一般编程中
- 物体的形状可以用一个类Geometry来表示
- 物体顶点内容如果放到缓冲区中,可以new分配连续的内存
- 物体和内存是分离的
- Tree.js中
- 物体和内存统一起来,形成了THREE.BufferGeometry
- THREE.BufferGeometry = Buffer + THREE.Geometry
- BufferGeometry是自由度最高的geometry类型
- 自由指定每个顶点的位置、颜色、法线(影响光照)
- Buffer就是将顶点位置数组、顶点颜色数组等放在一个缓冲区中,加快加载与运行速度。
- Buffer的这些缓冲区存储在BufferGeometry的属性attributes集合对象里面
- attributes初始化时为空 this.attributes = {};
- Buffer的这些缓冲区存储在BufferGeometry的属性attributes集合对象里面
- api
- var geometry = new THREE.BufferGeometry();
- THREE.BufferGeometry = function()
- var geometry = new THREE.BufferGeometry();
- 一般编程中
- IcosahedronGeometry
- 二十面体
- radius = 200
- geometry = new THREE.IcosahedronGeometry(radius, 1);
- faceIndices = [‘a’, ‘b’, ‘c’, ‘d’];
- for(var i = 0; i < geometry.faces.length; i++){
- f = geometry.faces[i];
- 得到第i个面
- n = (f instanceof THREE.Face3) ? 3 : 4;
- 判断每个面由几个点组成
- 每个点可以由f.a, f.b, f.c, f.d得到
- for(var j = 0; j < n; j++){
- vertexIndex = f[faceIndices[j]];
- 得到点在geometry中的索引
- p = geometry.vertices[vertexIndex];
- 得到点
- f.vertexColors[j] = color;
- 给面的顶点赋值
- 顶点默认颜色为白色
- 给面的顶点赋值
- vertexIndex = f[faceIndices[j]];
- }
- f = geometry.faces[i];
- }
- SphereGeometry
- var geometry = new THREE.SphereGeometry(70, 32, 16);
- 70是半径, 32和16表示横向和纵向球体由多少线分割
- var geometry = new THREE.SphereGeometry(70, 32, 16);
- BoxGeometry
- 介绍
- 原来的CubeGeometry
- 长立方体
- THREE.CubeGeometry = function(width, height, depth, widthSegments, heightSegments, depthSegments)
- 参数分别表示x y z轴长度和分别在x y z轴上被分成了几份
- THREE.CubeGeometry = function(width, height, depth, widthSegments, heightSegments, depthSegments)
- 介绍
- CylinderGeometry
- 圆柱体
- THREE.CylinderGeometry(100, 150, 400);
- 圆柱体
- PlaneGeometry # 平面
- TextGeometry
- 介绍
- 可以从字体文件中生成字体几何体
- THREE.TextGeometry = function(text, parameters)
- text是要显示的文字
- parameters包括
- size:
字体大小, 如80号是小字体 - height:
厚度 - curveSegments:
一条曲线上点的数目, 越多越精细 - font:
使用字体的名称 - weight:
`取值normal或bold, 如果字体中没有bold, 整个程序会崩溃 - style:
取值normal或italics(斜体), 没有italics也会崩溃
- size:
- 使用
- 在typeface上转换自己的字体
- http://typeface.neocracy.org/fonts.html
- 要求字体的签名是TrueType或OpenType
- 在Convert Font页面选择要转换的字,可以加快转换,也减少生成js文件的大小
- http://typeface.neocracy.org/fonts.html
- var text3d = new THREE.TextGeometry(‘要显示的字’, {
- size: 120,
- height: 30,
- curveSegments: 3,
- font: ‘simhei’,
- face: ‘simhei’,
- weight: ‘normal’
- 在typeface上转换自己的字体
- });
- 介绍
- THREE.Geometry();
- Material
- 使用
- THREE.LineBasicMaterial( parameters ); # 线材质
- 参数
- Color:线条的颜色,用16进制来表示,默认的颜色是白色。
- Linewidth:线条的宽度,默认时候1个单位宽度。
- Linecap:线条两端的外观,默认是圆角端点,当线条较粗的时候才看得出效果,如果线条很细,那么你几乎看不出效果了。
- Linejoin:两个线条的连接点处的外观,默认是“round”,表示圆角。
- VertexColors:定义线条材质是否使用顶点颜色,这是一个boolean值。意思是,线条各部分的颜色会根据顶点的颜色来进行插值。(如果关于插值不是很明白,可以QQ问我,QQ在前言中你一定能够找到,嘿嘿,虽然没有明确写出)。
- Fog:定义材质的颜色是否受全局雾效的影响。
- uniforms: 传入着色器中的固定变量, 如
- {
- scale: {type: ‘v2’, value: new THREE.Vector2()}
- }
- {
- uniforms: 传入着色器中的固定变量, 如
- 参数
- THREE.MeshBasicMaterial({color: 0x00ff00}); # mesh材质
- THREE.LineBasicMaterial( parameters ); # 线材质
- MeshBasicMaterial
- 介绍
- 是three.js中最基本的材质
- 功能
- 将mesh渲染成线框模式或平面模式
- 平面模式指表面渲染比较平整
- 将mesh渲染成线框模式或平面模式
- api
- new THREE.MeshBasicMaterial({
- color: 0xffaa00,
- transparent: true,
- 标志为true时颜色A分量(alpha)才起作用
- blending: THREE.AdditiveBlending
- 混合方式, 对应OpenGL ES中不同混合方式。表示怎么与背景结合
- OpenGL中有一个颜色缓冲区,存放每次渲染的颜色(目标颜色),新颜色(源颜色)可以与它混合,形成最新的颜色。
- 可以是THREE.NoBlending = 0
- 不混合。直接用新颜色覆盖以前的颜色
- THREE.NormalBlending = 1
- 将源颜色与目标颜色通过透明度正常混合
- THREE.AdditiveBlending = 2
- 加法混合
- THREE.SubtractiveBlending = 3
- 减法混合
- THREE.MultiplyBlending = 4
- 乘法混合
- THREE.CustomBlending = 5
- 自定义混合
- 混合方式, 对应OpenGL ES中不同混合方式。表示怎么与背景结合
- });
- new THREE.MeshBasicMaterial({
- color: 0xffaa00,
- wireframe: true
- });
- new THREE.MeshBasicMaterial({
- map: texture,
- transparent: true
- });
- new THREE.MeshBasicMaterial({
- 介绍
- MeshNormalMaterial
- 只支持以THREE.FlatShading模式来渲染Mesh, 不支持将Mesh渲染为线框模式
- MeshLambertMaterial
- 在灰暗或不光滑的表面产生的均匀散射而形成的材质类型。向各个方向均反射光线。如白纸
- new THREE.MeshLambertMaterial({
- color: 0xff6600, # 材质的颜色
- ambient: 0xff2200, # 受环境光情况
- envMap: textureCube, # 环境纹理,会将环境纹理映射到材质身上
- combine: THREE.MixOperation, # 与环境材质之间的混合方式
- reflectivity: 0.3 # 对反射光的反射系数
- })
- new THREE.MeshLambertMaterial({map:texture, transparent: true})
- 带透明的兰伯特材质, 可以看到球体另一边的颜色
- new THREE.MeshLambertMaterial({color: 0xdddddd, shading: THREE.FlatShading})
- 灰色,非平滑
- new THREE.MeshLambertMaterial({color: 0xdddddd, shading: THREE.SmoothShading})
- 灰色,平滑
- new THREE.MeshLambertMaterial({color: 0x666666, emissive: 0xff0000, ambient: 0x000000, shading: THREE.SmoothShading})
- emissive表示自发光
- MeshPhongMaterial
- 有明显高光区,适用于湿滑的,表面具有光泽的物体。如: 玻璃,水滴等
- 特点
- 会产生高光(球某一点在光线下特别亮)
- THREE.MeshPhongMaterial({ambient: 0x030303, color: 0xdddddd, specular: 0x009900, shininess: 30, shading: THREE.FloatShading})
- THREE.MeshPhongMaterial({ambient:0x030303, color:0xdddddd, specular: 0x009900, shininess: 30, shading: THREE.SmoothShading, map: texture, transparent: true})
- THREE.MeshPhongMaterial({color: 0x000000, specular: 0x666666, emissive: 0xff0000, ambient: 0x000000, shininess: 10, shading: THREE.SmoothShading, opacity: 0.9, transparent: true})
- MeshDepthMaterial
- 支持一些尝试测试的效果
- MeshFaceMaterial
- 面材质,它是一个材质数组。
- 有且仅有一个成员数组materials, 用来存放一组材质。
- 这组材质会被geometry的不同面所使用,来做到同一个物体不同面使用不同材质的效果。
- 每一个面使用什么材质由geometry中的索引决定
- ShaderMaterial
- 使用
- material = new THREE.ShaderMaterial({
- uniforms: uniforms,
- 一致变量数组,传递到两个着色器中使用
- vertexShader: document.getElementById(‘vertexShader’).textContent,
- 顶点着色器的代码
- fragmentShader: document.getElementById(‘fragmentShader’).textContent
- 片元着色器代码
- uniforms: uniforms,
- });
- uniforms = {
- time: {type: ‘f’, value: 1.0},
- 表示时间, f 代表浮点型
- resolution: {type: ‘v2’, value: new THREE.Vector2() }
- 表示浏览器窗口的宽度和高度,v2代表二维向量
- time: {type: ‘f’, value: 1.0},
- } # 该一致变量在绘制过程中不会改变,在顶点shader与片元shader之间用相同名字来共享
- 一致变量在不同图元中会改变
- uniforms.resolution.value.x = window.innerWidth
- uniforms.time.value += 0.005
- 通过value改变uniforms中变量的值
- material = new THREE.ShaderMaterial({
- 使用
- 使用
- Texture
- 例子
-
var geometry = new THREE.PlaneGeometry( 500, 300, 1, 1 ); geometry.vertices[0].uv = new THREE.Vector2(0,0); geometry.vertices[1].uv = new THREE.Vector2(2,0); geometry.vertices[2].uv = new THREE.Vector2(2,2); geometry.vertices[3].uv = new THREE.Vector2(0,2); # 平面有4个纹理坐标。由顶点的成员nv表示,nv是一个二维向量,对应到纹理坐标 var texture = THREE.ImageUtils.loadTexture("textures/a.jpg",null,function(t){}); var material = new THREE.MeshBasicMaterial({map:texture}); var mesh = new THREE.Mesh( geometry,material ); scene.add( mesh );
-
- 例子2(canvas)
-
var geometry = new THREE.CubeGeometry(150, 150, 150); texture = new THREE.Texture(canvas); # 默认情况下,纹理被均匀地分配到四边形的各个顶点上。 var material = new THREE.MeshBasicMaterial({map: texture}); texture.needsUpdate = true; # 如果canvas中有动画的话,要设置纹理更新。而且每requestAnimationFrame渲染一帧动画,都要对texture.needsUpdate设置一遍true。如果不更新,显示黑色正方体。 ## 黑色正方体原因: js异步运行,canvas绘制时钟需要时间, three.js已经开始渲染图形了,这时候canvas没有绘制完成,就显示材质本身的颜色。 mesh = new THREE.Mesh(geometry, material); scene.add(mesh);
-
- Mapping
- UVMapping
- Filter
- LinearFilter
- Wrapping
- RepeatWrapping
- 例子
- Color
- THREE.Color()
- THREE.Color( 0x444444 );
- Vector3
- THREE.Vecotor3(4,8,9);
- THREE.Vector3();
- point1.set(4,8,9);
- Quaternion
- 介绍
- 四元组
- api
- THREE.Quaternion = function(x, y, z, w){
- this._x = x || 0;
- this._y = y || 0;
- this._z = z || 0;
- this._w = (w !== undefined) ? w : 1;
- }
- setFromAxisAngle: function(axis, angle)
- Quaternion的静态方法
- axis是向量,表示轴, angle表示弧度
- 返回一个四元组
- Quaternion的静态方法
- setFromEuler: function(euler, update)
- 欧拉角转为四元组
- setFromRotationMatrix: function(m)
- 把矩阵转为欧拉角
- THREE.Quaternion = function(x, y, z, w){
- 介绍
- Geometry
- Fog
- scene.fog = new THREE.Fog(0x999999, 0.1, 8000);
- THREE.Fog = function(hex, near, far)
- hex为颜色, near是雾开始的地方, far是雾结束的地方
- Object3D
- new THREE.Object3D();
- Ray
- 介绍
- 一条射线
- ray = new THREE.Ray(camera.position);
- 传入起点
- 介绍