소스 검색

Merge pull request #1 from mrdoob/dev

Newest dev from mrdoob's repo
soadzoor 6 년 전
부모
커밋
3f92b72a53
100개의 변경된 파일2418개의 추가작업 그리고 2421개의 파일을 삭제
  1. 1 1
      .github/ISSUE_TEMPLATE.md
  2. 197 114
      build/three.js
  3. 406 402
      build/three.min.js
  4. 197 114
      build/three.module.js
  5. 6 3
      docs/api/en/audio/Audio.html
  6. 2 0
      docs/api/en/audio/AudioListener.html
  7. 6 4
      docs/api/en/core/BufferGeometry.html
  8. 0 1
      docs/api/en/core/Face3.html
  9. 2 1
      docs/api/en/core/Geometry.html
  10. 0 1
      docs/api/en/lights/DirectionalLight.html
  11. 1 2
      docs/api/en/loaders/JSONLoader.html
  12. 0 2
      docs/api/en/materials/SpriteMaterial.html
  13. 3 0
      docs/api/zh/audio/Audio.html
  14. 2 0
      docs/api/zh/audio/AudioListener.html
  15. 5 5
      docs/api/zh/cameras/ArrayCamera.html
  16. 1 1
      docs/api/zh/core/BufferAttribute.html
  17. 1 1
      docs/api/zh/core/Clock.html
  18. 1 1
      docs/api/zh/core/DirectGeometry.html
  19. 1 1
      docs/api/zh/core/EventDispatcher.html
  20. 1 2
      docs/api/zh/core/Face3.html
  21. 1 1
      docs/api/zh/core/Geometry.html
  22. 1 1
      docs/api/zh/core/InstancedBufferAttribute.html
  23. 1 1
      docs/api/zh/core/InstancedBufferGeometry.html
  24. 1 1
      docs/api/zh/core/InstancedInterleavedBuffer.html
  25. 1 1
      docs/api/zh/core/InterleavedBuffer.html
  26. 1 1
      docs/api/zh/core/InterleavedBufferAttribute.html
  27. 1 1
      docs/api/zh/core/Layers.html
  28. 1 1
      docs/api/zh/core/Uniform.html
  29. 1 1
      docs/api/zh/core/bufferAttributeTypes/BufferAttributeTypes.html
  30. 1 1
      docs/api/zh/geometries/PolyhedronGeometry.html
  31. 0 1
      docs/api/zh/lights/DirectionalLight.html
  32. 0 2
      docs/api/zh/materials/SpriteMaterial.html
  33. 92 105
      docs/api/zh/math/Box3.html
  34. 96 103
      docs/api/zh/math/Color.html
  35. 17 19
      docs/api/zh/math/Cylindrical.html
  36. 64 75
      docs/api/zh/math/Euler.html
  37. 33 36
      docs/api/zh/math/Frustum.html
  38. 10 11
      docs/api/zh/math/Interpolant.html
  39. 34 40
      docs/api/zh/math/Line3.html
  40. 38 43
      docs/api/zh/math/Math.html
  41. 63 71
      docs/api/zh/math/Matrix3.html
  42. 109 130
      docs/api/zh/math/Matrix4.html
  43. 1 1
      docs/api/zh/math/Plane.html
  44. 28 28
      docs/api/zh/textures/CanvasTexture.html
  45. 32 32
      docs/api/zh/textures/CompressedTexture.html
  46. 11 12
      docs/api/zh/textures/CubeTexture.html
  47. 12 12
      docs/api/zh/textures/DataTexture3D.html
  48. 40 41
      docs/api/zh/textures/DepthTexture.html
  49. 92 95
      docs/api/zh/textures/Texture.html
  50. 31 31
      docs/api/zh/textures/VideoTexture.html
  51. 1 1
      docs/examples/loaders/SVGLoader.html
  52. 3 2
      docs/examples/utils/BufferGeometryUtils.html
  53. 4 4
      docs/examples/utils/SceneUtils.html
  54. 50 49
      docs/list.js
  55. 84 0
      docs/manual/zh/introduction/How-to-create-VR-content.html
  56. 17 19
      docs/manual/zh/introduction/How-to-use-WebGL2.html
  57. 1 0
      editor/css/dark.css
  58. 1 0
      editor/css/light.css
  59. 2 2
      editor/js/Menubar.Play.js
  60. 3 1
      editor/js/Menubar.Status.js
  61. 8 6
      editor/js/Sidebar.Geometry.BoxGeometry.js
  62. 4 2
      editor/js/Sidebar.Geometry.BufferGeometry.js
  63. 6 4
      editor/js/Sidebar.Geometry.CircleGeometry.js
  64. 8 6
      editor/js/Sidebar.Geometry.CylinderGeometry.js
  65. 4 2
      editor/js/Sidebar.Geometry.Geometry.js
  66. 4 2
      editor/js/Sidebar.Geometry.IcosahedronGeometry.js
  67. 6 4
      editor/js/Sidebar.Geometry.LatheGeometry.js
  68. 6 4
      editor/js/Sidebar.Geometry.PlaneGeometry.js
  69. 9 7
      editor/js/Sidebar.Geometry.SphereGeometry.js
  70. 7 5
      editor/js/Sidebar.Geometry.TorusGeometry.js
  71. 8 6
      editor/js/Sidebar.Geometry.TorusKnotGeometry.js
  72. 8 5
      editor/js/Sidebar.Geometry.js
  73. 4 2
      editor/js/Sidebar.History.js
  74. 55 52
      editor/js/Sidebar.Material.js
  75. 26 24
      editor/js/Sidebar.Object.js
  76. 4 4
      editor/js/Sidebar.Project.js
  77. 7 5
      editor/js/Sidebar.Script.js
  78. 2 2
      editor/js/Sidebar.Settings.js
  79. 322 0
      editor/js/Strings.js
  80. 1 3
      examples/files.js
  81. 0 141
      examples/js/UCSCharacter.js
  82. 2 2
      examples/js/controls/MapControls.js
  83. 2 2
      examples/js/controls/OrbitControls.js
  84. 8 7
      examples/js/geometries/hilbert2D.js
  85. 12 16
      examples/js/geometries/hilbert3D.js
  86. 36 27
      examples/js/loaders/DRACOLoader.js
  87. 31 15
      examples/js/loaders/GLTFLoader.js
  88. 2 2
      examples/js/loaders/HDRCubeTextureLoader.js
  89. 1 1
      examples/js/loaders/VRMLLoader.js
  90. 9 2
      examples/js/postprocessing/SMAAPass.js
  91. 1 0
      examples/js/utils/BufferGeometryUtils.js
  92. 3 3
      examples/misc_boxselection.html
  93. 0 201
      examples/misc_lights_test.html
  94. 0 225
      examples/misc_ubiquity_test2.html
  95. BIN
      examples/models/skinned/UCS/skins/Asian_Male.jpg
  96. BIN
      examples/models/skinned/UCS/skins/Black_Female.jpg
  97. BIN
      examples/models/skinned/UCS/skins/Caucasion_Female.jpg
  98. BIN
      examples/models/skinned/UCS/skins/Caucasion_Male.jpg
  99. BIN
      examples/models/skinned/UCS/skins/Highlighted_Muscles.jpg
  100. BIN
      examples/models/skinned/UCS/skins/Indian_Male.jpg

+ 1 - 1
.github/ISSUE_TEMPLATE.md

@@ -19,7 +19,7 @@ Please also include a live example if possible. You can start from these templat
 ##### Three.js version
 ##### Three.js version
 
 
 - [ ] Dev
 - [ ] Dev
-- [ ] r97
+- [ ] r98
 - [ ] ...
 - [ ] ...
 
 
 ##### Browser
 ##### Browser

+ 197 - 114
build/three.js

@@ -185,7 +185,7 @@
 
 
 	} );
 	} );
 
 
-	var REVISION = '98dev';
+	var REVISION = '99dev';
 	var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };
 	var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };
 	var CullFaceNone = 0;
 	var CullFaceNone = 0;
 	var CullFaceBack = 1;
 	var CullFaceBack = 1;
@@ -6164,11 +6164,11 @@
 
 
 	var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";
 	var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";
 
 
-	var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tgl_FragColor = texture2D( t2D, vUv );\n}\n";
+	var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}\n";
 
 
-	var background_vert = "varying vec2 vUv;\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4( position, 1.0 );\n\tgl_Position.z = 1.0;\n}\n";
+	var background_vert = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}\n";
 
 
-	var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";
+	var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = envMapTexelToLinear( texColor );\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}\n";
 
 
 	var cube_vert = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";
 	var cube_vert = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";
 
 
@@ -7400,6 +7400,7 @@
 		background: {
 		background: {
 
 
 			uniforms: {
 			uniforms: {
+				uvTransform: { value: new Matrix3() },
 				t2D: { value: null },
 				t2D: { value: null },
 			},
 			},
 
 
@@ -14624,6 +14625,7 @@
 					boxMesh = new Mesh(
 					boxMesh = new Mesh(
 						new BoxBufferGeometry( 1, 1, 1 ),
 						new BoxBufferGeometry( 1, 1, 1 ),
 						new ShaderMaterial( {
 						new ShaderMaterial( {
+							type: 'BackgroundCubeMaterial',
 							uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ),
 							uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ),
 							vertexShader: ShaderLib.cube.vertexShader,
 							vertexShader: ShaderLib.cube.vertexShader,
 							fragmentShader: ShaderLib.cube.fragmentShader,
 							fragmentShader: ShaderLib.cube.fragmentShader,
@@ -14643,6 +14645,17 @@
 
 
 					};
 					};
 
 
+					// enable code injection for non-built-in material
+					Object.defineProperty( boxMesh.material, 'envMap', {
+
+						get: function () {
+
+							return this.uniforms.tCube.value;
+
+						}
+
+					} );
+
 					objects.update( boxMesh );
 					objects.update( boxMesh );
 
 
 				}
 				}
@@ -14660,6 +14673,7 @@
 					planeMesh = new Mesh(
 					planeMesh = new Mesh(
 						new PlaneBufferGeometry( 2, 2 ),
 						new PlaneBufferGeometry( 2, 2 ),
 						new ShaderMaterial( {
 						new ShaderMaterial( {
+							type: 'BackgroundMaterial',
 							uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ),
 							uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ),
 							vertexShader: ShaderLib.background.vertexShader,
 							vertexShader: ShaderLib.background.vertexShader,
 							fragmentShader: ShaderLib.background.fragmentShader,
 							fragmentShader: ShaderLib.background.fragmentShader,
@@ -14672,12 +14686,31 @@
 
 
 					planeMesh.geometry.removeAttribute( 'normal' );
 					planeMesh.geometry.removeAttribute( 'normal' );
 
 
+					// enable code injection for non-built-in material
+					Object.defineProperty( planeMesh.material, 'map', {
+
+						get: function () {
+
+							return this.uniforms.t2D.value;
+
+						}
+
+					} );
+
 					objects.update( planeMesh );
 					objects.update( planeMesh );
 
 
 				}
 				}
 
 
 				planeMesh.material.uniforms.t2D.value = background;
 				planeMesh.material.uniforms.t2D.value = background;
 
 
+				if ( background.matrixAutoUpdate === true ) {
+
+					background.updateMatrix();
+
+				}
+
+				planeMesh.material.uniforms.uvTransform.value.copy( background.matrix );
+
 				// push to the pre-sorted opaque render list
 				// push to the pre-sorted opaque render list
 				renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null );
 				renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null );
 
 
@@ -17788,15 +17821,23 @@
 
 
 		function get( scene, camera ) {
 		function get( scene, camera ) {
 
 
-			var hash = scene.id + ',' + camera.id;
-			var list = lists[ hash ];
+			var cameras = lists[ scene.id ];
+			var list;
+			if ( cameras === undefined ) {
 
 
-			if ( list === undefined ) {
+				list = new WebGLRenderList();
+				lists[ scene.id ] = {};
+				lists[ scene.id ][ camera.id ] = list;
 
 
-				// console.log( 'THREE.WebGLRenderLists:', hash );
+			} else {
 
 
-				list = new WebGLRenderList();
-				lists[ hash ] = list;
+				list = cameras[ camera.id ];
+				if ( list === undefined ) {
+
+					list = new WebGLRenderList();
+					cameras[ camera.id ] = list;
+
+				}
 
 
 			}
 			}
 
 
@@ -26375,6 +26416,11 @@
 
 
 		Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
 		Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
 
 
+		this.format = format !== undefined ? format : RGBFormat;
+
+		this.minFilter = minFilter !== undefined ? minFilter : LinearFilter;
+		this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
+
 		this.generateMipmaps = false;
 		this.generateMipmaps = false;
 
 
 	}
 	}
@@ -33933,8 +33979,8 @@
 
 
 						if ( onError ) onError( error );
 						if ( onError ) onError( error );
 
 
-						scope.manager.itemEnd( url );
 						scope.manager.itemError( url );
 						scope.manager.itemError( url );
+						scope.manager.itemEnd( url );
 
 
 					}, 0 );
 					}, 0 );
 
 
@@ -33993,8 +34039,8 @@
 
 
 						}
 						}
 
 
-						scope.manager.itemEnd( url );
 						scope.manager.itemError( url );
 						scope.manager.itemError( url );
+						scope.manager.itemEnd( url );
 
 
 					}
 					}
 
 
@@ -34026,8 +34072,8 @@
 
 
 					}
 					}
 
 
-					scope.manager.itemEnd( url );
 					scope.manager.itemError( url );
 					scope.manager.itemError( url );
+					scope.manager.itemEnd( url );
 
 
 				}, false );
 				}, false );
 
 
@@ -34044,8 +34090,8 @@
 
 
 					}
 					}
 
 
-					scope.manager.itemEnd( url );
 					scope.manager.itemError( url );
 					scope.manager.itemError( url );
+					scope.manager.itemEnd( url );
 
 
 				}, false );
 				}, false );
 
 
@@ -34324,11 +34370,11 @@
 
 
 				if ( ! texData ) return;
 				if ( ! texData ) return;
 
 
-				if ( undefined !== texData.image ) {
+				if ( texData.image !== undefined ) {
 
 
 					texture.image = texData.image;
 					texture.image = texData.image;
 
 
-				} else if ( undefined !== texData.data ) {
+				} else if ( texData.data !== undefined ) {
 
 
 					texture.image.width = texData.width;
 					texture.image.width = texData.width;
 					texture.image.height = texData.height;
 					texture.image.height = texData.height;
@@ -34336,32 +34382,32 @@
 
 
 				}
 				}
 
 
-				texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;
-				texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;
+				texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;
+				texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;
 
 
-				texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;
-				texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;
+				texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;
+				texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearMipMapLinearFilter;
 
 
-				texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;
+				texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;
 
 
-				if ( undefined !== texData.format ) {
+				if ( texData.format !== undefined ) {
 
 
 					texture.format = texData.format;
 					texture.format = texData.format;
 
 
 				}
 				}
-				if ( undefined !== texData.type ) {
+				if ( texData.type !== undefined ) {
 
 
 					texture.type = texData.type;
 					texture.type = texData.type;
 
 
 				}
 				}
 
 
-				if ( undefined !== texData.mipmaps ) {
+				if ( texData.mipmaps !== undefined ) {
 
 
 					texture.mipmaps = texData.mipmaps;
 					texture.mipmaps = texData.mipmaps;
 
 
 				}
 				}
 
 
-				if ( 1 === texData.mipmapCount ) {
+				if ( texData.mipmapCount === 1 ) {
 
 
 					texture.minFilter = LinearFilter;
 					texture.minFilter = LinearFilter;
 
 
@@ -34452,8 +34498,8 @@
 
 
 				if ( onError ) onError( event );
 				if ( onError ) onError( event );
 
 
-				scope.manager.itemEnd( url );
 				scope.manager.itemError( url );
 				scope.manager.itemError( url );
+				scope.manager.itemEnd( url );
 
 
 			}
 			}
 
 
@@ -38861,6 +38907,7 @@
 
 
 		parseMaterials: function ( json, textures ) {
 		parseMaterials: function ( json, textures ) {
 
 
+			var cache = {}; // MultiMaterial
 			var materials = {};
 			var materials = {};
 
 
 			if ( json !== undefined ) {
 			if ( json !== undefined ) {
@@ -38880,7 +38927,15 @@
 
 
 						for ( var j = 0; j < data.materials.length; j ++ ) {
 						for ( var j = 0; j < data.materials.length; j ++ ) {
 
 
-							array.push( loader.parse( data.materials[ j ] ) );
+							var material = data.materials[ j ];
+
+							if ( cache[ material.uuid ] === undefined ) {
+
+								cache[ material.uuid ] = loader.parse( material );
+
+							}
+
+							array.push( cache[ material.uuid ] );
 
 
 						}
 						}
 
 
@@ -38889,6 +38944,7 @@
 					} else {
 					} else {
 
 
 						materials[ data.uuid ] = loader.parse( data );
 						materials[ data.uuid ] = loader.parse( data );
+						cache[ data.uuid ] = materials[ data.uuid ];
 
 
 					}
 					}
 
 
@@ -38935,8 +38991,8 @@
 
 
 				}, undefined, function () {
 				}, undefined, function () {
 
 
-					scope.manager.itemEnd( url );
 					scope.manager.itemError( url );
 					scope.manager.itemError( url );
+					scope.manager.itemEnd( url );
 
 
 				} );
 				} );
 
 
@@ -39466,8 +39522,8 @@
 
 
 				if ( onError ) onError( e );
 				if ( onError ) onError( e );
 
 
-				scope.manager.itemEnd( url );
 				scope.manager.itemError( url );
 				scope.manager.itemError( url );
+				scope.manager.itemEnd( url );
 
 
 			} );
 			} );
 
 
@@ -40233,6 +40289,77 @@
 	CubeCamera.prototype = Object.create( Object3D.prototype );
 	CubeCamera.prototype = Object.create( Object3D.prototype );
 	CubeCamera.prototype.constructor = CubeCamera;
 	CubeCamera.prototype.constructor = CubeCamera;
 
 
+	/**
+	 * @author alteredq / http://alteredqualia.com/
+	 */
+
+	function Clock( autoStart ) {
+
+		this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
+
+		this.startTime = 0;
+		this.oldTime = 0;
+		this.elapsedTime = 0;
+
+		this.running = false;
+
+	}
+
+	Object.assign( Clock.prototype, {
+
+		start: function () {
+
+			this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
+
+			this.oldTime = this.startTime;
+			this.elapsedTime = 0;
+			this.running = true;
+
+		},
+
+		stop: function () {
+
+			this.getElapsedTime();
+			this.running = false;
+			this.autoStart = false;
+
+		},
+
+		getElapsedTime: function () {
+
+			this.getDelta();
+			return this.elapsedTime;
+
+		},
+
+		getDelta: function () {
+
+			var diff = 0;
+
+			if ( this.autoStart && ! this.running ) {
+
+				this.start();
+				return 0;
+
+			}
+
+			if ( this.running ) {
+
+				var newTime = ( typeof performance === 'undefined' ? Date : performance ).now();
+
+				diff = ( newTime - this.oldTime ) / 1000;
+				this.oldTime = newTime;
+
+				this.elapsedTime += diff;
+
+			}
+
+			return diff;
+
+		}
+
+	} );
+
 	/**
 	/**
 	 * @author mrdoob / http://mrdoob.com/
 	 * @author mrdoob / http://mrdoob.com/
 	 */
 	 */
@@ -40250,6 +40377,8 @@
 
 
 		this.filter = null;
 		this.filter = null;
 
 
+		this.timeDelta = 0;
+
 	}
 	}
 
 
 	AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
 	AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
@@ -40325,6 +40454,7 @@
 			var scale = new Vector3();
 			var scale = new Vector3();
 
 
 			var orientation = new Vector3();
 			var orientation = new Vector3();
+			var clock = new Clock();
 
 
 			return function updateMatrixWorld( force ) {
 			return function updateMatrixWorld( force ) {
 
 
@@ -40333,21 +40463,27 @@
 				var listener = this.context.listener;
 				var listener = this.context.listener;
 				var up = this.up;
 				var up = this.up;
 
 
+				this.timeDelta = clock.getDelta();
+
 				this.matrixWorld.decompose( position, quaternion, scale );
 				this.matrixWorld.decompose( position, quaternion, scale );
 
 
 				orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
 				orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
 
 
 				if ( listener.positionX ) {
 				if ( listener.positionX ) {
 
 
-					listener.positionX.setValueAtTime( position.x, this.context.currentTime );
-					listener.positionY.setValueAtTime( position.y, this.context.currentTime );
-					listener.positionZ.setValueAtTime( position.z, this.context.currentTime );
-					listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );
-					listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );
-					listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );
-					listener.upX.setValueAtTime( up.x, this.context.currentTime );
-					listener.upY.setValueAtTime( up.y, this.context.currentTime );
-					listener.upZ.setValueAtTime( up.z, this.context.currentTime );
+					// code path for Chrome (see #14393)
+
+					var endTime = this.context.currentTime + this.timeDelta;
+
+					listener.positionX.linearRampToValueAtTime( position.x, endTime );
+					listener.positionY.linearRampToValueAtTime( position.y, endTime );
+					listener.positionZ.linearRampToValueAtTime( position.z, endTime );
+					listener.forwardX.linearRampToValueAtTime( orientation.x, endTime );
+					listener.forwardY.linearRampToValueAtTime( orientation.y, endTime );
+					listener.forwardZ.linearRampToValueAtTime( orientation.z, endTime );
+					listener.upX.linearRampToValueAtTime( up.x, endTime );
+					listener.upY.linearRampToValueAtTime( up.y, endTime );
+					listener.upZ.linearRampToValueAtTime( up.z, endTime );
 
 
 				} else {
 				} else {
 
 
@@ -40373,6 +40509,7 @@
 
 
 		this.type = 'Audio';
 		this.type = 'Audio';
 
 
+		this.listener = listener;
 		this.context = listener.context;
 		this.context = listener.context;
 
 
 		this.gain = this.context.createGain();
 		this.gain = this.context.createGain();
@@ -40784,8 +40921,25 @@
 
 
 				orientation.set( 0, 0, 1 ).applyQuaternion( quaternion );
 				orientation.set( 0, 0, 1 ).applyQuaternion( quaternion );
 
 
-				panner.setPosition( position.x, position.y, position.z );
-				panner.setOrientation( orientation.x, orientation.y, orientation.z );
+				if ( panner.positionX ) {
+
+					// code path for Chrome and Firefox (see #14393)
+
+					var endTime = this.context.currentTime + this.listener.timeDelta;
+
+					panner.positionX.linearRampToValueAtTime( position.x, endTime );
+					panner.positionY.linearRampToValueAtTime( position.y, endTime );
+					panner.positionZ.linearRampToValueAtTime( position.z, endTime );
+					panner.orientationX.linearRampToValueAtTime( orientation.x, endTime );
+					panner.orientationY.linearRampToValueAtTime( orientation.y, endTime );
+					panner.orientationZ.linearRampToValueAtTime( orientation.z, endTime );
+
+				} else {
+
+					panner.setPosition( position.x, position.y, position.z );
+					panner.setOrientation( orientation.x, orientation.y, orientation.z );
+
+				}
 
 
 			};
 			};
 
 
@@ -43821,77 +43975,6 @@
 
 
 	} );
 	} );
 
 
-	/**
-	 * @author alteredq / http://alteredqualia.com/
-	 */
-
-	function Clock( autoStart ) {
-
-		this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
-
-		this.startTime = 0;
-		this.oldTime = 0;
-		this.elapsedTime = 0;
-
-		this.running = false;
-
-	}
-
-	Object.assign( Clock.prototype, {
-
-		start: function () {
-
-			this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
-
-			this.oldTime = this.startTime;
-			this.elapsedTime = 0;
-			this.running = true;
-
-		},
-
-		stop: function () {
-
-			this.getElapsedTime();
-			this.running = false;
-			this.autoStart = false;
-
-		},
-
-		getElapsedTime: function () {
-
-			this.getDelta();
-			return this.elapsedTime;
-
-		},
-
-		getDelta: function () {
-
-			var diff = 0;
-
-			if ( this.autoStart && ! this.running ) {
-
-				this.start();
-				return 0;
-
-			}
-
-			if ( this.running ) {
-
-				var newTime = ( typeof performance === 'undefined' ? Date : performance ).now();
-
-				diff = ( newTime - this.oldTime ) / 1000;
-				this.oldTime = newTime;
-
-				this.elapsedTime += diff;
-
-			}
-
-			return diff;
-
-		}
-
-	} );
-
 	/**
 	/**
 	 * @author bhouston / http://clara.io
 	 * @author bhouston / http://clara.io
 	 * @author WestLangley / http://github.com/WestLangley
 	 * @author WestLangley / http://github.com/WestLangley
@@ -44825,7 +44908,7 @@
 
 
 
 
 		/*
 		/*
-		var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
+		var distanceGeometry = new THREE.IcosahedronBufferGeometry( 1, 2 );
 		var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
 		var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
 
 
 		this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
 		this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
@@ -45354,7 +45437,7 @@
 			v2.setFromMatrixPosition( this.light.target.matrixWorld );
 			v2.setFromMatrixPosition( this.light.target.matrixWorld );
 			v3.subVectors( v2, v1 );
 			v3.subVectors( v2, v1 );
 
 
-			this.lightPlane.lookAt( v3 );
+			this.lightPlane.lookAt( v2 );
 
 
 			if ( this.color !== undefined ) {
 			if ( this.color !== undefined ) {
 
 
@@ -45368,7 +45451,7 @@
 
 
 			}
 			}
 
 
-			this.targetLine.lookAt( v3 );
+			this.targetLine.lookAt( v2 );
 			this.targetLine.scale.z = v3.length();
 			this.targetLine.scale.z = v3.length();
 
 
 		};
 		};

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 406 - 402
build/three.min.js


+ 197 - 114
build/three.module.js

@@ -179,7 +179,7 @@ Object.assign( EventDispatcher.prototype, {
 
 
 } );
 } );
 
 
-var REVISION = '98dev';
+var REVISION = '99dev';
 var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };
 var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };
 var CullFaceNone = 0;
 var CullFaceNone = 0;
 var CullFaceBack = 1;
 var CullFaceBack = 1;
@@ -6158,11 +6158,11 @@ var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 =
 
 
 var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";
 var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";
 
 
-var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tgl_FragColor = texture2D( t2D, vUv );\n}\n";
+var background_frag = "uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}\n";
 
 
-var background_vert = "varying vec2 vUv;\nvoid main() {\n\tvUv = uv;\n\tgl_Position = vec4( position, 1.0 );\n\tgl_Position.z = 1.0;\n}\n";
+var background_vert = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}\n";
 
 
-var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";
+var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = envMapTexelToLinear( texColor );\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}\n";
 
 
 var cube_vert = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";
 var cube_vert = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";
 
 
@@ -7394,6 +7394,7 @@ var ShaderLib = {
 	background: {
 	background: {
 
 
 		uniforms: {
 		uniforms: {
+			uvTransform: { value: new Matrix3() },
 			t2D: { value: null },
 			t2D: { value: null },
 		},
 		},
 
 
@@ -14618,6 +14619,7 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
 				boxMesh = new Mesh(
 				boxMesh = new Mesh(
 					new BoxBufferGeometry( 1, 1, 1 ),
 					new BoxBufferGeometry( 1, 1, 1 ),
 					new ShaderMaterial( {
 					new ShaderMaterial( {
+						type: 'BackgroundCubeMaterial',
 						uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ),
 						uniforms: UniformsUtils.clone( ShaderLib.cube.uniforms ),
 						vertexShader: ShaderLib.cube.vertexShader,
 						vertexShader: ShaderLib.cube.vertexShader,
 						fragmentShader: ShaderLib.cube.fragmentShader,
 						fragmentShader: ShaderLib.cube.fragmentShader,
@@ -14637,6 +14639,17 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
 
 
 				};
 				};
 
 
+				// enable code injection for non-built-in material
+				Object.defineProperty( boxMesh.material, 'envMap', {
+
+					get: function () {
+
+						return this.uniforms.tCube.value;
+
+					}
+
+				} );
+
 				objects.update( boxMesh );
 				objects.update( boxMesh );
 
 
 			}
 			}
@@ -14654,6 +14667,7 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
 				planeMesh = new Mesh(
 				planeMesh = new Mesh(
 					new PlaneBufferGeometry( 2, 2 ),
 					new PlaneBufferGeometry( 2, 2 ),
 					new ShaderMaterial( {
 					new ShaderMaterial( {
+						type: 'BackgroundMaterial',
 						uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ),
 						uniforms: UniformsUtils.clone( ShaderLib.background.uniforms ),
 						vertexShader: ShaderLib.background.vertexShader,
 						vertexShader: ShaderLib.background.vertexShader,
 						fragmentShader: ShaderLib.background.fragmentShader,
 						fragmentShader: ShaderLib.background.fragmentShader,
@@ -14666,12 +14680,31 @@ function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {
 
 
 				planeMesh.geometry.removeAttribute( 'normal' );
 				planeMesh.geometry.removeAttribute( 'normal' );
 
 
+				// enable code injection for non-built-in material
+				Object.defineProperty( planeMesh.material, 'map', {
+
+					get: function () {
+
+						return this.uniforms.t2D.value;
+
+					}
+
+				} );
+
 				objects.update( planeMesh );
 				objects.update( planeMesh );
 
 
 			}
 			}
 
 
 			planeMesh.material.uniforms.t2D.value = background;
 			planeMesh.material.uniforms.t2D.value = background;
 
 
+			if ( background.matrixAutoUpdate === true ) {
+
+				background.updateMatrix();
+
+			}
+
+			planeMesh.material.uniforms.uvTransform.value.copy( background.matrix );
+
 			// push to the pre-sorted opaque render list
 			// push to the pre-sorted opaque render list
 			renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null );
 			renderList.push( planeMesh, planeMesh.geometry, planeMesh.material, 0, null );
 
 
@@ -17782,15 +17815,23 @@ function WebGLRenderLists() {
 
 
 	function get( scene, camera ) {
 	function get( scene, camera ) {
 
 
-		var hash = scene.id + ',' + camera.id;
-		var list = lists[ hash ];
+		var cameras = lists[ scene.id ];
+		var list;
+		if ( cameras === undefined ) {
 
 
-		if ( list === undefined ) {
+			list = new WebGLRenderList();
+			lists[ scene.id ] = {};
+			lists[ scene.id ][ camera.id ] = list;
 
 
-			// console.log( 'THREE.WebGLRenderLists:', hash );
+		} else {
 
 
-			list = new WebGLRenderList();
-			lists[ hash ] = list;
+			list = cameras[ camera.id ];
+			if ( list === undefined ) {
+
+				list = new WebGLRenderList();
+				cameras[ camera.id ] = list;
+
+			}
 
 
 		}
 		}
 
 
@@ -26369,6 +26410,11 @@ function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, forma
 
 
 	Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
 	Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
 
 
+	this.format = format !== undefined ? format : RGBFormat;
+
+	this.minFilter = minFilter !== undefined ? minFilter : LinearFilter;
+	this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
+
 	this.generateMipmaps = false;
 	this.generateMipmaps = false;
 
 
 }
 }
@@ -33927,8 +33973,8 @@ Object.assign( FileLoader.prototype, {
 
 
 					if ( onError ) onError( error );
 					if ( onError ) onError( error );
 
 
-					scope.manager.itemEnd( url );
 					scope.manager.itemError( url );
 					scope.manager.itemError( url );
+					scope.manager.itemEnd( url );
 
 
 				}, 0 );
 				}, 0 );
 
 
@@ -33987,8 +34033,8 @@ Object.assign( FileLoader.prototype, {
 
 
 					}
 					}
 
 
-					scope.manager.itemEnd( url );
 					scope.manager.itemError( url );
 					scope.manager.itemError( url );
+					scope.manager.itemEnd( url );
 
 
 				}
 				}
 
 
@@ -34020,8 +34066,8 @@ Object.assign( FileLoader.prototype, {
 
 
 				}
 				}
 
 
-				scope.manager.itemEnd( url );
 				scope.manager.itemError( url );
 				scope.manager.itemError( url );
+				scope.manager.itemEnd( url );
 
 
 			}, false );
 			}, false );
 
 
@@ -34038,8 +34084,8 @@ Object.assign( FileLoader.prototype, {
 
 
 				}
 				}
 
 
-				scope.manager.itemEnd( url );
 				scope.manager.itemError( url );
 				scope.manager.itemError( url );
+				scope.manager.itemEnd( url );
 
 
 			}, false );
 			}, false );
 
 
@@ -34318,11 +34364,11 @@ Object.assign( DataTextureLoader.prototype, {
 
 
 			if ( ! texData ) return;
 			if ( ! texData ) return;
 
 
-			if ( undefined !== texData.image ) {
+			if ( texData.image !== undefined ) {
 
 
 				texture.image = texData.image;
 				texture.image = texData.image;
 
 
-			} else if ( undefined !== texData.data ) {
+			} else if ( texData.data !== undefined ) {
 
 
 				texture.image.width = texData.width;
 				texture.image.width = texData.width;
 				texture.image.height = texData.height;
 				texture.image.height = texData.height;
@@ -34330,32 +34376,32 @@ Object.assign( DataTextureLoader.prototype, {
 
 
 			}
 			}
 
 
-			texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;
-			texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;
+			texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;
+			texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;
 
 
-			texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;
-			texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;
+			texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;
+			texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearMipMapLinearFilter;
 
 
-			texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;
+			texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;
 
 
-			if ( undefined !== texData.format ) {
+			if ( texData.format !== undefined ) {
 
 
 				texture.format = texData.format;
 				texture.format = texData.format;
 
 
 			}
 			}
-			if ( undefined !== texData.type ) {
+			if ( texData.type !== undefined ) {
 
 
 				texture.type = texData.type;
 				texture.type = texData.type;
 
 
 			}
 			}
 
 
-			if ( undefined !== texData.mipmaps ) {
+			if ( texData.mipmaps !== undefined ) {
 
 
 				texture.mipmaps = texData.mipmaps;
 				texture.mipmaps = texData.mipmaps;
 
 
 			}
 			}
 
 
-			if ( 1 === texData.mipmapCount ) {
+			if ( texData.mipmapCount === 1 ) {
 
 
 				texture.minFilter = LinearFilter;
 				texture.minFilter = LinearFilter;
 
 
@@ -34446,8 +34492,8 @@ Object.assign( ImageLoader.prototype, {
 
 
 			if ( onError ) onError( event );
 			if ( onError ) onError( event );
 
 
-			scope.manager.itemEnd( url );
 			scope.manager.itemError( url );
 			scope.manager.itemError( url );
+			scope.manager.itemEnd( url );
 
 
 		}
 		}
 
 
@@ -38855,6 +38901,7 @@ Object.assign( ObjectLoader.prototype, {
 
 
 	parseMaterials: function ( json, textures ) {
 	parseMaterials: function ( json, textures ) {
 
 
+		var cache = {}; // MultiMaterial
 		var materials = {};
 		var materials = {};
 
 
 		if ( json !== undefined ) {
 		if ( json !== undefined ) {
@@ -38874,7 +38921,15 @@ Object.assign( ObjectLoader.prototype, {
 
 
 					for ( var j = 0; j < data.materials.length; j ++ ) {
 					for ( var j = 0; j < data.materials.length; j ++ ) {
 
 
-						array.push( loader.parse( data.materials[ j ] ) );
+						var material = data.materials[ j ];
+
+						if ( cache[ material.uuid ] === undefined ) {
+
+							cache[ material.uuid ] = loader.parse( material );
+
+						}
+
+						array.push( cache[ material.uuid ] );
 
 
 					}
 					}
 
 
@@ -38883,6 +38938,7 @@ Object.assign( ObjectLoader.prototype, {
 				} else {
 				} else {
 
 
 					materials[ data.uuid ] = loader.parse( data );
 					materials[ data.uuid ] = loader.parse( data );
+					cache[ data.uuid ] = materials[ data.uuid ];
 
 
 				}
 				}
 
 
@@ -38929,8 +38985,8 @@ Object.assign( ObjectLoader.prototype, {
 
 
 			}, undefined, function () {
 			}, undefined, function () {
 
 
-				scope.manager.itemEnd( url );
 				scope.manager.itemError( url );
 				scope.manager.itemError( url );
+				scope.manager.itemEnd( url );
 
 
 			} );
 			} );
 
 
@@ -39460,8 +39516,8 @@ ImageBitmapLoader.prototype = {
 
 
 			if ( onError ) onError( e );
 			if ( onError ) onError( e );
 
 
-			scope.manager.itemEnd( url );
 			scope.manager.itemError( url );
 			scope.manager.itemError( url );
+			scope.manager.itemEnd( url );
 
 
 		} );
 		} );
 
 
@@ -40227,6 +40283,77 @@ function CubeCamera( near, far, cubeResolution, options ) {
 CubeCamera.prototype = Object.create( Object3D.prototype );
 CubeCamera.prototype = Object.create( Object3D.prototype );
 CubeCamera.prototype.constructor = CubeCamera;
 CubeCamera.prototype.constructor = CubeCamera;
 
 
+/**
+ * @author alteredq / http://alteredqualia.com/
+ */
+
+function Clock( autoStart ) {
+
+	this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
+
+	this.startTime = 0;
+	this.oldTime = 0;
+	this.elapsedTime = 0;
+
+	this.running = false;
+
+}
+
+Object.assign( Clock.prototype, {
+
+	start: function () {
+
+		this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
+
+		this.oldTime = this.startTime;
+		this.elapsedTime = 0;
+		this.running = true;
+
+	},
+
+	stop: function () {
+
+		this.getElapsedTime();
+		this.running = false;
+		this.autoStart = false;
+
+	},
+
+	getElapsedTime: function () {
+
+		this.getDelta();
+		return this.elapsedTime;
+
+	},
+
+	getDelta: function () {
+
+		var diff = 0;
+
+		if ( this.autoStart && ! this.running ) {
+
+			this.start();
+			return 0;
+
+		}
+
+		if ( this.running ) {
+
+			var newTime = ( typeof performance === 'undefined' ? Date : performance ).now();
+
+			diff = ( newTime - this.oldTime ) / 1000;
+			this.oldTime = newTime;
+
+			this.elapsedTime += diff;
+
+		}
+
+		return diff;
+
+	}
+
+} );
+
 /**
 /**
  * @author mrdoob / http://mrdoob.com/
  * @author mrdoob / http://mrdoob.com/
  */
  */
@@ -40244,6 +40371,8 @@ function AudioListener() {
 
 
 	this.filter = null;
 	this.filter = null;
 
 
+	this.timeDelta = 0;
+
 }
 }
 
 
 AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
 AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
@@ -40319,6 +40448,7 @@ AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
 		var scale = new Vector3();
 		var scale = new Vector3();
 
 
 		var orientation = new Vector3();
 		var orientation = new Vector3();
+		var clock = new Clock();
 
 
 		return function updateMatrixWorld( force ) {
 		return function updateMatrixWorld( force ) {
 
 
@@ -40327,21 +40457,27 @@ AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
 			var listener = this.context.listener;
 			var listener = this.context.listener;
 			var up = this.up;
 			var up = this.up;
 
 
+			this.timeDelta = clock.getDelta();
+
 			this.matrixWorld.decompose( position, quaternion, scale );
 			this.matrixWorld.decompose( position, quaternion, scale );
 
 
 			orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
 			orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
 
 
 			if ( listener.positionX ) {
 			if ( listener.positionX ) {
 
 
-				listener.positionX.setValueAtTime( position.x, this.context.currentTime );
-				listener.positionY.setValueAtTime( position.y, this.context.currentTime );
-				listener.positionZ.setValueAtTime( position.z, this.context.currentTime );
-				listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );
-				listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );
-				listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );
-				listener.upX.setValueAtTime( up.x, this.context.currentTime );
-				listener.upY.setValueAtTime( up.y, this.context.currentTime );
-				listener.upZ.setValueAtTime( up.z, this.context.currentTime );
+				// code path for Chrome (see #14393)
+
+				var endTime = this.context.currentTime + this.timeDelta;
+
+				listener.positionX.linearRampToValueAtTime( position.x, endTime );
+				listener.positionY.linearRampToValueAtTime( position.y, endTime );
+				listener.positionZ.linearRampToValueAtTime( position.z, endTime );
+				listener.forwardX.linearRampToValueAtTime( orientation.x, endTime );
+				listener.forwardY.linearRampToValueAtTime( orientation.y, endTime );
+				listener.forwardZ.linearRampToValueAtTime( orientation.z, endTime );
+				listener.upX.linearRampToValueAtTime( up.x, endTime );
+				listener.upY.linearRampToValueAtTime( up.y, endTime );
+				listener.upZ.linearRampToValueAtTime( up.z, endTime );
 
 
 			} else {
 			} else {
 
 
@@ -40367,6 +40503,7 @@ function Audio( listener ) {
 
 
 	this.type = 'Audio';
 	this.type = 'Audio';
 
 
+	this.listener = listener;
 	this.context = listener.context;
 	this.context = listener.context;
 
 
 	this.gain = this.context.createGain();
 	this.gain = this.context.createGain();
@@ -40778,8 +40915,25 @@ PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {
 
 
 			orientation.set( 0, 0, 1 ).applyQuaternion( quaternion );
 			orientation.set( 0, 0, 1 ).applyQuaternion( quaternion );
 
 
-			panner.setPosition( position.x, position.y, position.z );
-			panner.setOrientation( orientation.x, orientation.y, orientation.z );
+			if ( panner.positionX ) {
+
+				// code path for Chrome and Firefox (see #14393)
+
+				var endTime = this.context.currentTime + this.listener.timeDelta;
+
+				panner.positionX.linearRampToValueAtTime( position.x, endTime );
+				panner.positionY.linearRampToValueAtTime( position.y, endTime );
+				panner.positionZ.linearRampToValueAtTime( position.z, endTime );
+				panner.orientationX.linearRampToValueAtTime( orientation.x, endTime );
+				panner.orientationY.linearRampToValueAtTime( orientation.y, endTime );
+				panner.orientationZ.linearRampToValueAtTime( orientation.z, endTime );
+
+			} else {
+
+				panner.setPosition( position.x, position.y, position.z );
+				panner.setOrientation( orientation.x, orientation.y, orientation.z );
+
+			}
 
 
 		};
 		};
 
 
@@ -43815,77 +43969,6 @@ Object.assign( Raycaster.prototype, {
 
 
 } );
 } );
 
 
-/**
- * @author alteredq / http://alteredqualia.com/
- */
-
-function Clock( autoStart ) {
-
-	this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
-
-	this.startTime = 0;
-	this.oldTime = 0;
-	this.elapsedTime = 0;
-
-	this.running = false;
-
-}
-
-Object.assign( Clock.prototype, {
-
-	start: function () {
-
-		this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
-
-		this.oldTime = this.startTime;
-		this.elapsedTime = 0;
-		this.running = true;
-
-	},
-
-	stop: function () {
-
-		this.getElapsedTime();
-		this.running = false;
-		this.autoStart = false;
-
-	},
-
-	getElapsedTime: function () {
-
-		this.getDelta();
-		return this.elapsedTime;
-
-	},
-
-	getDelta: function () {
-
-		var diff = 0;
-
-		if ( this.autoStart && ! this.running ) {
-
-			this.start();
-			return 0;
-
-		}
-
-		if ( this.running ) {
-
-			var newTime = ( typeof performance === 'undefined' ? Date : performance ).now();
-
-			diff = ( newTime - this.oldTime ) / 1000;
-			this.oldTime = newTime;
-
-			this.elapsedTime += diff;
-
-		}
-
-		return diff;
-
-	}
-
-} );
-
 /**
 /**
  * @author bhouston / http://clara.io
  * @author bhouston / http://clara.io
  * @author WestLangley / http://github.com/WestLangley
  * @author WestLangley / http://github.com/WestLangley
@@ -44819,7 +44902,7 @@ function PointLightHelper( light, sphereSize, color ) {
 
 
 
 
 	/*
 	/*
-	var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
+	var distanceGeometry = new THREE.IcosahedronBufferGeometry( 1, 2 );
 	var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
 	var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
 
 
 	this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
 	this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
@@ -45348,7 +45431,7 @@ DirectionalLightHelper.prototype.update = function () {
 		v2.setFromMatrixPosition( this.light.target.matrixWorld );
 		v2.setFromMatrixPosition( this.light.target.matrixWorld );
 		v3.subVectors( v2, v1 );
 		v3.subVectors( v2, v1 );
 
 
-		this.lightPlane.lookAt( v3 );
+		this.lightPlane.lookAt( v2 );
 
 
 		if ( this.color !== undefined ) {
 		if ( this.color !== undefined ) {
 
 
@@ -45362,7 +45445,7 @@ DirectionalLightHelper.prototype.update = function () {
 
 
 		}
 		}
 
 
-		this.targetLine.lookAt( v3 );
+		this.targetLine.lookAt( v2 );
 		this.targetLine.scale.z = v3.length();
 		this.targetLine.scale.z = v3.length();
 
 
 	};
 	};

+ 6 - 3
docs/api/en/audio/Audio.html

@@ -73,12 +73,15 @@
 		<p>Whether playback can be controlled using the [page:Audio.play play](),
 		<p>Whether playback can be controlled using the [page:Audio.play play](),
 			[page:Audio.pause pause]() etc. methods. Default is *true*.</p>
 			[page:Audio.pause pause]() etc. methods. Default is *true*.</p>
 
 
-		<h3>[property:Number playbackRate]</h3>
-		<p>Speed of playback. Default is *1*.</p>
-
 		<h3>[property:Boolean isPlaying]</h3>
 		<h3>[property:Boolean isPlaying]</h3>
 		<p>Whether the audio is currently playing.</p>
 		<p>Whether the audio is currently playing.</p>
 
 
+		<h3>[property:AudioListener listener]</h3>
+		<p>A reference to the listener object of this audio.</p>
+
+		<h3>[property:Number playbackRate]</h3>
+		<p>Speed of playback. Default is *1*.</p>
+
 		<h3>[property:Number startTime]</h3>
 		<h3>[property:Number startTime]</h3>
 		<p>The time at which the sound should begin to play. Same as the *when* paramter of [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start AudioBufferSourceNode.start](). Default is *0*.</p>
 		<p>The time at which the sound should begin to play. Same as the *when* paramter of [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start AudioBufferSourceNode.start](). Default is *0*.</p>
 
 

+ 2 - 0
docs/api/en/audio/AudioListener.html

@@ -67,6 +67,8 @@
 		<h3>[property:AudioNode filter]</h3>
 		<h3>[property:AudioNode filter]</h3>
 		<p>Default is *null*.</p>
 		<p>Default is *null*.</p>
 
 
+		<h3>[property:Number timeDelta]</h3>
+		<p>Time delta value for audio entities. Use in context of [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/linearRampToValueAtTime AudioParam.linearRampToValueAtTimeDefault](). Default is *0*.</p>
 
 
 		<h2>Methods</h2>
 		<h2>Methods</h2>
 
 

+ 6 - 4
docs/api/en/core/BufferGeometry.html

@@ -119,12 +119,13 @@
 
 
 		<h3>[property:Object drawRange]</h3>
 		<h3>[property:Object drawRange]</h3>
 		<p>
 		<p>
-			Used to determine what part of the geometry should be rendered. This should not
-			be set directly, instead use [page:.setDrawRange].<br />
-			Default is
+			Determines the part of the geometry to render. This should not
+			be set directly, instead use [page:.setDrawRange]. Default is
 			<code>
 			<code>
 				{ start: 0, count: Infinity }
 				{ start: 0, count: Infinity }
 			</code>
 			</code>
+			For non-indexed BufferGeometry, count is the number of vertices to render.
+			For indexed BufferGeometry, count is the number of indices to render.
 		</p>
 		</p>
 
 
 		<h3>[property:Array groups]</h3>
 		<h3>[property:Array groups]</h3>
@@ -316,7 +317,8 @@
 		<p>Set the [page:.index] buffer.</p>
 		<p>Set the [page:.index] buffer.</p>
 
 
 		<h3>[method:null setDrawRange] ( [param:Integer start], [param:Integer count] )</h3>
 		<h3>[method:null setDrawRange] ( [param:Integer start], [param:Integer count] )</h3>
-		<p>Set the [page:.drawRange] buffer. See that property for details.</p>
+		<p>Set the [page:.drawRange] property. For non-indexed BufferGeometry, count is the number of vertices to render.
+		For indexed BufferGeometry, count is the number of indices to render.</p>
 
 
 		<h3>[method:BufferGeometry setFromObject] ( [param:Object3D object] )</h3>
 		<h3>[method:BufferGeometry setFromObject] ( [param:Object3D object] )</h3>
 		<p>Sets the attributes for this BufferGeometry from an [page:Object3D].</p>
 		<p>Sets the attributes for this BufferGeometry from an [page:Object3D].</p>

+ 0 - 1
docs/api/en/core/Face3.html

@@ -19,7 +19,6 @@
 
 
 		<h2>Examples</h2>
 		<h2>Examples</h2>
 
 
-		<p>[example:misc_ubiquity_test ubiquity / test ]</p>
 		<p>[example:svg_sandbox svg / sandbox ]</p>
 		<p>[example:svg_sandbox svg / sandbox ]</p>
 		<p>[example:misc_exporter_obj exporter / obj ]</p>
 		<p>[example:misc_exporter_obj exporter / obj ]</p>
 		<p>[example:webgl_shaders_vector WebGL / shaders / vector ]</p>
 		<p>[example:webgl_shaders_vector WebGL / shaders / vector ]</p>

+ 2 - 1
docs/api/en/core/Geometry.html

@@ -267,7 +267,8 @@
 
 
 		<h3>[method:Geometry fromBufferGeometry]( [param:BufferGeometry geometry] )</h3>
 		<h3>[method:Geometry fromBufferGeometry]( [param:BufferGeometry geometry] )</h3>
 		<p>Convert a [page:BufferGeometry] to a Geometry. <br />
 		<p>Convert a [page:BufferGeometry] to a Geometry. <br />
-		The array used to store the vertices in the bufferGeometry is a non indexed array, so the resultant geometry may contain duplicated vertices. Use [page:mergeVertices] to remove them.</p>
+		When converting from BufferGeometry to Geometry, all vertices are preserved, so duplicated vertices may appear.
+		Use [page:Geometry.mergeVertices] to remove them.</p>
 
 
 		<h3>[method:Geometry lookAt] ( [param:Vector3 vector] )</h3>
 		<h3>[method:Geometry lookAt] ( [param:Vector3 vector] )</h3>
 		<p>
 		<p>

+ 0 - 1
docs/api/en/lights/DirectionalLight.html

@@ -41,7 +41,6 @@
 		<h2>Example</h2>
 		<h2>Example</h2>
 		<p>
 		<p>
 			[example:misc_controls_fly controls / fly ]<br />
 			[example:misc_controls_fly controls / fly ]<br />
-			[example:misc_lights_test lights / test ]<br />
 			[example:webvr_cubes cubes ]<br />
 			[example:webvr_cubes cubes ]<br />
 			[example:webgl_effects_parallaxbarrier effects / parallaxbarrier ]<br />
 			[example:webgl_effects_parallaxbarrier effects / parallaxbarrier ]<br />
 			[example:webgl_effects_stereo effects / stereo ]<br />
 			[example:webgl_effects_stereo effects / stereo ]<br />

+ 1 - 2
docs/api/en/loaders/JSONLoader.html

@@ -18,8 +18,7 @@
 		<h2>Example</h2>
 		<h2>Example</h2>
 
 
 		<p>
 		<p>
-		[example:webgl_loader_json WebGL / loader / json]<br />
-		[example:webgl_loader_json_objconverter WebGL / loader / json / objconverter]
+		[example:webgl_loader_json WebGL / loader / json]
 		</p>
 		</p>
 
 
 		<code>
 		<code>

+ 0 - 2
docs/api/en/materials/SpriteMaterial.html

@@ -17,8 +17,6 @@
 		<h2>Examples</h2>
 		<h2>Examples</h2>
 		<div>
 		<div>
 			[example:webgl_sprites WebGL / sprites]<br />
 			[example:webgl_sprites WebGL / sprites]<br />
-			[example:misc_ubiquity_test misc / ubiquity / test]<br />
-			[example:misc_ubiquity_test2 misc / ubiquity / test2]<br />
 			[example:software_sandbox software / sandbox]<br />
 			[example:software_sandbox software / sandbox]<br />
 			[example:svg_sandbox svg / sandbox]<br />
 			[example:svg_sandbox svg / sandbox]<br />
 			[example:webgl_materials_cubemap_dynamic webgl / materials / cubemap / dynamic]
 			[example:webgl_materials_cubemap_dynamic webgl / materials / cubemap / dynamic]

+ 3 - 0
docs/api/zh/audio/Audio.html

@@ -78,6 +78,9 @@
 		<h3>[property:Boolean isPlaying]</h3>
 		<h3>[property:Boolean isPlaying]</h3>
 		<p>是否正在播放</p>
 		<p>是否正在播放</p>
 
 
+		<h3>[property:AudioListener listener]</h3>
+		<p>A reference to the listener object of this audio.</p>
+
 		<h3>[property:Number startTime]</h3>
 		<h3>[property:Number startTime]</h3>
 		<p>开始播放的时间. 和[link:https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start AudioBufferSourceNode.start]()的*when*参数一样. 默认为 *0*.</p>
 		<p>开始播放的时间. 和[link:https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start AudioBufferSourceNode.start]()的*when*参数一样. 默认为 *0*.</p>
 
 

+ 2 - 0
docs/api/zh/audio/AudioListener.html

@@ -66,6 +66,8 @@
 		<h3>[property:AudioNode filter]</h3>
 		<h3>[property:AudioNode filter]</h3>
 		<p>默认为*null*.</p>
 		<p>默认为*null*.</p>
 
 
+		<h3>[property:Number timeDelta]</h3>
+		<p>Time delta value for audio entities. Use in context of [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/linearRampToValueAtTime AudioParam.linearRampToValueAtTimeDefault](). Default is *0*.</p>
 
 
 		<h2>方法</h2>
 		<h2>方法</h2>
 
 

+ 5 - 5
docs/api/zh/cameras/ArrayCamera.html

@@ -10,19 +10,19 @@
 	<body>
 	<body>
 		[page:PerspectiveCamera] &rarr;
 		[page:PerspectiveCamera] &rarr;
 
 
-		<h1>阵列摄像机([name])</h1>
+		<h1>摄像机阵列([name])</h1>
 
 
 		<p class="desc">
 		<p class="desc">
 
 
-			[name] 可以被用来更加高效地用一组已经预定义好的摄像机来渲染一个场景。 这对于VR场景的渲染来说,是非常重要的一个性能体现。<br />
-			一个 [name] 的实例中总是包含着一组子摄像机,应当为每一个子摄像机定义*bound*(边界)这个属性,属性决定了由该子摄像机所渲染的视口区域的大小。
+			[name] 用于更加高效地使用一组已经预定义的摄像机来渲染一个场景。这将能够更好地提升VR场景的渲染性能。<br />
+			一个 [name] 的实例中总是包含着一组子摄像机,应当为每一个子摄像机定义*bound*(边界)这个属性,这一属性决定了由该子摄像机所渲染的视口区域的大小。
 		</p>
 		</p>
 
 
 		<h2>示例</h2>
 		<h2>示例</h2>
 
 
 		<p>[example:webgl_camera_array camera / array ]</p>
 		<p>[example:webgl_camera_array camera / array ]</p>
 
 
-		<h2>构造</h2>
+		<h2>构造函数</h2>
 
 
 		<h3>[name]( [param:Array array] )</h3>
 		<h3>[name]( [param:Array array] )</h3>
 		<p>
 		<p>
@@ -35,7 +35,7 @@
 
 
 		<h3>[property:Array cameras]</h3>
 		<h3>[property:Array cameras]</h3>
 		<p>
 		<p>
-			摄像机组。
+			摄像机组。
 		</p>
 		</p>
 
 
 		<h2>方法</h2>
 		<h2>方法</h2>

+ 1 - 1
docs/api/zh/core/BufferAttribute.html

@@ -191,7 +191,7 @@
 
 
 
 
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/Clock.html

@@ -78,7 +78,7 @@
 		</p>
 		</p>
 
 
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/DirectGeometry.html

@@ -96,7 +96,7 @@
 		<p>传入一个需要转换的 [page:Geometry] 实例。</p>
 		<p>传入一个需要转换的 [page:Geometry] 实例。</p>
 
 
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/EventDispatcher.html

@@ -93,7 +93,7 @@ car.start();
 		</p>
 		</p>
 
 
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 2
docs/api/zh/core/Face3.html

@@ -18,7 +18,6 @@
 
 
 		<h2>示例</h2>
 		<h2>示例</h2>
 
 
-		<p>[example:misc_ubiquity_test ubiquity / test ]</p>
 		<p>[example:svg_sandbox svg / sandbox ]</p>
 		<p>[example:svg_sandbox svg / sandbox ]</p>
 		<p>[example:misc_exporter_obj exporter / obj ]</p>
 		<p>[example:misc_exporter_obj exporter / obj ]</p>
 		<p>[example:webgl_shaders_vector WebGL / shaders / vector ]</p>
 		<p>[example:webgl_shaders_vector WebGL / shaders / vector ]</p>
@@ -123,7 +122,7 @@ scene.add( new THREE.Mesh( geometry, material ) );
 		<p>将参数指定的 Face3 对象的数据拷贝到当前对象。</p>
 		<p>将参数指定的 Face3 对象的数据拷贝到当前对象。</p>
 
 
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/Geometry.html

@@ -327,7 +327,7 @@
 		</p>
 		</p>
 
 
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/InstancedBufferAttribute.html

@@ -37,7 +37,7 @@
 		<h2>方法</h2>
 		<h2>方法</h2>
 		<p>继承方法详见 [page:BufferAttribute]。</p>
 		<p>继承方法详见 [page:BufferAttribute]。</p>
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/InstancedBufferGeometry.html

@@ -43,7 +43,7 @@
 		</p>
 		</p>
 
 
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/InstancedInterleavedBuffer.html

@@ -41,7 +41,7 @@
 			继承方法详见 [page:InterleavedBuffer]。
 			继承方法详见 [page:InterleavedBuffer]。
 		</p>
 		</p>
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/InterleavedBuffer.html

@@ -112,7 +112,7 @@
 			克隆当前 [name]。
 			克隆当前 [name]。
 		</p>
 		</p>
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/InterleavedBufferAttribute.html

@@ -94,7 +94,7 @@
 		<h3>[method:null setXYZW]( [param:Integer index], [param:Float x], [param:Float y], [param:Float z], [param:Float w] ) </h3>
 		<h3>[method:null setXYZW]( [param:Integer index], [param:Float x], [param:Float y], [param:Float z], [param:Float w] ) </h3>
 		<p>通过给定参数,设置指定索引矢量的第一、二、三、四个元素 (X Y Z 和 W 值)。</p>
 		<p>通过给定参数,设置指定索引矢量的第一、二、三、四个元素 (X Y Z 和 W 值)。</p>
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/Layers.html

@@ -75,7 +75,7 @@
 			根据参数切换对象所属图层。
 			根据参数切换对象所属图层。
 		</p>
 		</p>
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/Uniform.html

@@ -206,7 +206,7 @@
 			该方法的使用示例详见 [example:webgldeferred_animation WebGL deferred animation]。
 			该方法的使用示例详见 [example:webgldeferred_animation WebGL deferred animation]。
 		</p>
 		</p>
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/core/bufferAttributeTypes/BufferAttributeTypes.html

@@ -49,7 +49,7 @@
 
 
 		继承方法详见 [page:BufferAttribute]。
 		继承方法详见 [page:BufferAttribute]。
 
 
-		<h2>源</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/core/BufferAttribute.js src/core/BufferAttribute.js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/core/BufferAttribute.js src/core/BufferAttribute.js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/geometries/PolyhedronGeometry.html

@@ -13,7 +13,7 @@
 		<h1>多面几何体([name])</h1>
 		<h1>多面几何体([name])</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-			多面体在三维空间中具有一些平面的立体图形。这个类将一个顶点数组投射到一个球面上,之后将它们细分为所需的细节级别。
+			多面体在三维空间中具有一些平面的立体图形。这个类将一个顶点数组投射到一个球面上,之后将它们细分为所需的细节级别。
 		</p>
 		</p>
 
 
 		<h2>示例</h2>
 		<h2>示例</h2>

+ 0 - 1
docs/api/zh/lights/DirectionalLight.html

@@ -38,7 +38,6 @@
 		<p>
 		<p>
 			[example:canvas_morphtargets_horse morphtargets / horse ]<br />
 			[example:canvas_morphtargets_horse morphtargets / horse ]<br />
 			[example:misc_controls_fly controls / fly ]<br />
 			[example:misc_controls_fly controls / fly ]<br />
-			[example:misc_lights_test lights / test ]<br />
 			[example:webvr_cubes cubes ]<br />
 			[example:webvr_cubes cubes ]<br />
 			[example:webgl_effects_parallaxbarrier effects / parallaxbarrier ]<br />
 			[example:webgl_effects_parallaxbarrier effects / parallaxbarrier ]<br />
 			[example:webgl_effects_stereo effects / stereo ]<br />
 			[example:webgl_effects_stereo effects / stereo ]<br />

+ 0 - 2
docs/api/zh/materials/SpriteMaterial.html

@@ -17,8 +17,6 @@
 		<h2>例子(Examples)</h2>
 		<h2>例子(Examples)</h2>
 		<div>
 		<div>
 			[example:webgl_sprites WebGL / sprites]<br />
 			[example:webgl_sprites WebGL / sprites]<br />
-			[example:misc_ubiquity_test misc / ubiquity / test]<br />
-			[example:misc_ubiquity_test2 misc / ubiquity / test2]<br />
 			[example:software_sandbox software / sandbox]<br />
 			[example:software_sandbox software / sandbox]<br />
 			[example:svg_sandbox svg / sandbox]<br />
 			[example:svg_sandbox svg / sandbox]<br />
 			[example:webgl_materials_cubemap_dynamic webgl / materials / cubemap / dynamic]
 			[example:webgl_materials_cubemap_dynamic webgl / materials / cubemap / dynamic]

+ 92 - 105
docs/api/zh/math/Box3.html

@@ -11,291 +11,278 @@
 		<h1>[name]</h1>
 		<h1>[name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-			Represents a box or cube in 3D space. The main purpose of this is to represent
-			the [link:https://en.wikipedia.org/wiki/Minimum_bounding_box Minimum Bounding Boxes]
-			for objects.
+			在3D空间中表示一个盒子或立方体。这个的主要目的是表示对象的最小边界框[link:https://en.wikipedia.org/wiki/Minimum_bounding_box Minimum Bounding Boxes]。
 		</p>
 		</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造器(Constructor</h2>
 
 
 
 
 		<h3>[name]( [param:Vector3 min], [param:Vector3 max] )</h3>
 		<h3>[name]( [param:Vector3 min], [param:Vector3 max] )</h3>
 		<p>
 		<p>
-		[page:Vector3 min] - (optional) [page:Vector3] representing the lower (x, y, z) boundary of the box.
-		Default is ( + Infinity, + Infinity, + Infinity ).<br>
+		[page:Vector3 min] - (参数可选) [page:Vector3] 表示包围盒的下边界。
+		默认值是( + Infinity, + Infinity, + Infinity )。<br>
 
 
-		[page:Vector3 max] - (optional) [page:Vector3] representing the lower upper (x, y, z) boundary of the box.
-		Default is ( - Infinity, - Infinity, - Infinity ).<br /><br />
+		[page:Vector3 max] - (参数可选) [page:Vector3] 表示包围盒的上边界。
+		默认值是( - Infinity, - Infinity, - Infinity )。<br /><br />
 
 
-		Creates a [name] bounded by min and max.
+		创建一个以max和min为边界的包围盒。
 		</p>
 		</p>
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Boolean isBox3]</h3>
 		<h3>[property:Boolean isBox3]</h3>
 		<p>
 		<p>
-			Used to check whether this or derived classes are Box3s. Default is *true*.<br /><br />
-
-			You should not change this, as it used internally for optimisation.
+			用于检测当前对象或者派生类对象是否是Box3。默认为 *true*。<br /><br />
+			
+			不应该修改这个值,因为内部使用该属性做了优化的任务。
 		</p>
 		</p>
 
 
 		<h3>[property:Vector3 min]</h3>
 		<h3>[property:Vector3 min]</h3>
 		<p>
 		<p>
-			[page:Vector3] representing the lower (x, y, z) boundary of the box.<br />
-			Default is ( + Infinity, + Infinity, + Infinity ).
+			[page:Vector3] 表示包围盒的下边界。<br />
+			默认值是( - Infinity, - Infinity, - Infinity )。
 		</p>
 		</p>
 
 
 		<h3>[property:Vector3 max]</h3>
 		<h3>[property:Vector3 max]</h3>
 		<p>
 		<p>
-			[page:Vector3] representing the upper (x, y, z) boundary of the box.<br />
-			Default is ( - Infinity, - Infinity, - Infinity ).
+			[page:Vector3] 包围盒的(x, y, z)上边界。<br />
+			默认值是 ( - Infinity, - Infinity, - Infinity ).
 		</p>
 		</p>
 
 
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法(Methods</h2>
 
 
 		<h3>[method:Box3 applyMatrix4]( [param:Matrix4 matrix] )</h3>
 		<h3>[method:Box3 applyMatrix4]( [param:Matrix4 matrix] )</h3>
 		<p>
 		<p>
-		[page:Matrix4 matrix] - The [page:Matrix4] to apply<br /><br />
-
-		Transforms this Box3 with the supplied matrix.
+		[page:Matrix4 matrix] - 要应用的 [page:Matrix4] <br /><br />
+		
+		使用传入的矩阵变换Box3(包围盒8个顶点都会乘以这个变换矩阵)。
 		</p>
 		</p>
 
 
 		<h3>[method:Vector3 clampPoint]( [param:Vector3 point], [param:Vector3 target] )</h3>
 		<h3>[method:Vector3 clampPoint]( [param:Vector3 point], [param:Vector3 target] )</h3>
 		<p>
 		<p>
-		[page:Vector3 point] - [page:Vector3] to clamp. <br>
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
+		[page:Vector3 point] - 需要做clamp 的坐标 [page:Vector3]。 <br>
+		[page:Vector3 target] — 结果将会被拷贝到这个对象中<br /><br />
 
 
-		[link:https://en.wikipedia.org/wiki/Clamping_(graphics) Clamps] the [page:Vector3 point] within the bounds of this box.<br />
+		是这个点[page:Vector3 point] [link:https://en.wikipedia.org/wiki/Clamping_(graphics) Clamps](处于范围内) 处于包围盒边界范围内。<br />
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 clone]()</h3>
 		<h3>[method:Box3 clone]()</h3>
-		<p>Returns a new [page:Box3] with the same [page:.min min] and [page:.max max] as this one.</p>
+		<p>返回一个与该包围盒子有相同下边界[page:.min min] 和上边界 [page:.max max]的新包围盒。</p>
 
 
 		<h3>[method:Boolean containsBox]( [param:Box3 box] )</h3>
 		<h3>[method:Boolean containsBox]( [param:Box3 box] )</h3>
 		<p>
 		<p>
-		[page:Box3 box] - [page:Box3 Box3] to test for inclusion.<br /><br />
-
-		Returns true if this box includes the entirety of [page:Box3 box]. If this and [page:Box3 box] are identical, <br>
-		this function also returns true.
+		[page:Box3 box] - 需要检测是否在当前包围盒内的 [page:Box3 Box3]。<br /><br />
+		传入的 [page:Box3 box] 整体都被包含在该对象中则返回true。如果他们两个包围盒是一样的也返回true。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean containsPoint]( [param:Vector3 point] )</h3>
 		<h3>[method:Boolean containsPoint]( [param:Vector3 point] )</h3>
 		<p>
 		<p>
-		[page:Vector3 point] - [page:Vector3] to check for inclusion.<br /><br />
+		[page:Vector3 point] - 需要检测是否在当前包围盒内的 [page:Vector3]。<br /><br />
 
 
-		Returns true if the specified [page:Vector3 point] lies within or on the boundaries of this box.
+		当传入的值 [page:Vector3 point] 在包围盒内部或者边界都会返回true。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 copy]( [param:Box3 box] )</h3>
 		<h3>[method:Box3 copy]( [param:Box3 box] )</h3>
 		<p>
 		<p>
-		[page:Box3 box]  - [page:Box3] to copy.<br /><br />
+		[page:Box3 box]  - 需要复制的包围盒 [page:Box3] 。<br /><br />
 
 
-		Copies the [page:.min min] and [page:.max max] from [page:Box3 box] to this box.
+		将传入的值 [page:Box3 box] 中的 [page:.min min] 和 [page:.max max] 拷贝到当前对象。
 		</p>
 		</p>
 
 
 		<h3>[method:Float distanceToPoint]( [param:Vector3 point] )</h3>
 		<h3>[method:Float distanceToPoint]( [param:Vector3 point] )</h3>
 		<p>
 		<p>
-		[page:Vector3 point] - [page:Vector3] to measure distance to.<br /><br />
+		[page:Vector3 point] - 用来测试距离的点 [page:Vector3]。<br /><br />
 
 
-		Returns the distance from any edge of this box to the specified point.
-		If the [page:Vector3 point] lies inside of this box, the distance will be 0.
+		返回这个box的任何边缘到指定点的距离。如果这个点位于这个盒子里,距离将是0。
 		</p>
 		</p>
 
 
 
 
 		<h3>[method:Boolean equals]( [param:Box3 box] )</h3>
 		<h3>[method:Boolean equals]( [param:Box3 box] )</h3>
 		<p>
 		<p>
-		[page:Box3 box] - Box to compare with this one.<br /><br />
+		[page:Box3 box] - 将box与当前对象做比较。<br /><br />
 
 
-		Returns true if this box and [page:Box3 box] share the same lower and upper bounds.
+		返回true如果传入的值与当前的对象 [page:Box3 box] 有相同的上下边界。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 expandByObject]( [param:Object3D object] )</h3>
 		<h3>[method:Box3 expandByObject]( [param:Object3D object] )</h3>
 		<p>
 		<p>
-		[page:Object3D object] - [page:Object3D] to expand the box by.<br /><br />
+		[page:Object3D object] - 包裹在包围盒中的3d对象 [page:Object3D]。<br /><br />
 
 
-		Expands the boundaries of this box to include [page:Object3D object] and its children,
-		accounting for the object's, and children's, world transforms.
+		扩展此包围盒的边界,使得对象及其子对象在包围盒内,包括对象和子对象的世界坐标的变换。
 
 
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 expandByPoint]( [param:Vector3 point] )</h3>
 		<h3>[method:Box3 expandByPoint]( [param:Vector3 point] )</h3>
 		<p>
 		<p>
-		[page:Vector3 point] - [page:Vector3] that should be included in the box.<br /><br />
+		[page:Vector3 point] - 需要在包围盒中的点 [page:Vector3]。<br /><br />
 
 
-		Expands the boundaries of this box to include [page:Vector3 point].
+		扩展这个包围盒的边界使得该点([page:Vector3 point])在包围盒内。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 expandByScalar]( [param:float scalar] )</h3>
 		<h3>[method:Box3 expandByScalar]( [param:float scalar] )</h3>
 		<p>
 		<p>
-		[page:float scalar] - Distance to expand the box by.<br /><br />
+		[page:float scalar] - 扩展包围盒的比例。<br /><br />
 
 
-		Expands each dimension of the box by [page:float scalar]. If negative, the dimensions of the box
-		will be contracted.
+		按 [page:float scalar] 的值展开盒子的每个维度。如果是负数,盒子的尺寸会缩小。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 expandByVector]( [param:Vector3 vector] )</h3>
 		<h3>[method:Box3 expandByVector]( [param:Vector3 vector] )</h3>
 		<p>
 		<p>
-		[page:Vector3 vector] - [page:Vector3] to expand the box by.<br /><br />
+		[page:Vector3 vector] - 扩展包围盒的数值 [page:Vector3] 。<br /><br />
+
+		按 [page:Vector3 vector] 每个纬度的值展开这个箱子。
+		这个盒子的宽度将由 [page:Vector3 vector] 的x分量在两个方向上展开。
+		这个盒子的高度将由 [page:Vector3 vector] 两个方向上的y分量展开。
+		这个盒子的深度将由 [page:Vector3 vector] z分量在两个方向上展开。
 
 
-		Expands this box equilaterally by [page:Vector3 vector]. The width of this box will be
-		expanded by the x component of [page:Vector3 vector] in both directions. The height of
-		this box will be expanded by the y component of [page:Vector3 vector] in both directions.
-		The depth of this box will be expanded by the z component of *vector* in both directions.
 		</p>
 		</p>
 
 
 		<h3>[method:Sphere getBoundingSphere]( [param:Sphere target] )</h3>
 		<h3>[method:Sphere getBoundingSphere]( [param:Sphere target] )</h3>
 		<p>
 		<p>
-		[page:Sphere target] — the result will be copied into this Sphere.<br /><br />
+		[page:Sphere target] — 如果指定了target ,结果将会被拷贝到target。<br /><br />
 
 
-		Gets a [page:Sphere] that bounds the box.
+		获取一个包围球 [page:Sphere]。
 		</p>
 		</p>
 
 
 		<h3>[method:Vector3 getCenter]( [param:Vector3 target] )</h3>
 		<h3>[method:Vector3 getCenter]( [param:Vector3 target] )</h3>
 		<p>
 		<p>
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
+		[page:Vector3 target] — 如果指定了target ,结果将会被拷贝到target。<br /><br />
 
 
-		Returns the center point of the box as a [page:Vector3].
+		返回包围盒的中心点 [page:Vector3]。
 		</p>
 		</p>
 
 
 		<h3>[method:Vector3 getParameter]( [param:Vector3 point], [param:Vector3 target] ) </h3>
 		<h3>[method:Vector3 getParameter]( [param:Vector3 point], [param:Vector3 target] ) </h3>
 		<p>
 		<p>
 		[page:Vector3 point] - [page:Vector3].<br/>
 		[page:Vector3 point] - [page:Vector3].<br/>
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
+		[page:Vector3 target] — 如果指定了target ,结果将会被拷贝到target。<br /><br />
 
 
-		Returns a point as a proportion of this box's width and height.
+		返回一个点为这个盒子的宽度和高度的比例。
 		</p>
 		</p>
 
 
 		<h3>[method:Vector3 getSize]( [param:Vector3 target] )</h3>
 		<h3>[method:Vector3 getSize]( [param:Vector3 target] )</h3>
 		<p>
 		<p>
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
+		[page:Vector3 target] — 如果指定了target ,结果将会被拷贝到target。<br /><br />
 
 
-		Returns the width, height and depth of this box.
+		返回包围盒的宽度,高度,和深度。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 intersect]( [param:Box3 box] )</h3>
 		<h3>[method:Box3 intersect]( [param:Box3 box] )</h3>
 		<p>
 		<p>
-		[page:Box3 box] - Box to intersect with.<br /><br />
+		[page:Box3 box] - 与包围盒的交集<br /><br />
 
 
-		Returns the intersection of this and [page:Box3 box], setting the upper bound of this box to the lesser
-		of the two boxes' upper bounds and the lower bound of this box to the greater of the two boxes'
-		lower bounds.
+		返回此包围盒和 [page:Box3 box] 的交集,将此框的上界设置为两个框的max的较小部分,
+		将此包围盒的下界设置为两个包围盒的min的较大部分。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsBox]( [param:Box3 box] )</h3>
 		<h3>[method:Boolean intersectsBox]( [param:Box3 box] )</h3>
 		<p>
 		<p>
-		[page:Box3 box] - Box to check for intersection against.<br /><br />
+		[page:Box3 box] - 用来检测是否相交的包围盒<br /><br />
 
 
-		Determines whether or not this box intersects [page:Box3 box].
+		确定当前包围盒是否与传入包围盒[page:Box3 box] 相交。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsPlane]( [param:Plane plane] )</h3>
 		<h3>[method:Boolean intersectsPlane]( [param:Plane plane] )</h3>
 		<p>
 		<p>
-		[page:Plane plane] - [page:Plane] to check for intersection against.<br /><br />
+		[page:Plane plane] - 用来检测是否相交的 [page:Plane]。<br /><br />
 
 
-		Determines whether or not this box intersects [page:Plane plane].
+		确定当前包围盒是否与平面 [page:Plane plane] 相交。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsSphere]( [param:Sphere sphere] )</h3>
 		<h3>[method:Boolean intersectsSphere]( [param:Sphere sphere] )</h3>
 		<p>
 		<p>
-		[page:Sphere sphere] - [page:Sphere] to check for intersection against.<br /><br />
+		[page:Sphere sphere] - 用来检测是否相交的球体 [page:Sphere]。<br /><br />
 
 
-		Determines whether or not this box intersects [page:Sphere sphere].
+		确定当前包围盒是否与球体 [page:Sphere sphere] 相交。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsTriangle]( [param:Triangle triangle] )</h3>
 		<h3>[method:Boolean intersectsTriangle]( [param:Triangle triangle] )</h3>
 		<p>
 		<p>
-		[page:Triangle triangle] - [page:Triangle] to check for intersection against.<br /><br />
+		[page:Triangle triangle] - 用来检测是否相交的三角形 [page:Triangle]。<br /><br />
 
 
-		Determines whether or not this box intersects [page:Triangle triangle].
+		确定当前包围盒是否与三角形 [page:Triangle triangle] 相交。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean isEmpty]()</h3>
 		<h3>[method:Boolean isEmpty]()</h3>
 		<p>
 		<p>
-		Returns true if this box includes zero points within its bounds.<br>
-		Note that a box with equal lower and upper bounds still includes one point,
-		the one both bounds share.
+		如果这个盒子包含0个顶点,则返回true。<br>
+		注意,下界和上界相等的方框仍然包含一个点,即两个边界共享的那个点。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 makeEmpty]()</h3>
 		<h3>[method:Box3 makeEmpty]()</h3>
-		<p>Makes this box empty.</p>
+		<p>清空包围盒。</p>
 
 
 		<h3>[method:Box3 set]( [param:Vector3 min], [param:Vector3 max] )</h3>
 		<h3>[method:Box3 set]( [param:Vector3 min], [param:Vector3 max] )</h3>
 		<p>
 		<p>
-		[page:Vector3 min] - [page:Vector3] representing the lower (x, y, z) boundary of the box.<br />
-		[page:Vector3 max] - [page:Vector3] representing the lower upper (x, y, z) boundary of the box.<br /><br />
+		[page:Vector3 min] - [page:Vector3] 表示下边界每个纬度(x,y,z)的值。<br />
+		[page:Vector3 max] - [page:Vector3] 表示上边界每个纬度(x,y,z)的值。<br /><br />
 
 
-		Sets the lower and upper (x, y, z) boundaries of this box.
+		设置包围盒上下边界每个纬度(x,y,z)的值。 
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 setFromArray]( [param:Array array] ) [param:Box3 this]</h3>
 		<h3>[method:Box3 setFromArray]( [param:Array array] ) [param:Box3 this]</h3>
 		<p>
 		<p>
-		array -- An array of position data that the resulting box will envelop.<br /><br />
+		array -- 数组当中的所有的点都将被包围盒包裹。<br /><br />
 
 
-		Sets the upper and lower bounds of this box to include all of the data in *array*.
+		设置包围盒的上下边界使得数组 *array* 中的所有点的点都被包含在内。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 setFromBufferAttribute]( [param:BufferAttribute attribute] ) [param:Box3 this]</h3>
 		<h3>[method:Box3 setFromBufferAttribute]( [param:BufferAttribute attribute] ) [param:Box3 this]</h3>
 		<p>
 		<p>
-		[page:BufferAttribute attribute] - A buffer attribute of position data that the resulting box will envelop.<br /><br />
+		[page:BufferAttribute attribute] - 位置的缓冲数据,包含在返回的包围盒内。<br /><br />
 
 
-		Sets the upper and lower bounds of this box to include all of the data in [page:BufferAttribute attribute].
+		设置此包围盒的上边界和下边界,以包含 [page:BufferAttribute attribute] 中的所有位置数据。
 		</p>
 		</p>
 
 
-		<h3>[method:Box3 setFromCenterAndSize]( [param:Vector3 center], [param:Vector3 size] )</h3>
+<!--	<h3>[method:Box3 setFromCenterAndSize]( [param:Vector3 center], [param:Vector3 size] )</h3>
 		<p>
 		<p>
-		[page:Vector3 center] - Desired center position of the box ([page:Vector3]). <br>
-		[page:Vector3 size] - Desired x, y and z dimensions of the box ([page:Vector3]).<br /><br />
+		[page:Vector3 center] - 包围盒的中心位置 ([page:Vector3]). <br>
+		[page:Vector3 size] - 需要设置包围盒x,y,z的分量 ([page:Vector3]).<br /><br />
 
 
-		Centers this box on [page:Vector3 center] and sets this box's width and height to the values specified
-		in [page:Vector3 size].
-		</p>
+		将包围盒的中心点设为 [page:Vector3 center] ,然后将包围盒的宽高设为指定的 [page:Vector3 size]。
+		</p>-->	
 
 
 		<h3>[method:Box3 setFromCenterAndSize]( [param:Vector3 center], [param:Vector3 size] ) [param:Box3 this]</h3>
 		<h3>[method:Box3 setFromCenterAndSize]( [param:Vector3 center], [param:Vector3 size] ) [param:Box3 this]</h3>
 		<p>
 		<p>
-		[page:Vector3 center], - Desired center position of the box. <br>
-		[page:Vector3 size] - Desired x, y and z dimensions of the box.<br /><br />
+		[page:Vector3 center], - 包围盒所要设置的中心位置。 <br>
+		[page:Vector3 size] - 包围盒所要设置的x、y和z尺寸(宽/高/长)。<br /><br />
 
 
-		Centers this box on [page:Vector3 center] and sets this box's width, height and depth to the values specified <br>
-		in [page:Vector3 size]
+		将当前包围盒的中心点设置为 [page:Vector3 center] ,并将此包围盒的宽度,高度和深度设置为大小指定 [page:Vector3 size] 的值。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 setFromObject]( [param:Object3D object] )</h3>
 		<h3>[method:Box3 setFromObject]( [param:Object3D object] )</h3>
 		<p>
 		<p>
-		[page:Object3D object] - [page:Object3D] to compute the bounding box of.<br /><br />
+		[page:Object3D object] - 用来计算包围盒的3D对象 [page:Object3D]。<br /><br />
 
 
-		Computes the world-axis-aligned bounding box of an [page:Object3D] (including its children),
-		accounting for the object's, and children's, world transforms.
+		计算和世界轴对齐的一个对象 [page:Object3D] (含其子对象)的包围盒,计算对象和子对象的世界坐标变换。
 
 
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 setFromPoints]( [param:Array points] )</h3>
 		<h3>[method:Box3 setFromPoints]( [param:Array points] )</h3>
 		<p>
 		<p>
-		[page:Array points] - Array of [page:Vector3 Vector3s] that the resulting box will contain.<br /><br />
+		[page:Array points] - 计算出的包围盒将包含数组中所有的点 [page:Vector3 Vector3s]<br /><br />
 
 
-		Sets the upper and lower bounds of this box to include all of the points in [page:Array points].
+		设置此包围盒的上边界和下边界,以包含数组 [page:Array points] 中的所有点。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 translate]( [param:Vector3 offset] )</h3>
 		<h3>[method:Box3 translate]( [param:Vector3 offset] )</h3>
 		<p>
 		<p>
-		[page:Vector3 offset] - Direction and distance of offset.<br /><br />
+		[page:Vector3 offset] - 偏移方向和距离。<br /><br />
 
 
-		Adds [page:Vector3 offset] to both the upper and lower bounds of this box, effectively moving this box
-		[page:Vector3 offset] units in 3D space.
+		给包围盒的上下边界添加偏移量 [page:Vector3 offset],这样可以有效的在3D空间中移动包围盒。
+		偏移量为 [page:Vector3 offset] 大小。
 		</p>
 		</p>
 
 
 		<h3>[method:Box3 union]( [param:Box3 box] )</h3>
 		<h3>[method:Box3 union]( [param:Box3 box] )</h3>
 		<p>
 		<p>
-		[page:Box3 box] - Box that will be unioned with this box.<br /><br />
+		[page:Box3 box] - 要结合在一起的包围盒。<br /><br />
 
 
-		Unions this box with [page:Box3 box], setting the upper bound of this box to the greater of the
-		two boxes' upper bounds and the lower bound of this box to the lesser of the two boxes'
-		lower bounds.
+		在 [page:Box3 box] 参数的上边界和已有box对象的上边界之间取较大者,而对两者的下边界取较小者,这样获得一个新的较大的联合盒子。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 96 - 103
docs/api/zh/math/Color.html

@@ -8,15 +8,15 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>颜色([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-		Class representing a color.
+		表示一个颜色。
 		</p>
 		</p>
 
 
 
 
-		<h2>Examples</h2>
-		A Color can be initialised in any of the following ways:
+		<h2>示例(Examples)</h2>
+		颜色可以用以下任意一种方式初始化。
 		<code>
 		<code>
 //empty constructor - will default white
 //empty constructor - will default white
 var color = new THREE.Color();
 var color = new THREE.Color();
@@ -41,25 +41,25 @@ var color = new THREE.Color( 1, 0, 0 );
 
 
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造器(Constructor</h2>
 
 
 
 
 		<h3>[name]( [param:Color_Hex_or_String r], [param:Float g], [param:Float b] )</h3>
 		<h3>[name]( [param:Color_Hex_or_String r], [param:Float g], [param:Float b] )</h3>
 		<p>
 		<p>
-		[page:Color_Hex_or_String r] - (optional) If arguments [page:Float g] and [page:Float b] are defined, the red component of the color.
-		If they are not defined, it can be a [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] (recommended), a CSS-style string, or another Color instance.<br />
-		[page:Float g] - (optional) If it is defined, the green component of the color.<br />
-		[page:Float b] - (optional) If it is defined, the blue component of the color.<br /><br />
+		[page:Color_Hex_or_String r] - (可选参数)  如果参数g和b被定义,则r表示颜色中的红色分量。
+		如果未被定义,r可以是一个十六进制 [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] 颜色值或CSS样式的字符串或一个Color实例。<br />
+		[page:Float g] - (可选参数) 如果被定义,表示颜色中的绿色分量。<br />
+		[page:Float b] - (可选参数) 如果被定义,表示颜色中的蓝色分量。<br /><br />
 
 
-		Note that standard method of specifying color in three.js is with a [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet], and that method is used
-		throughout the rest of the documentation.<br /><br />
+		注意使用十六进制 [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] 定义一个颜色在three.js中是标准的方法,而且其余
+		文档也将会使用这个方法。<br /><br />
 
 
-		When all arguments are defined then [page:Color_Hex_or_String r] is the red component, [page:Float g] is the green component and [page:Float b] is the blue component of the color.<br />
-		When only [page:Color_Hex_or_String r] is defined:<br />
+		当所有参数被定义时,r是红色分量,g是绿色分量,b是蓝色分量。<br />
+		当只有 [page:Color_Hex_or_String r] 被定义时:<br />
 		<ul>
 		<ul>
-			<li>It can be a [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] representing the color (recommended).</li>
-			<li>It can be an another Color instance.</li>
-			<li>It can be a CSS-style string. For example:
+			<li>它可用一个十六进制 [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] 值表示颜色(推荐)。</li>
+			<li>它可以是一个另一个颜色实例。</li>
+			<li>它可以是另外一个CSS样式。例如:
 				<ul>
 				<ul>
 					<li>'rgb(250, 0,0)'</li>
 					<li>'rgb(250, 0,0)'</li>
 					<li>'rgb(100%,0%,0%)'</li>
 					<li>'rgb(100%,0%,0%)'</li>
@@ -73,28 +73,28 @@ var color = new THREE.Color( 1, 0, 0 );
 		</ul>
 		</ul>
 		</p>
 		</p>
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Boolean isColor]</h3>
 		<h3>[property:Boolean isColor]</h3>
 		<p>
 		<p>
-			Used to check whether this or derived classes are Colors. Default is *true*.<br /><br />
+			用来检测此类或者派生类是否为颜色。默认值是 *true*。<br /><br />
 
 
-			You should not change this, as it used internally for optimisation.
+			不应该去改变这个值,因为它在内部用于优化。
 		</p>
 		</p>
 
 
 		<h3>[property:Float r]</h3>
 		<h3>[property:Float r]</h3>
 		<p>
 		<p>
-		Red channel value between 0 and 1. Default is 1.
+			红色通道的值在0到1之间。默认值为1。
 		</p>
 		</p>
 
 
 		<h3>[property:Float g]</h3>
 		<h3>[property:Float g]</h3>
 		<p>
 		<p>
-		Green channel value between 0 and 1. Default is 1.
+			绿色通道的值在0到1之间。默认值为1。
 		</p>
 		</p>
 
 
 		<h3>[property:Float b]</h3>
 		<h3>[property:Float b]</h3>
 		<p>
 		<p>
-		Blue channel value between 0 and 1. Default is 1.
+			蓝色通道的值在0到1之间。默认值为1。
 		</p>
 		</p>
 
 
 
 
@@ -102,102 +102,99 @@ var color = new THREE.Color( 1, 0, 0 );
 
 
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法(Methods</h2>
 
 
 		<h3>[method:Color add]( [param:Color color] ) </h3>
 		<h3>[method:Color add]( [param:Color color] ) </h3>
-		<p>Adds the RGB values of [page:Color color] to the RGB values of this color.</p>
+		<p>将给定颜色的RGB值添加到此颜色的RGB值。</p>
 
 
 		<h3>[method:Color addColors]( [param:Color color1], [param:Color color2] ) </h3>
 		<h3>[method:Color addColors]( [param:Color color1], [param:Color color2] ) </h3>
-		<p>Sets this color's RGB values to the sum of the RGB values of [page:Color color1] and [page:Color color2].</p>
+		<p>将此颜色的RGB值设置为 [page:Color color1] 和 [page:Color color2] 的RGB值之和。</p>
 
 
 		<h3>[method:Color addScalar]( [param:Number s] ) </h3>
 		<h3>[method:Color addScalar]( [param:Number s] ) </h3>
-		<p>Adds [page:Number s] to the RGB values of this color.</p>
+		<p>给现有的RGB值都加上 [page:Number s] 。</p>
 
 
 		<h3>[method:Color clone]() </h3>
 		<h3>[method:Color clone]() </h3>
-		<p>Returns a new Color with the same [page:.r r], [page:.g g] and [page:.b b] values as this one.</p>
+		<p>返回一个与当前颜色的 [page:.r r], [page:.g g] 和 [page:.b b] 相同的颜色。</p>
 
 
 		<h3>[method:Color copy]( [param:Color color] ) </h3>
 		<h3>[method:Color copy]( [param:Color color] ) </h3>
 		<p>
 		<p>
-			Copies the [page:.r r], [page:.g g] and [page:.b b] parameters from [page:Color color] in to this color.
+			从 [page:Color color] 中拷贝 [page:.r r], [page:.g g] 和 [page:.b b] 值到当前的颜色。
 		</p>
 		</p>
 
 
 		<h3>[method:Color convertGammaToLinear]( [param:Float gammaFactor] ) </h3>
 		<h3>[method:Color convertGammaToLinear]( [param:Float gammaFactor] ) </h3>
 		<p>
 		<p>
-		[page:Float gammaFactor] - (optional). Default is *2.0*.<br /><br />
-		Converts this color from gamma space to linear space by taking [page:.r r], [page:.g g] and [page:.b b] to the power of [page:Float gammaFactor].
+		[page:Float gammaFactor] - (可选参数). 默认值 *2.0*.<br /><br />
+		通过取颜色 [page:.r r], [page:.g g] and [page:.b b] 的 [page:Float gammaFactor] 次方将颜色从伽马空间转换成线性空间。
 		</p>
 		</p>
 		
 		
 		<h3>[method:Color convertLinearToGamma]( [param:Float gammaFactor] ) </h3>
 		<h3>[method:Color convertLinearToGamma]( [param:Float gammaFactor] ) </h3>
 		<p>
 		<p>
-		[page:Float gammaFactor] - (optional). Default is *2.0*.<br /><br />
-		Converts this color from linear space to gamma space by taking [page:.r r], [page:.g g] and [page:.b b] to the power of 1 / [page:Float gammaFactor].
+		[page:Float gammaFactor] - (可选参数). 默认值 *2.0*.<br /><br />
+		通过取颜色 [page:.r r], [page:.g g] and [page:.b b] 的 1/[page:Float gammaFactor] 次方将颜色从线性空间转换成伽马空间。
 		</p>
 		</p>
 
 
 		<h3>[method:Color convertLinearToSRGB]() </h3>
 		<h3>[method:Color convertLinearToSRGB]() </h3>
 		<p>
 		<p>
-		Converts this color from linear space to sRGB space.
+			将此颜色从线性空间转换成sRGB空间。
 		</p>
 		</p>
 
 
 		<h3>[method:Color convertSRGBToLinear]() </h3>
 		<h3>[method:Color convertSRGBToLinear]() </h3>
 		<p>
 		<p>
-		Converts this color from sRGB space to linear space.
+			将此颜色从sRGB空间转换成线性空间。
 		</p>
 		</p>
 
 
 		<h3>[method:Color copyGammaToLinear]( [param:Color color], [param:Float gammaFactor] ) </h3>
 		<h3>[method:Color copyGammaToLinear]( [param:Color color], [param:Float gammaFactor] ) </h3>
 		<p>
 		<p>
-		[page:Color color] — Color to copy.<br />
-		[page:Float gammaFactor] - (optional). Default is *2.0*.<br /><br />
+		[page:Color color] — 需要拷贝的颜色。<br />
+		[page:Float gammaFactor] - (可选参数). 默认值为 *2.0*.<br /><br />
 
 
-		Copies the given color into this color, and then converts this color from gamma space to linear space
-		by taking [page:.r r], [page:.g g] and [page:.b b] to the power of [page:Float gammaFactor].
+		将传入的 [param:Color color] 从伽马空间转换到线性空间然后复制给当前颜色。
 		</p>
 		</p>
 
 
 		<h3>[method:Color copyLinearToGamma]( [param:Color color], [param:Float gammaFactor] ) </h3>
 		<h3>[method:Color copyLinearToGamma]( [param:Color color], [param:Float gammaFactor] ) </h3>
 		<p>
 		<p>
-		[page:Color color] — Color to copy.<br />
-		[page:Float gammaFactor] - (optional). Default is *2.0*.<br /><br />
+		[page:Color color] — 需要拷贝的颜色。<br />
+		[page:Float gammaFactor] - (可选参数). 默认值为 *2.0*.<br /><br />
 
 
-		Copies the given color into this color, and then converts this color from linear space to gamma space
-		by taking [page:.r r], [page:.g g] and [page:.b b] to the power of 1 / [page:Float gammaFactor].
+		将传入的 [param:Color color] 从线性空间转换到伽马空间然后复制给当前颜色。
 		</p>
 		</p>
 
 
 		<h3>[method:Color copyLinearToSRGB]( [param:Color color]] ) </h3>
 		<h3>[method:Color copyLinearToSRGB]( [param:Color color]] ) </h3>
 		<p>
 		<p>
-		[page:Color color] — Color to copy.<br />
+		[page:Color color] — 需要拷贝的颜色。<br />
 
 
-		Copies the given color into this color, and then converts this color from linear space to sRGB space.
+		将传入的 [param:Color color] 拷贝给当前颜色,然后将当前颜色从线性空间转换到sRGB空间。
 		</p>
 		</p>
 
 
 		<h3>[method:Color copySRGBToLinear]( [param:Color color] ) </h3>
 		<h3>[method:Color copySRGBToLinear]( [param:Color color] ) </h3>
 		<p>
 		<p>
-		[page:Color color] — Color to copy.<br />
+		[page:Color color] — 需要拷贝的颜色。<br />
 
 
-		Copies the given color into this color, and then converts this color from sRGB space to linear space.
+		将传入的 [param:Color color] 拷贝给当前颜色,然后将当前颜色从sRGB空间转换到线性空间。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean equals]( [param:Color color] ) </h3>
 		<h3>[method:Boolean equals]( [param:Color color] ) </h3>
-		<p>Compares the RGB values of [page:Color color] with those of this object. Returns true if they are the same, false otherwise.</p>
+		<p>将 [param:Color color] 的RGB值与该对象的RGB值进行比较。如果它们都是相同的,返回true,否则返回false。</p>
 
 
 		<h3>[method:Color fromArray]( [param:Array array], [param:Integer offset] ) </h3>
 		<h3>[method:Color fromArray]( [param:Array array], [param:Integer offset] ) </h3>
 		<p>
 		<p>
-		[page:Array array] - [page:Array] of floats in the form [ [page:Float r], [page:Float g], [page:Float b] ].<br />
-		[page:Integer offset] - An optional offset into the array.<br /><br />
+		[page:Array array] - 格式为 [ [page:Float r], [page:Float g], [page:Float b] ] 的数组 [page:Array]。<br />
+		[page:Integer offset] - 数组中可选偏移量<br /><br />
 
 
-		Sets this color's components based on an array formatted like [ [page:Float r], [page:Float g], [page:Float b] ].
+		从格式为[ [page:Float r], [page:Float g], [page:Float b] ]的数组数据中来创建Color对象。
 		</p>
 		</p>
 
 
 		<h3>[method:Integer getHex]()</h3>
 		<h3>[method:Integer getHex]()</h3>
-		<p>Returns the hexadecimal value of this color.</p>
+		<p>返回此颜色的十六进制值。</p>
 
 
 		<h3>[method:String getHexString]()</h3>
 		<h3>[method:String getHexString]()</h3>
-		<p>Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').</p>
+		<p>将此颜色的十六进制值作为字符串返回 (例如, 'FFFFFF')。</p>
 
 
 		<h3>[method:Object getHSL]( [param:Object target] )</h3>
 		<h3>[method:Object getHSL]( [param:Object target] )</h3>
 		<p>
 		<p>
-			[page:Object target] — the result will be copied into this Object. Adds h, s and l keys to the object (if not already present).<br /><br />
+			[page:Object target] — 结果将复制到这个对象中。向对象添加h、s和l键(如果不存在)。<br /><br />
 
 
-			Convert this Color's [page:.r r], [page:.g g] and [page:.b b] values to [link:https://en.wikipedia.org/wiki/HSL_and_HSV HSL]
-			format and returns an object of the form:
+			将此颜色的 [page:.r r], [page:.g g] 和 [page:.b b] 值转换为 [link:https://en.wikipedia.org/wiki/HSL_and_HSV HSL]格式,然后返回一个格式如下的对象:
 
 
 			<code>
 			<code>
 				{ h: 0, s: 0, l: 0 }
 				{ h: 0, s: 0, l: 0 }
@@ -206,117 +203,113 @@ var color = new THREE.Color( 1, 0, 0 );
 		</p>
 		</p>
 
 
 		<h3>[method:String getStyle]()</h3>
 		<h3>[method:String getStyle]()</h3>
-		<p>Returns the value of this color as a CSS style string. Example: 'rgb(255,0,0)'.</p>
+		<p>以CSS样式字符串的形式返回该颜色的值。例如:“rgb(255,0,0)”。</p>
 
 
 		<h3>[method:Color lerp]( [param:Color color], [param:Float alpha] ) </h3>
 		<h3>[method:Color lerp]( [param:Color color], [param:Float alpha] ) </h3>
 		<p>
 		<p>
-		[page:Color color] - color to converge on.<br />
-		[page:Float alpha] - interpolation factor in the closed interval [0, 1].<br /><br />
+		[page:Color color] - 用于收敛的颜色。<br />
+		[page:Float alpha] - 介于0到1的数字。<br /><br />
 
 
-		Linearly interpolates this color's RGB values toward the RGB values of the passed argument.
-		The alpha argument can be thought of as the ratio between the two colors, where 0.0 is
-		this color and 1.0 is the first argument.
+		将该颜色的RGB值线性插值到传入参数的RGB值。alpha参数可以被认为是两种颜色之间的比例值,其中0是当前颜色和1.0是第一个参数的颜色。
 		</p>
 		</p>
 
 
 		<h3>[method:Color lerpHSL]( [param:Color color], [param:Float alpha] ) </h3>
 		<h3>[method:Color lerpHSL]( [param:Color color], [param:Float alpha] ) </h3>
 		<p>
 		<p>
-		[page:Color color] - color to converge on.<br />
-		[page:Float alpha] - interpolation factor in the closed interval [0, 1].<br /><br />
-
-		Linearly interpolates this color's HSL values toward the HSL values of the passed argument.
-		It differs from the classic [page:.lerp] by not interpolating straight from one color to the other,
-		but instead going through all the hues in between those two colors.
-		The alpha argument can be thought of as the ratio between the two colors, where 0.0 is
-		this color and 1.0 is the first argument.
+		[page:Color color] - 用于收敛的颜色。<br />
+		[page:Float alpha] - 介于0到1的数字。<br /><br />
+
+		将该颜色的HSL值线性插值到传递参数的HSL值。它不同于上诉的[page:lerp]。通过不直接从一种颜色插入到另一种颜色,
+		而是通过插值这两种颜色之间的所有色相(H)、亮度(L)、饱和度(S)。alpha参数可以被认为是两种颜色之间的比例值,
+		其中0是当前颜色和1.0是第一个参数的颜色。
 		</p>
 		</p>
 
 
 		<h3>[method:Color multiply]( [param:Color color] ) </h3>
 		<h3>[method:Color multiply]( [param:Color color] ) </h3>
-		<p>Multiplies this color's RGB values by the given [page:Color color]'s RGB values.</p>
+		<p>将此颜色的RGB值乘以给定的[page: color color]的RGB值。</p>
 
 
 		<h3>[method:Color multiplyScalar]( [param:Number s] ) </h3>
 		<h3>[method:Color multiplyScalar]( [param:Number s] ) </h3>
-		<p>Multiplies this color's RGB values by [page:Number s].</p>
+		<p>将此颜色的RGB值乘以给定的[page:Number s]的值。</p>
 
 
 		<h3>[method:Color offsetHSL]( [param:Float h], [param:Float s], [param:Float l] ) </h3>
 		<h3>[method:Color offsetHSL]( [param:Float h], [param:Float s], [param:Float l] ) </h3>
 		<p>
 		<p>
-			Adds the given [page:Float h], [page:Float s], and [page:Float l] to this color's values.
-			Internally, this converts the color's [page:.r r], [page:.g g] and [page:.b b] values to HSL, adds
-			[page:Float h], [page:Float s], and [page:Float l], and then converts the color back to RGB.
+			将给定的 [page:Float h], [page:Float s], 和 [page:Float l]值加到当前颜色值。
+			内部的机制为:先将该颜色的 [page:.r r], [page:.g g] 和 [page:.b b] 值转换为HSL,然后与传入的[page:Float h], [page:Float s], 和 [page:Float l]
+			相加,最后再将结果转成RGB值。
 		</p>
 		</p>
 
 
 		<h3>[method:Color set]( [param:Color_Hex_or_String value] ) </h3>
 		<h3>[method:Color set]( [param:Color_Hex_or_String value] ) </h3>
 		<p>
 		<p>
-		[page:Color_Hex_or_String value] - Value to set this color to.<br /><br />
+		[page:Color_Hex_or_String value] - 用于设置该颜色的值。<br /><br />
 
 
-		See the Constructor above for full details of what [page:Color_Hex_or_String value] can be.
-		Delegates to [page:.copy], [page:.setStyle], or [page:.setHex] depending on input type.
+		有关 [page:Color_Hex_or_String value] 的详细信息,请参阅上面的构造函数。
+		根据输入类型,将会委托给 [page:.copy], [page:.setStyle], 或者 [page:.setHex] 函数处理。
 		</p>
 		</p>
 
 
 		<h3>[method:Color setHex]( [param:Integer hex] ) </h3>
 		<h3>[method:Color setHex]( [param:Integer hex] ) </h3>
 		<p>
 		<p>
-		[page:Integer hex] — [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] format.<br /><br />
+		[page:Integer hex] — [link:https://en.wikipedia.org/wiki/Web_colors#Hex_triplet hexadecimal triplet] 格式。<br /><br />
+
+		采用十六进制值设置此颜色。
 
 
-		Sets this color from a hexadecimal value.
 		</p>
 		</p>
 
 
 		<h3>[method:Color setHSL]( [param:Float h], [param:Float s], [param:Float l] ) </h3>
 		<h3>[method:Color setHSL]( [param:Float h], [param:Float s], [param:Float l] ) </h3>
 		<p>
 		<p>
-		[page:Float h] — hue value between 0.0 and 1.0 <br />
-		[page:Float s] — saturation value between 0.0 and 1.0 <br />
-		[page:Float l] — lightness value between 0.0 and 1.0<br /><br />
+		[page:Float h] — 色相值处于0到1之间。hue value between 0.0 and 1.0 <br />
+		[page:Float s] — 饱和度值处于0到1之间。<br />
+		[page:Float l] — 亮度值处于0到1之间。<br /><br />
 
 
-		Sets color from HSL values.
+		采用HLS值设置此颜色。
 		</p>
 		</p>
 
 
 		<h3>[method:Color setRGB]( [param:Float r], [param:Float g], [param:Float b] ) </h3>
 		<h3>[method:Color setRGB]( [param:Float r], [param:Float g], [param:Float b] ) </h3>
 		<p>
 		<p>
-		[page:Float r] — Red channel value between 0.0 and 1.0.<br />
-		[page:Float g] — Green channel value between 0.0 and 1.0.<br />
-		[page:Float b] — Blue channel value between 0.0 and 1.0.<br /><br />
+		[page:Float r] — 红色通道的值在0到1之间。<br />
+		[page:Float g] — 绿色通道的值在0到1之间。<br />
+		[page:Float b] — 蓝色通道的值在0到1之间。<br /><br />
 
 
-		Sets this color from RGB values.
+		采用RGB值设置此颜色。
 		</p>
 		</p>
 
 
 		<h3>[method:Color setScalar]( [param:Float scalar] ) </h3>
 		<h3>[method:Color setScalar]( [param:Float scalar] ) </h3>
 		<p>
 		<p>
-		[page:Float scalar] — a value between 0.0 and 1.0.<br /><br />
+		[page:Float scalar] — 处于0到1之间的值<br /><br />
 
 
-		Sets all three color components to the value [page:Float scalar].
+		将颜色的RGB值都设为该 [page:Float scalar] 的值。
 		</p>
 		</p>
 
 
 		<h3>[method:Color setStyle]( [param:String style] ) </h3>
 		<h3>[method:Color setStyle]( [param:String style] ) </h3>
 		<p>
 		<p>
-		[page:String style] — color as a CSS-style string.<br /><br />
+		[page:String style] — 颜色css样式的字符串<br /><br />
 
 
-		Sets this color from a CSS-style string. For example,
+		采用ccs样式的字符串设置此颜色。例如,
 		"rgb(250, 0,0)",
 		"rgb(250, 0,0)",
 		"rgb(100%, 0%, 0%)",
 		"rgb(100%, 0%, 0%)",
 		"hsl(0, 100%, 50%)",
 		"hsl(0, 100%, 50%)",
 		"#ff0000",
 		"#ff0000",
-		"#f00", or
-		"red" ( or any [link:https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart X11 color name]
-		- all 140 color names are supported ).<br />
+		"#f00", 或者
+		"red" ( 或者任何 [link:https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart X11 color name]
+		- 所有140种颜色名称都支持 ).<br />
 
 
-		Translucent colors such as "rgba(255, 0, 0, 0.5)" and "hsla(0, 100%, 50%, 0.5)" are also accepted,
-		but the alpha-channel coordinate will be discarded.<br /><br />
+		半透明颜色例如 "rgba(255, 0, 0, 0.5)" and "hsla(0, 100%, 50%, 0.5)" 也能支持,
+		但是alpha通道的值将会被丢弃。<br /><br />
 
 
-		Note that for X11 color names, multiple words such as Dark Orange become the string 'darkorange' (all lowercase).
+		注意,对于X11颜色名称,多个单词(如暗橙色)变成字符串“darkorange”(全部是小写字母)。
 		</p>
 		</p>
 
 
 		<h3>[method:Color sub]( [param:Color color] ) </h3>
 		<h3>[method:Color sub]( [param:Color color] ) </h3>
 		<p>
 		<p>
-		Subtracts the RGB components of the given color from the RGB components of this color.
-		If this results in a negative component, that component is set to zero.
+		从该颜色的RGB分量中减去传入颜色的RGB分量。如果分量结果是负,则该分量为零。
 		</p>
 		</p>
 
 
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] ) </h3>
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] ) </h3>
 		<p>
 		<p>
-		[page:Array array] - An optional array to store the color to. <br />
-		[page:Integer offset] - An optional offset into the array.<br /><br />
+		[page:Array array] -  存储颜色的可选数组 <br />
+		[page:Integer offset] - 数组的可选偏移量<br /><br />
 
 
-		Returns an array of the form [ r, g, b ].
+		返回一个格式为[ r, g, b ] 数组。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 17 - 19
docs/api/zh/math/Cylindrical.html

@@ -8,26 +8,25 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>圆柱体[name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
 			A point's [link:https://en.wikipedia.org/wiki/Cylindrical_coordinate_system cylindrical coordinates].
 			A point's [link:https://en.wikipedia.org/wiki/Cylindrical_coordinate_system cylindrical coordinates].
 		</p>
 		</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造器(Constructor</h2>
 
 
 		<h3>[name]( [param:Float radius], [param:Float theta], [param:Float y] )</h3>
 		<h3>[name]( [param:Float radius], [param:Float theta], [param:Float y] )</h3>
 		<p>
 		<p>
-		[page:Float radius] - distance from the origin to a point in the x-z plane.
-		Default is *1.0*.<br />
-		[page:Float theta] - counterclockwise angle in the x-z plane measured in radians
-		from the positive z-axis. Default is *0*.<br />
-		[page:Float y] - height above the x-z plane. Default is *0*.
+		[page:Float radius] - 从原点到x-z平面上一点的距离
+		默认值为 *1.0*.<br />
+		[page:Float theta] - 在x-z平面内的逆时针角度,以z轴正方向的计算弧度。默认值为0。<br />
+		[page:Float y] - x-z平面以上的高度 默认值为 *0*.
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Float radius]</h3>
 		<h3>[property:Float radius]</h3>
 
 
@@ -40,33 +39,32 @@
 
 
 		<h3>[method:Cylindrical clone]()</h3>
 		<h3>[method:Cylindrical clone]()</h3>
 		<p>
 		<p>
-		Returns a new cylindrical with the same [page:.radius radius], [page:.theta theta]
-		and [page:.y y] properties as this one.
+			返回一个与当前拥有相同 [page:.radius radius], [page:.theta theta] 和 [page:.y y] 属性的圆柱体。
 		</p>
 		</p>
 
 
 		<h3>[method:Cylindrical copy]( [param:Cylindrical other] )</h3>
 		<h3>[method:Cylindrical copy]( [param:Cylindrical other] )</h3>
 		<p>
 		<p>
-			Copies the values of the passed Cylindrical's [page:.radius radius], [page:.theta theta]
-			and [page:.y y] properties to this cylindrical.
+			将传入的圆柱体对象的 [page:.radius radius], [page:.theta theta] 和 [page:.y y] 属性赋给当前对象。
 		</p>
 		</p>
 
 
 		<h3>[method:Cylindrical set]( [param:Float radius], [param:Float theta], [param:Float y] )</h3>
 		<h3>[method:Cylindrical set]( [param:Float radius], [param:Float theta], [param:Float y] )</h3>
-		<p>Sets values of this cylindrical's [page:.radius radius], [page:.theta theta]
-		and [page:.y y] properties.</p>
+		<p>设置该对象的 [page:.radius radius], [page:.theta theta]
+		和 [page:.y y] 属性。</p>
 
 
 		<h3>[method:Cylindrical setFromVector3]( [param:Vector3 vec3] )</h3>
 		<h3>[method:Cylindrical setFromVector3]( [param:Vector3 vec3] )</h3>
 		<p>
 		<p>
-			Sets values of this cylindrical's [page:.radius radius], [page:.theta theta]
-			and [page:.y y] properties from the [page:Vector3 Vector3].
+			从 [page:Vector3 Vector3] 中取x,y,z,并调用setFromCartesianCoords来设置圆柱体的
+			[page:.radius radius]、[page:.theta theta] 和 [page:.y y] 的属性值。
+
 		</p>
 		</p>
 
 
 		<h3>[method:Cylindrical setFromCartesianCoords]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<h3>[method:Cylindrical setFromCartesianCoords]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<p>
 		<p>
-			Sets values of this cylindrical's [page:.radius radius], [page:.theta theta]
-			and [page:.y y] properties from Cartesian coordinates.
+			使用笛卡尔坐标来设置该圆柱体的 [page:.radius radius], [page:.theta theta]
+			and [page:.y y] 属性值。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 64 - 75
docs/api/zh/math/Euler.html

@@ -11,13 +11,11 @@
 		<h1>[name]</h1>
 		<h1>[name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-			A class representing [link:http://en.wikipedia.org/wiki/Euler_angles Euler Angles].<br /><br />
-
-			Euler angles describe a rotational transformation by rotating an object on its various
-			axes in specified amounts per axis, and a specified axis order.
+			表示 [link:http://en.wikipedia.org/wiki/Euler_angles Euler] 的类。<br /><br />
+			欧拉角描述一个旋转变换,通过指定轴顺序和其各个轴向上的指定旋转角度来旋转一个物体。
 		</p>
 		</p>
 
 
-		<h2>Example</h2>
+		<h2>示例(Example</h2>
 
 
 		<code>var a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );
 		<code>var a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );
 		var b = new THREE.Vector3( 1, 0, 1 );
 		var b = new THREE.Vector3( 1, 0, 1 );
@@ -25,167 +23,158 @@
 		</code>
 		</code>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造器(Constructor</h2>
 
 
 
 
 		<h3>[name]( [param:Float x], [param:Float y], [param:Float z], [param:String order] )</h3>
 		<h3>[name]( [param:Float x], [param:Float y], [param:Float z], [param:String order] )</h3>
 		<p>
 		<p>
-		[page:Float x] - (optional) the angle of the x axis in radians. Default is *0*.<br />
-		[page:Float y] - (optional) the angle of the y axis in radians. Default is *0*.<br />
-		[page:Float z] - (optional) the angle of the z axis in radians. Default is *0*.<br />
-		[page:String order] - (optional) a string representing the order that the rotations are applied,
-		defaults to 'XYZ' (must be upper case).<br /><br />
+		[page:Float x] - (optional) 用弧度表示x轴旋转量。 默认值是 *0*。<br />
+		[page:Float y] - (optional) 用弧度表示y轴旋转量。 默认值是 *0*。<br />
+		[page:Float z] - (optional) 用弧度表示z轴旋转量。 默认值是 *0*。<br />
+		[page:String order] - (optional) 表示旋转顺序的字符串,默认为'XYZ'(必须是大写)。<br /><br />
 
 
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Boolean isEuler]</h3>
 		<h3>[property:Boolean isEuler]</h3>
 		<p>
 		<p>
-			Used to check whether this or derived classes are Eulers. Default is *true*.<br /><br />
-
-			You should not change this, as it used internally for optimisation.
+			用于判定此对象或者此类的派生对象是否是欧拉角。默认值为 *true*。<br /><br />
+			
+			不应该改变该值,因为它在内部用于优化。
 		</p>
 		</p>
 
 
 		<h3>[property:String order]</h3>
 		<h3>[property:String order]</h3>
 		<p>
 		<p>
-			The order in which to apply rotations. Default is 'XYZ', which means that the object will first be
-			rotated around its X axis, then its Y axis and finally its Z axis. Other possibilities are:
-			'YZX', 'ZXY', 'XZY', 'YXZ' and 'ZYX'. These must be in upper case.<br /><br />
+			order值应用于旋转顺序。默认值为 'XYZ',这意味着对象将首先是
+			绕X轴旋转,然后是Y轴,最后是Z轴。其他可能性包括:
+			'YZX', 'ZXY', 'XZY', 'YXZ'和'ZYX'。这些必须是大写字母。<br /><br />
+			Three.js 使用<em>intrinsic</em> Tait-Bryan angles(Yaw、Pitch、Roll)。
+			这意味着旋转是在<em>本地</em>坐标系下进行的。也就是说,对于“XYZ”订单,首先是围绕local-X轴旋转(与world- x轴相同),
+			然后是local-Y(现在可能与world y轴不同),然后是local-Z(可能与world z轴不同)。<br /><br />
 
 
-			Three.js uses <em>intrinsic</em> Tait-Bryan angles. This means that rotations are performed with respect
-			to the <em>local</em> coordinate system. That is, for order 'XYZ', the rotation is first around the local-X
-			axis (which is the same as the world-X axis), then around local-Y (which may now be different from the
-			world Y-axis), then local-Z (which may be different from the world Z-axis).<br /><br />
-
-			If the order is changed, [page:.onChangeCallback onChangeCallback] will be called.
+			如果order值被改变,[page:.onChangeCallback onChangeCallback] 会被调用。
 		</p>
 		</p>
 
 
 		<h3>[property:Float x]</h3>
 		<h3>[property:Float x]</h3>
 		<p>
 		<p>
-			The current value of the x component.<br /><br />
+			当前x分量的值。<br /><br />
 
 
-			If this is changed, [page:.onChangeCallback onChangeCallback] will be called.
+			如果这个值发生变化,[page:.onChangeCallback onChangeCallback] 会被调用。
 		</p>
 		</p>
 
 
 		<h3>[property:Float y]</h3>
 		<h3>[property:Float y]</h3>
 		<p>
 		<p>
-			The current value of the y component.<br /><br />
+			当前y分量的值。<br /><br />
 
 
-			If this is changed, [page:.onChangeCallback onChangeCallback] will be called.
+			如果这个值发生变化,[page:.onChangeCallback onChangeCallback] 会被调用。
 		</p>
 		</p>
 
 
 		<h3>[property:Float z]</h3>
 		<h3>[property:Float z]</h3>
 		<p>
 		<p>
-			The current value of the z component.<br /><br />
+			当前z分量的值。<br /><br />
 
 
-			If this is changed, [page:.onChangeCallback onChangeCallback] will be called.
+			如果这个值发生变化,[page:.onChangeCallback onChangeCallback] 会被调用。
 		</p>
 		</p>
 
 
-		<h2>Methods</h2>
+		<h2>方法(Methods</h2>
 
 
 		<h3>[method:Euler copy]( [param:Euler euler] )</h3>
 		<h3>[method:Euler copy]( [param:Euler euler] )</h3>
-		<p>Copies value of [page:Euler euler] to this euler.</p>
+		<p>将 [page:Euler euler] 的属性拷贝到当前对象。</p>
 
 
 		<h3>[method:Euler clone]()</h3>
 		<h3>[method:Euler clone]()</h3>
-		<p>Returns a new Euler with the same parameters as this one.</p>
+		<p>返回一个与当前参数相同的新欧拉角。</p>
 
 
 		<h3>[method:Boolean equals]( [param:Euler euler] )</h3>
 		<h3>[method:Boolean equals]( [param:Euler euler] )</h3>
-		<p>Checks for strict equality of this euler and [page:Euler euler].</p>
+		<p>检查 [page:Euler euler] 是否与当前对象相同。</p>
 
 
 		<h3>[method:Euler fromArray]( [param:Array array] )</h3>
 		<h3>[method:Euler fromArray]( [param:Array array] )</h3>
 		<p>
 		<p>
-		[page:Array array] of length 3 or 4. The optional 4th argument corresponds to the [page:.order order].<br /><br />
-
-		Assigns this euler's [page:.x x] angle to array[0]. <br />
-		Assigns this euler's [page:.y y] angle to array[1]. <br />
-		Assigns this euler's [page:.z z] angle to array[2]. <br />
-		Optionally assigns this euler's [page:.order order] to array[3].
+		长度为3或4的一个 [page:Array array] 。array[3] 是一个可选的 [page:.order order] 参数。<br /><br />
+		
+		将欧拉角的x分量设置为 array[0]。 <br />
+		将欧拉角的x分量设置为 array[1]。 <br />
+		将欧拉角的x分量设置为 array[2]。 <br />
+		将array[3]设置给欧拉角的 [page:.order order] 。可选。
 		</p>
 		</p>
 
 
 		<h3>[method:Euler onChange]( [param:Function onChangeCallback] )</h3>
 		<h3>[method:Euler onChange]( [param:Function onChangeCallback] )</h3>
 		<p>
 		<p>
-			[page:Function onChangeCallback] - set the value of the onChangeCallback() function.
+			[page:Function onChangeCallback] - 为 onChangeCallback() 函数赋值。
 		</p>
 		</p>
 
 
 		<h3>[method:Euler onChangeCallback](  )</h3>
 		<h3>[method:Euler onChangeCallback](  )</h3>
 		<p>
 		<p>
-			By default this is an empty function, however it can be set via [page:.onChange onChange]().<br />
-			It gets called after changing the [page:.x x], [page:.y y], [page:.z z] or [page:.order order] properties,
-			and also after calling most setter functions (see those for details).
+			默认情况下,这个函数为空,但是它可以通过[page:.onChange onChange]()来设置。<br />
+			在更改 [page:.x x], [page:.y y], [page:.z z] 或 [page:.order order] 属性之后调用它,
+			在调用大多数setter函数之后也会调用它(详细信息请参阅那些函数)。
 		</p>
 		</p>
 
 
 		<h3>[method:Euler reorder]( [param:String newOrder] )</h3>
 		<h3>[method:Euler reorder]( [param:String newOrder] )</h3>
 		<p>
 		<p>
-		Resets the euler angle with a new order by creating a quaternion from this euler angle
-		and then setting this euler angle with the quaternion and the new order. <br /><br />
+		通过这个欧拉角创建一个四元数,然后用这个四元数和新顺序设置这个欧拉角。 <br /><br />
 
 
-		<em>WARNING</em>: this discards revolution information.
+		<em>警告</em>: 这将弃用旋转信息。
 		</p>
 		</p>
 
 
 		<h3>[method:Euler set]( [param:Float x], [param:Float y], [param:Float z], [param:String order] )</h3>
 		<h3>[method:Euler set]( [param:Float x], [param:Float y], [param:Float z], [param:String order] )</h3>
 		<p>
 		<p>
-			[page:.x x] - the angle of the x axis in radians.<br />
-			[page:.y y] - the angle of the y axis in radians.<br />
-			[page:.z z] - the angle of the z axis in radians.<br />
-			[page:.order order] - (optional) a string representing the order that the rotations are applied.<br /><br />
+			[page:.x x] - 用弧度表示x轴旋转量。<br />
+			[page:.y y] - 用弧度表示y轴旋转量。<br />
+			[page:.z z] - 用弧度表示z轴旋转量。<br />
+			[page:.order order] - (optional) 表示旋转顺序的字符串。<br /><br />
 
 
-			Sets the angles of this euler transform and optionally the [page:.order order] and then call [page:.onChangeCallback onChangeCallback]().
+			设置该欧拉变换的角度和旋转顺序 [page:.order order] ,然后调用  [page:.onChangeCallback onChangeCallback]()。
 		</p>
 		</p>
 
 
 		<h3>[method:Euler setFromRotationMatrix]( [param:Matrix4 m], [param:String order], [param:Boolean update] )</h3>
 		<h3>[method:Euler setFromRotationMatrix]( [param:Matrix4 m], [param:String order], [param:Boolean update] )</h3>
 		<p>
 		<p>
-		[page:Matrix4 m] - a [page:Matrix4] of which the upper 3x3 of matrix is a pure
-		[link:https://en.wikipedia.org/wiki/Rotation_matrix rotation matrix] (i.e. unscaled).<br />
-		[page:.order order] - (optional) a string representing the order that the rotations are applied.<br />
-		[page:Boolean update] - (optional) whether to call [page:.onChangeCallback onChangeCallback]() after applying
-		the matrix.<br /><br />
+		[page:Matrix4 m] - [page:Matrix4] 矩阵上面的3x3部分是一个纯旋转矩阵[link:https://en.wikipedia.org/wiki/Rotation_matrix rotation matrix]
+		(也就是不发生缩放)<br />
+		[page:.order order] - (可选参数) 表示旋转顺序的字符串。<br />
+		[page:Boolean update] - (可选参数) 表示设置完变换矩阵后是否调用 [page:.onChangeCallback onChangeCallback]。<br /><br />
 
 
-		Sets the angles of this euler transform from a pure rotation matrix based on the orientation
-		specified by order.
+		使用基于 [page:.order order] 顺序的纯旋转矩阵来设置当前欧拉角。
 		</p>
 		</p>
 
 
 		<h3>[method:Euler setFromQuaternion]( [param:Quaternion q], [param:String order], [param:Boolean update] )</h3>
 		<h3>[method:Euler setFromQuaternion]( [param:Quaternion q], [param:String order], [param:Boolean update] )</h3>
 		<p>
 		<p>
-		[page:Quaternion q] - a normalized quaternion.<br />
-		[page:.order order] - (optional) a string representing the order that the rotations are applied.<br />
-		[page:Boolean update] - (optional) whether to call [page:.onChangeCallback onChangeCallback]() after applying
-		the matrix.<br /><br />
+		[page:Quaternion q] - 归一化的四元数。<br />
+		[page:.order order] - (可选参数) 表示旋转顺序的字符串。<br />
+		[page:Boolean update] - (可选参数) 表示设置完变换矩阵后是否调用 [page:.onChangeCallback onChangeCallback]。<br /><br />
 
 
-		Sets the angles of this euler transform from a normalized quaternion based on the orientation
-		specified by [page:.order order].
+		根据 [page:.order order] 指定的方向,使用归一化四元数设置这个欧拉变换的角度。
 		</p>
 		</p>
 
 
 
 
 		<h3>[method:Euler setFromVector3]( [param:Vector3 vector], [param:String order] )</h3>
 		<h3>[method:Euler setFromVector3]( [param:Vector3 vector], [param:String order] )</h3>
 		<p>
 		<p>
 		[page:Vector3 vector] - [page:Vector3].<br />
 		[page:Vector3 vector] - [page:Vector3].<br />
-		[page:.order order] - (optional) a string representing the order that the rotations are applied.<br /><br />
+		[page:.order order] - (可选参数) 表示旋转顺序的字符串。<br /><br />
 
 
-		Set the [page:.x x], [page:.y y] and [page:.z z], and optionally update the [page:.order order]. [page:.onChangeCallback onChangeCallback]()
-		is called after these changes are made.
+		设置 [page:.x x], [page:.y y] and [page:.z z] 并且选择性更新 [page:.order order]。
+		更改完成之后调用 [page:.onChangeCallback onChangeCallback]()。
 		</p>
 		</p>
 
 
 
 
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] )</h3>
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] )</h3>
 		<p>
 		<p>
-		[page:Array array] - (optional) array to store the euler in.<br />
-		[page:Integer offset] (optional) offset in the array.<br />
+		[page:Array array] - (可选参数) 存储欧拉角的数组。<br />
+		[page:Integer offset] (可选参数) 数组的偏移量。<br />
 
 
-		Returns an array of the form [[page:.x x], [page:.y y], [page:.z z], [page:.order order ]].
+		返回一个数组:[[page:.x x], [page:.y y], [page:.z z], [page:.order order ]]。
 		</p>
 		</p>
 
 
 		<h3>[method:Vector3 toVector3]( [param:Vector3 optionalResult] )</h3>
 		<h3>[method:Vector3 toVector3]( [param:Vector3 optionalResult] )</h3>
 		<p>
 		<p>
-			[page:Vector3 optionalResult] — (optional) If specified, the result will be copied into this Vector,
-			otherwise a new one will be created. <br /><br />
+			[page:Vector3 optionalResult] — (可选参数) 如果指定了该参数结果将会被复制给该参数,否者会创建一个新的 Vector3 <br /><br />
 
 
-			Returns the Euler's [page:.x x], [page:.y y] and [page:.z z] properties as a [page:Vector3].
+			以 [page:Vector3] 的形式返回欧拉角的 [page:.x x], [page:.y y] 和 [page:.z z]。
 		</p>
 		</p>
 
 
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 33 - 36
docs/api/zh/math/Frustum.html

@@ -8,99 +8,96 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>视锥体([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-			[link:http://en.wikipedia.org/wiki/Frustum Frustums] are used to determine what is
-			inside the camera's field of view. They help speed up the rendering process - object which lie
-			outside a camera's frustum can safely be excluded from rendering.<br /><br />
+			[link:http://en.wikipedia.org/wiki/Frustum Frustums] 用于确定相机视野内的东西。
+			它有助于加速渲染过程——位于摄像机视锥体外的物体可以安全地排除在渲染之外。<br /><br />
 
 
-			This class is mainly intended for use internally by a renderer for calculating
-			a [page:Camera camera] or [page:LightShadow.camera shadowCamera]'s frustum.
+			该类主要用于渲染器内部计算 [page:Camera camera] 或 [page:LightShadow.camera shadowCamera]的视锥体。
 		</p>
 		</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造器(Constructor)</h2>
 
 
 
 
 		<h3>[name]([param:Plane p0], [param:Plane p1], [param:Plane p2], [param:Plane p3], [param:Plane p4], [param:Plane p5])</h3>
 		<h3>[name]([param:Plane p0], [param:Plane p1], [param:Plane p2], [param:Plane p3], [param:Plane p4], [param:Plane p5])</h3>
 		<p>
 		<p>
-			[page:Plane p0] - (optional) defaults to a new [page:Plane].<br />
-			[page:Plane p1] - (optional) defaults to a new [page:Plane].<br />
-			[page:Plane p2] - (optional) defaults to a new [page:Plane].<br />
-			[page:Plane p3] - (optional) defaults to a new [page:Plane].<br />
-			[page:Plane p4] - (optional) defaults to a new [page:Plane].<br />
-			[page:Plane p5] - (optional) defaults to a new [page:Plane].<br /><br />
-
-			Creates a new [name].
+			[page:Plane p0] - (可选参数)  [page:Plane].<br />
+			[page:Plane p1] - (可选参数)  [page:Plane].<br />
+			[page:Plane p2] - (可选参数)  [page:Plane].<br />
+			[page:Plane p3] - (可选参数)  [page:Plane].<br />
+			[page:Plane p4] - (可选参数)  [page:Plane].<br />
+			[page:Plane p5] - (可选参数)  [page:Plane].<br /><br />
+
+			使用6个面来构建一个视锥体。
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Array planes]</h3>
 		<h3>[property:Array planes]</h3>
-		<p>Array of 6 [page:Plane planes].</p>
+		<p>包含6个平面 [page:Plane planes] 的数组。</p>
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法(Methods</h2>
 
 
 		<h3>[method:Frustum clone]()</h3>
 		<h3>[method:Frustum clone]()</h3>
-		<p>Return a new Frustum with the same parameters as this one.</p>
+		<p>返回一个与当前对象有相同参数的视锥体。</p>
 
 
 
 
 		<h3>[method:Boolean containsPoint]( [param:Vector3 point] )</h3>
 		<h3>[method:Boolean containsPoint]( [param:Vector3 point] )</h3>
 		<p>
 		<p>
 		[page:Vector3 point] - [page:Vector3] to test.<br /><br />
 		[page:Vector3 point] - [page:Vector3] to test.<br /><br />
 
 
-		Checks to see if the frustum contains the [page:Vector3 point].
+		检测该点 [page:Vector3 point] 是否在视锥体内。
 		</p>
 		</p>
 
 
 		<h3>[method:Frustum copy]( [param:Frustum frustum] )</h3>
 		<h3>[method:Frustum copy]( [param:Frustum frustum] )</h3>
 		<p>
 		<p>
-		[page:Frustum frustum] - The frustum to copy<br /><br />
+		[page:Frustum frustum] - 用于拷贝的视锥体。<br /><br />
 
 
-		Copies the properties of the passed [page:Frustum frustum] into this one.
+		将传入 [page:Frustum frustum] 的属性拷贝到当前对象。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsBox]( [param:Box3 box] )</h3>
 		<h3>[method:Boolean intersectsBox]( [param:Box3 box] )</h3>
 		<p>
 		<p>
-		[page:Box3 box] - [page:Box3] to check for intersection.<br /><br />
-
-	 	Return true if [page:Box3 box] intersects with this frustum.
+		[page:Box3 box] - [page:Box3] 用于检测是否要交的包围盒。<br /><br />
+		
+		返回 true 如果该 [page:Box3 box] 与视锥体相交。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsObject]( [param:Object3D object] )</h3>
 		<h3>[method:Boolean intersectsObject]( [param:Object3D object] )</h3>
 		<p>
 		<p>
-			Checks whether the [page:Object3D object]'s [page:Geometry.boundingSphere bounding sphere] is intersecting the Frustum.<br /><br />
+			检测 [page:Object3D object] 的包围球 [page:Geometry.boundingSphere bounding sphere] 是否与视锥体相交。<br /><br />
 
 
-			Note that the object must have a [page:Geometry] or [page:BufferGeometry] so that the bounding sphere
-			can be calculated.
+			注意:该对象必须有一个 [page:Geometry] 或 [page:BufferGeometry] ,因为这样才能计算出包围球。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsSphere]( [param:Sphere sphere] )</h3>
 		<h3>[method:Boolean intersectsSphere]( [param:Sphere sphere] )</h3>
 		<p>
 		<p>
-		[page:Sphere sphere] - [page:Sphere] to check for intersection.<br /><br />
+		[page:Sphere sphere] - [page:Sphere] 用于检查是否相交。<br /><br />
 
 
-	 	Return true if [page:Sphere sphere] intersects with this frustum.
+		返回true 如果球[page:Sphere sphere]与视锥体相交。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean intersectsSprite]( [param:Sprite sprite] )</h3>
 		<h3>[method:Boolean intersectsSprite]( [param:Sprite sprite] )</h3>
 		<p>
 		<p>
-			Checks whether the [page:Sprite sprite] is intersecting the Frustum.<br /><br />
+			检查精灵[page:Sprite sprite]是否与截锥体相交。<br /><br />
 		</p>
 		</p>
 
 
 		<h3>[method:Frustum set]( [param:Plane p0], [param:Plane p1], [param:Plane p2], [param:Plane p3], [param:Plane p4], [param:Plane p5] )</h3>
 		<h3>[method:Frustum set]( [param:Plane p0], [param:Plane p1], [param:Plane p2], [param:Plane p3], [param:Plane p4], [param:Plane p5] )</h3>
 		<p>
 		<p>
-		Sets the current frustum from the passed planes. No plane order is implicitely implied.
+			使用传入的平面设置当前视锥体。没有隐式的顺序。
 		</p>
 		</p>
 
 
 		<h3>[method:Frustum setFromMatrix]( [param:Matrix4 matrix] )</h3>
 		<h3>[method:Frustum setFromMatrix]( [param:Matrix4 matrix] )</h3>
 		<p>
 		<p>
-			[page:Matrix4 matrix] - [page:Matrix4] used to set the [page:.planes planes]<br /><br />
+			[page:Matrix4 matrix] - [page:Matrix4] 用于设置 [page:.planes planes]<br /><br />
 
 
-			This is used by the [page:WebGLRenderer] to set up the Frustum from a [page:Camera Camera]'s
-			[page:Camera.projectionMatrix projectionMatrix] and [page:Camera.matrixWorldInverse matrixWorldInverse].
-		</p>
+			[page:WebGLRenderer] 使用 [page:Camera Camera]的投影矩阵([page:Camera.projectionMatrix projectionMatrix] )
+			和相机世界变换矩阵的逆矩阵 [page:Camera.matrixWorldInverse matrixWorldInverse] 来设置视锥体。
+				</p>
 
 
 
 
 
 

+ 10 - 11
docs/api/zh/math/Interpolant.html

@@ -8,21 +8,20 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>插值器([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-		Abstract base class of interpolants over parametric samples.<br /><br />
+		A参数样本上插值的抽象基类 <br /><br />
 
 
-		The parameter domain is one dimensional, typically the time or a path along a curve defined by the data.<br /><br />
+		参数域是一维的,通常是数据定义的曲线上的时间或路径。<br /><br />
 
 
-		The sample values can have any dimensionality and derived classes may apply special interpretations to the data.<br /><br />
+		示例值可以具有任何维度,派生类可以对数据应用特殊的解释。<br /><br />
 
 
-		This class provides the interval seek in a Template Method, deferring the actual interpolation to derived classes.<br /><br />
+		该类提供间隔查找的模板方法,将实际的插值延迟到派生类。<br /><br />
 
 
-		Time complexity is *O(1)* for linear access crossing at most two points and *O(log N)* for random access,
-		where *N* is the number of positions.<br /><br />
+		对于最多两个点之间的访问时间复杂度为O(1),对于随机访问时间复杂度为O(log N),其中N为位置数。<br /><br />
 
 
-		References:	[link:http://www.oodesign.com/template-method-pattern.html http://www.oodesign.com/template-method-pattern.html]
+		相关:	[link:http://www.oodesign.com/template-method-pattern.html http://www.oodesign.com/template-method-pattern.html]
 		</p>
 		</p>
 
 
 
 
@@ -38,7 +37,7 @@
 		sampleSize -- number of samples<br />
 		sampleSize -- number of samples<br />
 		resultBuffer -- buffer to store the interpolation results.<br /><br />
 		resultBuffer -- buffer to store the interpolation results.<br /><br />
 
 
-		Note: This is not designed to be called directly.
+		注意: 这不是设计为直接调用的。
 		</p>
 		</p>
 
 
 		<h2>Properties</h2>
 		<h2>Properties</h2>
@@ -74,10 +73,10 @@
 
 
 		<h3>[method:null evaluate]( [param:Number t] )</h3>
 		<h3>[method:null evaluate]( [param:Number t] )</h3>
 		<p>
 		<p>
-		Evaluate the interpolant at position *t*.
+			计算补间函数在位置 *t* 的值。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 34 - 40
docs/api/zh/math/Line3.html

@@ -8,79 +8,75 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>三维几何线段([name]</h1>
 
 
-		<p class="desc">A geometric line segment represented by a start and end point.</p>
+		<p class="desc">用起点和终点表示的几何线段。</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造器(Constructor</h2>
 
 
 
 
 		<h3>[name]( [param:Vector3 start], [param:Vector3 end] )</h3>
 		<h3>[name]( [param:Vector3 start], [param:Vector3 end] )</h3>
 		<p>
 		<p>
-		[page:Vector3 start] - Start of the line segment. Default is (0, 0, 0).<br />
-		[page:Vector3 end] - End of the line segment. Default is (0, 0, 0).<br /><br />
+		[page:Vector3 start] - 线段的起始点。默认值为 (0, 0, 0)。<br />
+		[page:Vector3 end] - 线段的终点。默认值为 (0, 0, 0)。<br /><br />
 
 
-		Creates a new [name].
+		创建一个三维几何线段 [name]。
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Vector3 start]</h3>
 		<h3>[property:Vector3 start]</h3>
-		<p>[page:Vector3] representing the start point of the line.</p>
+		<p>[page:Vector3] 表示线段的起点。</p>
 
 
 		<h3>[property:Vector3 end]</h3>
 		<h3>[property:Vector3 end]</h3>
-		<p>[page:Vector3] representing the end point of the line.</p>
+		<p>[page:Vector3] 表示线段的终点</p>
 
 
 
 
 
 
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法(Methods</h2>
 
 
 		<h3>[method:Line3 applyMatrix4]( [param:Matrix4 matrix] )</h3>
 		<h3>[method:Line3 applyMatrix4]( [param:Matrix4 matrix] )</h3>
-		<p>Applies a matrix transform to the line segment.</p>
+		<p>对此线段应用矩阵变换。</p>
 
 
 		<h3>[method:Vector3 at]( [param:Float t], [param:Vector3 target] )</h3>
 		<h3>[method:Vector3 at]( [param:Float t], [param:Vector3 target] )</h3>
 		<p>
 		<p>
-		[page:Float t] - Use values 0-1 to return a position along the line segment. <br />
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
-
-		Returns a vector at a certain position along the line. When [page:Float t] = 0, it returns the start vector,
-		and when [page:Float t] = 1 it returns the end vector.<br />
+		[page:Float t] - 使用值0-1返回沿线段的位置。<br />
+		[page:Vector3 target] — 计算结果会被拷贝到target。<br /><br />
+		
+		返回一个线段某一位置的向量,当 [page:Float t] = 0的时候返回起始点,当[page:Float t] = 1的时候返回终点。<br />
 		</p>
 		</p>
 
 
 		<h3>[method:Line3 clone]()</h3>
 		<h3>[method:Line3 clone]()</h3>
-		<p>Returns a new [page:Line3] with the same [page:.start start] and [page:.end end] vectors as this one.</p>
+		<p>返回一个与此线段拥有相同起始点 [page:.start start] 和 终点[page:.end end] 的线段。</p>
 
 
 		<h3>[method:Vector3 closestPointToPoint]( [param:Vector3 point], [param:Boolean clampToLine], [param:Vector3 target] )</h3>
 		<h3>[method:Vector3 closestPointToPoint]( [param:Vector3 point], [param:Boolean clampToLine], [param:Vector3 target] )</h3>
 		<p>
 		<p>
-		[page:Vector3 point] - return the closest point on the line to this point.<br />
-		[page:Boolean clampToLine] - whether to clamp the returned value to the line segment.<br />
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
+		[page:Vector3 point] - 用于计算线段上到该点最近的点。<br />
+		[page:Boolean clampToLine] - 是否将结果限制在线段起始点和终点之间。<br />
+		[page:Vector3 target] — 结果会拷贝到target。<br /><br />
 
 
-		Returns the closets point on the line. If [page:Boolean clampToLine] is true, then the returned value will be
-		clamped to the line segment.
+		返回线段上到point最近的点。如果参数 [page:Boolean clampToLine] 为true。返回值将会在线段之间。
 		</p>
 		</p>
 
 
 		<h3>[method:Float closestPointToPointParameter]( [param:Vector3 point], [param:Boolean clampToLine] )</h3>
 		<h3>[method:Float closestPointToPointParameter]( [param:Vector3 point], [param:Boolean clampToLine] )</h3>
 		<p>
 		<p>
-		[page:Vector3 point] - the point for which to return a point parameter. <br />
-		[page:Boolean clampToLine] - Whether to clamp the result to the range [0, 1].<br /><br />
+		[page:Vector3 point] - 用于计算返回值的点 <br />
+		[page:Boolean clampToLine] - 结果是否处于 [0, 1]之间。<br /><br />
 
 
-		Returns a point parameter based on the closest point as projected on the line segement.
-		If [page:Boolean clampToLine] is true, then the returned value will be between 0 and 1.
+		返回一个基于点投影到线段上的点的参数。如果 [page:Boolean clampToLine] 为true则返回值将在0到1之间。
 		</p>
 		</p>
 
 
 		<h3>[method:Line3 copy]( [param:Line3 line] )</h3>
 		<h3>[method:Line3 copy]( [param:Line3 line] )</h3>
-		<p>Copies the passed line's [page:.start start] and [page:.end end] vectors to this line.</p>
+		<p>拷贝传入线段的起始点 [page:.start start] 和终点 [page:.end end] 向量到当前线段。</p>
 
 
 		<h3>[method:Vector3 delta]( [param:Vector3 target] )</h3>
 		<h3>[method:Vector3 delta]( [param:Vector3 target] )</h3>
 		<p>
 		<p>
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
-
-			Returns the delta vector of the line segment ( [page:.end end] vector minus the [page:.start start] vector).
+		[page:Vector3 target] — 结果将会拷贝到target。<br /><br />
+			返回线段的向量。(终点[page:.end end]向量减去起始点[page:.start start]向量)。
 		</p>
 		</p>
 
 
 		<h3>[method:Float distance]()</h3>
 		<h3>[method:Float distance]()</h3>
@@ -89,34 +85,32 @@
 
 
 		<h3>[method:Float distanceSq]()</h3>
 		<h3>[method:Float distanceSq]()</h3>
 		<p>
 		<p>
-			Returns the square of the [link:https://en.wikipedia.org/wiki/Euclidean_distance Euclidean distance]
-			(straight-line distance) between the line's [page:.start start]
-			and [page:.end end] vectors.
+			返回起始点[page:.start start]和终点[page:.end end]的欧几里得距离[link:https://en.wikipedia.org/wiki/Euclidean_distance Euclidean distance]。(直线距离)
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean equals]( [param:Line3 line] )</h3>
 		<h3>[method:Boolean equals]( [param:Line3 line] )</h3>
 		<p>
 		<p>
 		[page:Line3 line]  - [page:Line3] to compare with this one.<br /><br />
 		[page:Line3 line]  - [page:Line3] to compare with this one.<br /><br />
 
 
-		Returns true if both line's [page:.start start] and [page:.end en] points are equal.
+		如果给定线段与当前线段的起始点[page:.start start]和终点[page:.end end]都相同则返回true。
 		</p>
 		</p>
 
 
 		<h3>[method:Vector3 getCenter]( [param:Vector3 target] )</h3>
 		<h3>[method:Vector3 getCenter]( [param:Vector3 target] )</h3>
 		<p>
 		<p>
-		[page:Vector3 target] — the result will be copied into this Vector3.<br /><br />
+		[page:Vector3 target] — 结果会写入target。<br /><br />
 
 
-		Returns the center of the line segment.
+		返回线段的中心点。
 		</p>
 		</p>
 
 
 		<h3>[method:Line3 set]( [param:Vector3 start], [param:Vector3 end] )</h3>
 		<h3>[method:Line3 set]( [param:Vector3 start], [param:Vector3 end] )</h3>
 		<p>
 		<p>
-		[page:Vector3 start] - set the [page:.start start point] of the line.<br />
-		[page:Vector3 end] - set the [page:.end end point] of the line.<br /><br />
+		[page:Vector3 start] - 设置线段的起点 [page:.start start point]。<br />
+		[page:Vector3 end] - 设置线段的终点 [page:.end end point]。<br /><br />
 
 
-		Sets the start and end values by copying the provided vectors.
+		将传入的向量设置到线段的起始点和终点。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 38 - 43
docs/api/zh/math/Math.html

@@ -8,101 +8,96 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>数学函数([name]</h1>
 
 
-		<p class="desc">An object with several math utility functions.</p>
+		<p class="desc">具有多个数学实用函数的对象。</p>
 
 
-		<h2>Functions</h2>
+		<h2>函数(Functions</h2>
 
 
 		<h3>[method:Float clamp]( [param:Float value], [param:Float min], [param:Float max] )</h3>
 		<h3>[method:Float clamp]( [param:Float value], [param:Float min], [param:Float max] )</h3>
 		<p>
 		<p>
-		[page:Float value] — Value to be clamped.<br />
-		[page:Float min] — Minimum value.<br />
-		[page:Float max] — Maximum value.<br /><br />
+		[page:Float value] — 需要clamp处理的值。<br />
+		[page:Float min] — 最小值。<br />
+		[page:Float max] — 最大值。<br /><br />
 
 
-		Clamps the [page:Float value] to be between [page:Float min] and [page:Float max].
+		限制数值[page:Float value]处于最小值[page:Float min]和最大值[page:Float max]之间。
 		</p>
 		</p>
 
 
 		<h3>[method:Float degToRad]( [param:Float degrees] )</h3>
 		<h3>[method:Float degToRad]( [param:Float degrees] )</h3>
-		<p>Converts degrees to radians.</p>
+		<p>将度转化为弧度。</p>
 
 
 		<h3>[method:Integer euclideanModulo]( [param:Integer n], [param:Integer m] )</h3>
 		<h3>[method:Integer euclideanModulo]( [param:Integer n], [param:Integer m] )</h3>
 		<p>
 		<p>
-		[page:Integer n], [page:Integer m] - Integers<br /><br />
-
-		Computes the Euclidean modulo of [page:Integer m] % [page:Integer n], that is:
+		[page:Integer n], [page:Integer m] - 整型<br /><br />
+		计算 [page:Integer m] % [page:Integer n] 的欧几里得模:
 		<code>( ( n % m ) + m ) % m</code>
 		<code>( ( n % m ) + m ) % m</code>
 		</p>
 		</p>
 
 
 		<h3>[method:UUID generateUUID]( )</h3>
 		<h3>[method:UUID generateUUID]( )</h3>
 		<p>
 		<p>
-		Generate a [link:https://en.wikipedia.org/wiki/Universally_unique_identifier UUID]
-		(universally unique identifier).
+			创建一个全局唯一标识符 [link:https://en.wikipedia.org/wiki/Universally_unique_identifier UUID]。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean isPowerOfTwo]( [param:Number n] )</h3>
 		<h3>[method:Boolean isPowerOfTwo]( [param:Number n] )</h3>
-		<p>Return *true* if [page:Number n] is a power of 2.</p>
+		<p>如果 [page:Number n] 是2的幂,返回true。</p>
 
 
 		<h3>[method:Float lerp]( [param:Float x], [param:Float y], [param:Float t] )</h3>
 		<h3>[method:Float lerp]( [param:Float x], [param:Float y], [param:Float t] )</h3>
 		<p>
 		<p>
-		[page:Float x] - Start point. <br />
-		[page:Float y] - End point. <br />
-		[page:Float t] - interpolation factor in the closed interval [0, 1].<br><br />
+		[page:Float x] - 起始点。 <br />
+		[page:Float y] - 终点。 <br />
+		[page:Float t] - 封闭区间[0,1]内的插值因子。<br><br />
 
 
-		Returns a value [link:https://en.wikipedia.org/wiki/Linear_interpolation linearly interpolated]
-		from two known points based on the given interval - [page:Float t] = 0 will return [page:Float x]
-		and [page:Float t] = 1 will return [page:Float y].
+		返回给定区间的线性插值[link:https://en.wikipedia.org/wiki/Linear_interpolation linearly interpolated]结果 - [page:Float t] = 0 将会返回 [page:Float x]
+		如果 [page:Float t] = 1 将会返回 [page:Float y].
 		</p>
 		</p>
 
 
 		<h3>[method:Float mapLinear]( [param:Float x], [param:Float a1], [param:Float a2], [param:Float b1], [param:Float b2] )</h3>
 		<h3>[method:Float mapLinear]( [param:Float x], [param:Float a1], [param:Float a2], [param:Float b1], [param:Float b2] )</h3>
 		<p>
 		<p>
-		[page:Float x] — Value to be mapped.<br />
-		[page:Float a1] — Minimum value for range A.<br />
-		[page:Float a2] — Maximum value for range A.<br />
-		[page:Float b1] — Minimum value for range B.<br />
-		[page:Float b2] — Maximum value for range B.<br /><br />
+		[page:Float x] — 用于映射的值。<br />
+		[page:Float a1] — A区间最小值。<br />
+		[page:Float a2] — A区间最大值。<br />
+		[page:Float b1] — B区间最小值。<br />
+		[page:Float b2] — A区间最大值。<br /><br />
 
 
-		Linear mapping of [page:Float x] from range [[page:Float a1], [page:Float a2]] to range [[page:Float b1], [page:Float b2]].
+		x从范围[[page:Float a1], [page:Float a2]] 到范围[[page:Float b1], [page:Float b2]]的线性映射。
 		</p>
 		</p>
 
 
 		<h3>[method:Integer ceilPowerOfTwo]( [param:Number n] )</h3>
 		<h3>[method:Integer ceilPowerOfTwo]( [param:Number n] )</h3>
-		<p>Returns the smallest power of 2 that is greater than or equal to [page:Number n].</p>
+		<p>返回大于等于 [page:Number n] 的2的最小次幂。</p>
 
 
 		<h3>[method:Integer floorPowerOfTwo]( [param:Number n] )</h3>
 		<h3>[method:Integer floorPowerOfTwo]( [param:Number n] )</h3>
-		<p>Returns the largest power of 2 that is less than or equal to [page:Number n].</p>
+		<p>返回小于等于 [page:Number n] 的2的最大幂。</p>
 
 
 		<h3>[method:Float radToDeg]( [param:Float radians] )</h3>
 		<h3>[method:Float radToDeg]( [param:Float radians] )</h3>
-		<p>Converts radians to degrees.</p>
+		<p>将弧度转换为角度。</p>
 
 
 		<h3>[method:Float randFloat]( [param:Float low], [param:Float high] )</h3>
 		<h3>[method:Float randFloat]( [param:Float low], [param:Float high] )</h3>
-		<p>Random float in the interval [page:Float low] to [page:Float high].</p>
+		<p>在区间[page:Float low] 到 [page:Float high]随机一个浮点数。</p>
 
 
 		<h3>[method:Float randFloatSpread]( [param:Float range] )</h3>
 		<h3>[method:Float randFloatSpread]( [param:Float range] )</h3>
-		<p>Random float in the interval *- [page:Float range] / 2* to *[page:Float range] / 2*.</p>
+		<p>在区间*- [page:Float range] / 2* 到 *[page:Float range] / 2*随机一个浮点数。</p>
 
 
 		<h3>[method:Integer randInt]( [param:Integer low], [param:Integer high] )</h3>
 		<h3>[method:Integer randInt]( [param:Integer low], [param:Integer high] )</h3>
-		<p>Random integer in the interval [page:Float low] to [page:Float high].</p>
+		<p>在区间[page:Float low] 到 [page:Float high]随机一个整数。</p>
 
 
 		<h3>[method:Float smoothstep]( [param:Float x], [param:Float min], [param:Float max] )</h3>
 		<h3>[method:Float smoothstep]( [param:Float x], [param:Float min], [param:Float max] )</h3>
 		<p>
 		<p>
-		[page:Float x] - The value to evaluate based on its position between min and max. <br />
-		[page:Float min] - Any x value below min will be 0.<br />
-		[page:Float max] - Any x value above max will be 1.<br /><br />
+		[page:Float x] - 根据其在最小值和最大值之间的位置来计算的值。 <br />
+		[page:Float min] - 任何x比最小值还小会返回0.<br />
+		[page:Float max] - 任何x比最大值还大会返回0.<br /><br />
 
 
-		Returns a value between 0-1 that represents the percentage that x has moved between min and max,
-		but smoothed or slowed down the closer X is to the min and max.<br/><br/>
+		返回0-1之间的值,该值表示x在最小值和最大值之间移动的百分比,但是当x接近最小值和最大值时,变化程度会平滑或减慢。<br/><br/>
 
 
-		See [link:http://en.wikipedia.org/wiki/Smoothstep Smoothstep] for details.
+		查看更多详情请移步到 [link:http://en.wikipedia.org/wiki/Smoothstep Smoothstep] 。
 		</p>
 		</p>
 
 
 		<h3>[method:Float smootherstep]( [param:Float x], [param:Float min], [param:Float max] )</h3>
 		<h3>[method:Float smootherstep]( [param:Float x], [param:Float min], [param:Float max] )</h3>
 		<p>
 		<p>
-		[page:Float x] - The value to evaluate based on its position between min and max. <br />
-		[page:Float min] - Any x value below min will be 0.<br />
-		[page:Float max] - Any x value above max will be 1.<br /><br />
+			[page:Float x] - 根据其在最小值和最大值之间的位置来计算的值。 <br />
+			[page:Float min] - 任何x比最小值还小会返回0.<br />
+			[page:Float max] - 任何x比最大值还大会返回0.<br /><br />
 
 
-		Returns a value between 0-1. A [link:https://en.wikipedia.org/wiki/Smoothstep#Variations variation on smoothstep]
-		that has zero 1st and 2nd order derivatives at x=0 and x=1.
+		返回一个0-1之间的值。它和smoothstep相同,但变动更平缓。[link:https://en.wikipedia.org/wiki/Smoothstep#Variations variation on smoothstep] 在x=0和x=1处有0阶和二阶导数。
 		</p>
 		</p>
 
 
 		<h2>Source</h2>
 		<h2>Source</h2>

+ 63 - 71
docs/api/zh/math/Matrix3.html

@@ -8,38 +8,37 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>三维矩阵([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-			A class representing a 3x3 [link:https://en.wikipedia.org/wiki/Matrix_(mathematics) matrix].
+			一个表示3X3矩阵[link:https://en.wikipedia.org/wiki/Matrix_(mathematics) matrix].的类。
 		</p>
 		</p>
 
 
-		<h2>Example</h2>
+		<h2>示例(Example</h2>
 		<code>
 		<code>
 var m = new Matrix3();
 var m = new Matrix3();
 		</code>
 		</code>
 
 
-		<h2>A Note on Row-Major and Column-Major Ordering</h2>
+		<h2>注意行优先列优先的顺序。</h2>
 		<p>
 		<p>
-			The [page:set]() method takes arguments in [link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order row-major]
-			order, while internally they are stored in the [page:.elements elements] array in column-major order.<br /><br />
+			[page:set]()方法参数采用行优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order row-major]
+			而它们在内部是用列优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order column-major]顺序存储在数组当中。<br /><br />
 
 
-			This means that calling
+			这意味着
 		<code>
 		<code>
 m.set( 11, 12, 13,
 m.set( 11, 12, 13,
        21, 22, 23,
        21, 22, 23,
        31, 32, 33 );
        31, 32, 33 );
 		</code>
 		</code>
-		will result in the [page:.elements elements] array containing:
+		元素数组[page:.elements elements]将存储为:
 		<code>
 		<code>
 m.elements = [ 11, 21, 31,
 m.elements = [ 11, 21, 31,
               12, 22, 32,
               12, 22, 32,
               13, 23, 33 ];
               13, 23, 33 ];
 		</code>
 		</code>
-		and internally all calculations are performed using column-major ordering. However, as the actual ordering
-		makes no difference mathematically and most people are used to thinking about matrices in row-major order,
-		the three.js documentation shows matrices in row-major order. Just bear in mind that if you are reading the source
-		code, you'll have to take the [link:https://en.wikipedia.org/wiki/Transpose transpose] of any matrices outlined here to make sense of the calculations.
+		在内部,所有的计算都是使用列优先顺序进行的。然而,由于实际的排序在数学上没有什么不同,
+		而且大多数人习惯于以行优先顺序考虑矩阵,所以three.js文档以行为主的顺序显示矩阵。
+		请记住,如果您正在阅读源代码,您必须对这里列出的任何矩阵进行转置[link:https://en.wikipedia.org/wiki/Transpose transpose],以理解计算。
 		</p>
 		</p>
 
 
 		<h2>Constructor</h2>
 		<h2>Constructor</h2>
@@ -47,87 +46,81 @@ m.elements = [ 11, 21, 31,
 
 
 		<h3>[name]()</h3>
 		<h3>[name]()</h3>
 		<p>
 		<p>
-		Creates and initializes the [name] to the 3x3
-		[link:https://en.wikipedia.org/wiki/Identity_matrix identity matrix].
+		创建并初始化一个3X3的单位矩阵[link:https://en.wikipedia.org/wiki/Identity_matrix identity matrix].
 		</p>
 		</p>
 
 
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Float32Array elements]</h3>
 		<h3>[property:Float32Array elements]</h3>
 		<p>
 		<p>
-		A [link:https://en.wikipedia.org/wiki/Row-_and_column-major_order column-major]
-		 list of matrix values.
+			矩阵列优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order column-major]列表。
 		</p>
 		</p>
 
 
 		<h3>[property:Boolean isMatrix3]</h3>
 		<h3>[property:Boolean isMatrix3]</h3>
 		<p>
 		<p>
-			Used to check whether this or derived classes are Matrix3s. Default is *true*.<br /><br />
-
-			You should not change this, as it used internally for optimisation.
+				用于判定此对象或者此类的派生对象是否是三维矩阵。默认值为 *true*。<br /><br />
+			
+				不应该改变该值,因为它在内部用于优化。
 		</p>
 		</p>
 
 
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法(Methods</h2>
 
 
 		<h3>[method:Array applyToBufferAttribute]( [param:BufferAttribute attribute] )</h3>
 		<h3>[method:Array applyToBufferAttribute]( [param:BufferAttribute attribute] )</h3>
 		<p>
 		<p>
-		[page:BufferAttribute attribute] - An attribute of floats that represent 3D vectors.<br /><br />
+		[page:BufferAttribute attribute] - 表示三维向量缓存属性。<br /><br />
 
 
-		Multiplies (applies) this matrix to every 3D vector in the [page:BufferAttribute attribute].
+		用这个矩阵乘以缓存属性[page:BufferAttribute attribute]里的所有3d向量。
 		</p>
 		</p>
 
 
 
 
 		<h3>[method:Matrix3 clone]()</h3>
 		<h3>[method:Matrix3 clone]()</h3>
-		<p>Creates a new Matrix3 and with identical elements to this one.</p>
+		<p>创建一个新的矩阵,元素 [page:.elements elements] 与该矩阵相同。</p>
 
 
 		<h3>[method:this copy]( [param:Matrix3 m] )</h3>
 		<h3>[method:this copy]( [param:Matrix3 m] )</h3>
-		<p>Copies the elements of matrix [page:Matrix3 m] into this matrix.</p>
+		<p>将矩阵[page:Matrix3 m]的元素复制到当前矩阵中。</p>
 
 
 		<h3>[method:Float determinant]()</h3>
 		<h3>[method:Float determinant]()</h3>
 		<p>
 		<p>
-		Computes and returns the
-		[link:https://en.wikipedia.org/wiki/Determinant determinant] of this matrix.
+			计算并返回矩阵的行列式[link:https://en.wikipedia.org/wiki/Determinant determinant] 。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean equals]( [param:Matrix3 m] )</h3>
 		<h3>[method:Boolean equals]( [param:Matrix3 m] )</h3>
-		<p>Return true if this matrix and [page:Matrix3 m] are equal.</p>
+		<p>如果矩阵[page:Matrix3 m] 与当前矩阵所有对应元素相同则返回true。</p>
 
 
 		<h3>[method:this fromArray]( [param:Array array], [param:Integer offset] )</h3>
 		<h3>[method:this fromArray]( [param:Array array], [param:Integer offset] )</h3>
 		<p>
 		<p>
-		[page:Array array] - the array to read the elements from.<br />
-		[page:Integer offset] - (optional) index of first element in the array. Default is 0.<br /><br />
+		[page:Array array] - 用来存储设置元素数据的数组<br />
+		[page:Integer offset] - (可选参数) 数组的偏移量,默认值为 0。<br /><br />
 
 
-		Sets the elements of this matrix based on an array in
-		[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major] format.
+		使用基于列优先格式[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major]的数组来设置该矩阵。
 		</p>
 		</p>
 
 
 		<h3>[method:this getInverse]( [param:Matrix3 m], [param:Boolean throwOnDegenerate] )</h3>
 		<h3>[method:this getInverse]( [param:Matrix3 m], [param:Boolean throwOnDegenerate] )</h3>
 		<p>
 		<p>
-		[page:Matrix3 m] - the matrix to take the inverse of.<br />
-		[page:Boolean throwOnDegenerate] - (optional) If true, throw an error if the matrix is degenerate (not invertible).<br /><br />
-
-		Set this matrix to the [link:https://en.wikipedia.org/wiki/Invertible_matrix inverse] of the passed matrix [page:Matrix3 m],
-		using the [link:https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution analytic method].
-
-		If [page:Boolean throwOnDegenerate] is not set and the matrix is not invertible, set this to the 3x3 identity matrix.
+		[page:Matrix3 m] - 取逆的矩阵。<br />
+		[page:Boolean throwOnDegenerate] - (optional) 如果设置为true,如果矩阵是退化的(如果不可逆的话),则会抛出一个错误。<br /><br />
+		
+		使用逆矩阵计算方法[link:https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution analytic method],
+		将当前矩阵设置为给定矩阵的逆矩阵[link:https://en.wikipedia.org/wiki/Invertible_matrix inverse],如果[page:Boolean throwOnDegenerate]
+		参数没有设置且给定矩阵不可逆,那么将当前矩阵设置为3X3单位矩阵。
 		</p>
 		</p>
 
 
 		<h3>[method:this getNormalMatrix]( [param:Matrix4 m] )</h3>
 		<h3>[method:this getNormalMatrix]( [param:Matrix4 m] )</h3>
 		<p>
 		<p>
 		[page:Matrix4 m] - [page:Matrix4]<br /><br />
 		[page:Matrix4 m] - [page:Matrix4]<br /><br />
 
 
-		Sets this matrix as the upper left 3x3 of the [link:https://en.wikipedia.org/wiki/Normal_matrix normal matrix]
-		of the passed [page:Matrix4 matrix4]. The normal matrix is the [link:https://en.wikipedia.org/wiki/Invertible_matrix inverse] [link:https://en.wikipedia.org/wiki/Transpose transpose]
-	  of the matrix [page:Matrix4 m].
+		将这个矩阵设置为给定矩阵的正规矩阵[link:https://en.wikipedia.org/wiki/Normal_matrix normal matrix](左上角的3x3)。
+		正规矩阵是矩阵[page:Matrix4 m]的逆矩阵[link:https://en.wikipedia.org/wiki/Invertible_matrix inverse] 的转置[link:https://en.wikipedia.org/wiki/Transpose transpose]。
 		</p>
 		</p>
 
 
 		<h3>[method:this identity]()</h3>
 		<h3>[method:this identity]()</h3>
 		<p>
 		<p>
-		Resets this matrix to the 3x3 identity matrix:
-		<code>
+			将此矩阵重置为3x3单位矩阵:
+				<code>
 1, 0, 0
 1, 0, 0
 0, 1, 0
 0, 1, 0
 0, 0, 1
 0, 0, 1
@@ -136,22 +129,22 @@ m.elements = [ 11, 21, 31,
 		</p>
 		</p>
 
 
 		<h3>[method:this multiply]( [param:Matrix3 m] )</h3>
 		<h3>[method:this multiply]( [param:Matrix3 m] )</h3>
-		<p>Post-multiplies this matrix by [page:Matrix3 m].</p>
+		<p>将当前矩阵乘以矩阵[page:Matrix3 m]。</p>
 
 
 		<h3>[method:this multiplyMatrices]( [param:Matrix3 a], [param:Matrix3 b] )</h3>
 		<h3>[method:this multiplyMatrices]( [param:Matrix3 a], [param:Matrix3 b] )</h3>
-		<p>Sets this matrix to [page:Matrix3 a] x [page:Matrix3 b].</p>
+		<p>设置当前矩阵为矩阵[page:Matrix3 a] x 矩阵[page:Matrix3 b]。</p>
 
 
 		<h3>[method:this multiplyScalar]( [param:Float s] )</h3>
 		<h3>[method:this multiplyScalar]( [param:Float s] )</h3>
-		<p>Multiplies every component of the matrix by the scalar value *s*.</p>
+		<p>当前矩阵所有的元素乘以该缩放值*s*</p>
 
 
 		<h3>[method:this set]( [param:Float n11], [param:Float n12], [param:Float n13], [param:Float n21], [param:Float n22], [param:Float n23], [param:Float n31], [param:Float n32], [param:Float n33] )</h3>
 		<h3>[method:this set]( [param:Float n11], [param:Float n12], [param:Float n13], [param:Float n21], [param:Float n22], [param:Float n23], [param:Float n31], [param:Float n32], [param:Float n33] )</h3>
 		<p>
 		<p>
-		[page:Float n11] - value to put in row 1, col 1.<br />
-		[page:Float n12] - value to put in row 1, col 2.<br />
+		[page:Float n11] - 设置第一行第一列的值。<br />
+		[page:Float n12] - 设置第一行第二列的值。<br />
 		...<br />
 		...<br />
 		...<br />
 		...<br />
-		[page:Float n32] - value to put in row 3, col 2.<br />
-		[page:Float n33] - value to put in row 3, col 3.<br /><br />
+		[page:Float n32] - 设置第三行第二列的值。<br />
+		[page:Float n33] - 设置第三行第三列的值。<br /><br />
 
 
 		Sets the 3x3 matrix values to the given
 		Sets the 3x3 matrix values to the given
 		[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order row-major]
 		[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order row-major]
@@ -159,45 +152,44 @@ m.elements = [ 11, 21, 31,
 		</p>
 		</p>
 
 
 		<h3>[method:this premultiply]( [param:Matrix3 m] )</h3>
 		<h3>[method:this premultiply]( [param:Matrix3 m] )</h3>
-		<p>Pre-multiplies this matrix by [page:Matrix3 m].</p>
+		<p>将矩阵[page:Matrix3 m]乘以当前矩阵。</p>
 
 
 		<h3>[method:this setFromMatrix4]( [param:Matrix4 m] )</h3>
 		<h3>[method:this setFromMatrix4]( [param:Matrix4 m] )</h3>
-		<p>Set this matrx to the upper 3x3 matrix of the Matrix4 [page:Matrix4 m].</p>
+		<p>将当前矩阵设置为4X4矩阵[page:Matrix4 m]左上3X3</p>
 
 
 		<h3>[method:this setUvTransform]( [param:Float tx], [param:Float ty], [param:Float sx], [param:Float sy], [param:Float rotation], [param:Float cx], [param:Float cy] )</h3>
 		<h3>[method:this setUvTransform]( [param:Float tx], [param:Float ty], [param:Float sx], [param:Float sy], [param:Float rotation], [param:Float cx], [param:Float cy] )</h3>
 		<p>
 		<p>
-		[page:Float tx] - offset x<br />
-		[page:Float ty] - offset y<br />
-		[page:Float sx] - repeat x<br />
-		[page:Float sy] - repeat y<br />
-		[page:Float rotation] - rotation (in radians)<br />
-		[page:Float cx] - center x of rotation<br />
-		[page:Float cy] - center y of rotation<br /><br />
-
-		Sets the UV transform matrix from offset, repeat, rotation, and center.
+		[page:Float tx] - x偏移量<br />
+		[page:Float ty] - y偏移量<br />
+		[page:Float sx] - x方向的重复比例<br />
+		[page:Float sy] - y方向的重复比例<br />
+		[page:Float rotation] - 旋转(弧度)<br />
+		[page:Float cx] - 旋转中心x<br />
+		[page:Float cy] - 旋转中心y<br /><br />
+
+		使用偏移,重复,旋转和中心点位置设置UV变换矩阵。
 		</p>
 		</p>
 
 
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] )</h3>
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] )</h3>
 		<p>
 		<p>
-		[page:Array array] - (optional) array to store the resulting vector in. If not given a new array will be created.<br />
-		[page:Integer offset] - (optional) offset in the array at which to put the result.<br /><br />
+		[page:Array array] - (可选参数) 存储矩阵元素的数组,如果未指定会创建一个新的数组。<br />
+		[page:Integer offset] - (可选参数) 存放矩阵元素数组的偏移量。<br /><br />
 
 
-		Writes the elements of this matrix to an array in
-		[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major] format.
+		使用列优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major]格式将此矩阵的元素写入数组中。
 		</p>
 		</p>
 
 
 		<h3>[method:this transpose]()</h3>
 		<h3>[method:this transpose]()</h3>
-		<p>[link:https://en.wikipedia.org/wiki/Transpose Transposes] this matrix in place.</p>
+		<p>将该矩阵转置[link:https://en.wikipedia.org/wiki/Transpose Transposes]</p>
 
 
 		<h3>[method:this transposeIntoArray]( [param:Array array] )</h3>
 		<h3>[method:this transposeIntoArray]( [param:Array array] )</h3>
 		<p>
 		<p>
-		[page:Array array] -  array to store the resulting vector in.<br /><br />
+		[page:Array array] -  用于存储当前矩阵转置结果的数组。<br /><br />
 
 
-		[link:https://en.wikipedia.org/wiki/Transpose Transposes] this matrix into the supplied array,
-		and returns itself unchanged.
+		将当前矩阵的转置[link:https://en.wikipedia.org/wiki/Transpose Transposes]存入给定的数组[param:Array array]但不改变当前矩阵,
+		并返回当前矩阵。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 109 - 130
docs/api/zh/math/Matrix4.html

@@ -8,53 +8,48 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>四维矩阵([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-			A class representing a 4x4 [link:https://en.wikipedia.org/wiki/Matrix_(mathematics) matrix].<br /><br />
+			表示为一个 4x4 [link:https://en.wikipedia.org/wiki/Matrix_(mathematics) matrix].<br /><br />
 
 
-			The most common use of a 4x4 matrix in 3D computer graphics is as a
-			[link:https://en.wikipedia.org/wiki/Transformation_matrix Transformation Matrix].
-			For an introduction to transformation matrices as used in WebGL, check out
-			[link:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices this tutorial].<br /><br />
+			在3D计算机图形学中,4x4矩阵最常用的用法是作为一个变换矩阵[link:https://en.wikipedia.org/wiki/Transformation_matrix Transformation Matrix]。
+			有关WebGL中使用的变换矩阵的介绍,请参阅本教程[link:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices this tutorial]。<br /><br />
 
 
-			This allows a [page:Vector3] representing a point in 3D space to undergo transformations
-			such as translation, rotation, shear, scale, reflection, orthogonal or perspective projection
-			and so on, by being multiplied by the matrix. This is known as	<em>applying</em>
-			the matrix to the vector.<br /><br />
+			这使得表示三维空间中的一个点的向量[page:Vector3]通过乘以矩阵来进行转换,如平移、旋转、剪切、缩放、反射、正交或透视投影等。这就是把矩阵<em>应用</em>到向量上。<br /><br />
 
 
-			Every [page:Object3D] has three associated Matrix4s:
+			任何3D物体[page:Object3D]都有三个关联的矩阵:
 			<ul>
 			<ul>
 				<li>
 				<li>
-					[page:Object3D.matrix]: This stores the local transform of the object. This is the object's transformation relative to its parent.
+					[page:Object3D.matrix]: 存储物体的本地变换。 这是对象相对于其父对象的变换。
 				</li>
 				</li>
 				<li>
 				<li>
-					[page:Object3D.matrixWorld]: The global or world transform of the object. If the object has no parent, then this is identical to the local transform stored in [page:Object3D.matrix matrix].
+					[page:Object3D.matrixWorld]: 对象的全局或世界变换。如果对象没有父对象,那么这与存储在矩阵[page:Object3D.matrix matrix]中的本地变换相同。
 				</li>
 				</li>
 				<li>
 				<li>
-					[page:Object3D.modelViewMatrix]: This represents the object's transformation relative to the camera's coordinate system.
-					An object's modelViewMatrix is the object's matrixWorld pre-multiplied by the camera's matrixWorldInverse.
+					[page:Object3D.modelViewMatrix]: 表示对象相坐标相对于摄像机空间坐标转换,
+					一个对象的 modelViewMatrix 是物体世界变换矩阵乘以摄像机相对于世界空间变换矩阵的逆矩阵。
 				</li>
 				</li>
 			</ul>
 			</ul>
 
 
-			[page:Camera Cameras] have two additional Matrix4s:
+			摄像机[page:Camera Cameras] 有两个额外的四维矩阵:
 			<ul>
 			<ul>
 				<li>
 				<li>
-					[page:Camera.matrixWorldInverse]: The view matrix - the inverse of the Camera's [page:Object3D.matrixWorld matrixWorld].
+					[page:Camera.matrixWorldInverse]: 视矩阵 - 摄像机世界坐标变换的逆矩阵。
 				</li>
 				</li>
 				<li>
 				<li>
-					[page:Camera.projectionMatrix]: Represents the information how to project the scene to clip space.
+					[page:Camera.projectionMatrix]: 表示将场景中的信息投影到裁剪空间。
 				</li>
 				</li>
 			</ul>
 			</ul>
-			Note: [page:Object3D.normalMatrix] is not a Matrix4, but a [page:Matrix3].
+			注意:物体的正规矩阵 [page:Object3D.normalMatrix] 并不是一个4维矩阵,而是一个三维矩阵[page:Matrix3]。
 		</p>
 		</p>
 
 
-		<h2>A Note on Row-Major and Column-Major Ordering</h2>
+		<h2>注意行优先列优先的顺序。</h2>
 		<p>
 		<p>
-			The [page:set]() method takes arguments in [link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order row-major]
-			order, while internally they are stored in the [page:.elements elements] array in column-major order.<br /><br />
+				设置[page:set]()方法参数采用行优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order row-major]
+				而它们在内部是用列优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order column-major]顺序存储在数组当中。<br /><br />
 
 
-			This means that calling
+				这意味着
 		<code>
 		<code>
 var m = new Matrix4();
 var m = new Matrix4();
 
 
@@ -64,107 +59,99 @@ m.set( 11, 12, 13, 14,
        41, 42, 43, 44 );
        41, 42, 43, 44 );
 
 
 		</code>
 		</code>
-		will result in the [page:.elements elements] array containing:
+		元素数组[page:.elements elements]将存储为:
 		<code>
 		<code>
 m.elements = [ 11, 21, 31, 41,
 m.elements = [ 11, 21, 31, 41,
                12, 22, 32, 42,
                12, 22, 32, 42,
                13, 23, 33, 43,
                13, 23, 33, 43,
                14, 24, 34, 44 ];
                14, 24, 34, 44 ];
 		</code>
 		</code>
-		and internally all calculations are performed using column-major ordering. However, as the actual ordering
-		makes no difference mathematically and most people are used to thinking about matrices in row-major order,
-		the three.js documentation shows matrices in row-major order. Just bear in mind that if you are reading the source
-		code, you'll have to take the [link:https://en.wikipedia.org/wiki/Transpose transpose] of any matrices outlined here to make sense of the calculations.
+		在内部,所有的计算都是使用列优先顺序进行的。然而,由于实际的排序在数学上没有什么不同,
+		而且大多数人习惯于以行优先顺序考虑矩阵,所以three.js文档以行为主的顺序显示矩阵。
+		请记住,如果您正在阅读源代码,您必须对这里列出的任何矩阵进行转置[link:https://en.wikipedia.org/wiki/Transpose transpose],以理解计算。
 		</p>
 		</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造器(Constructor</h2>
 
 
 
 
 		<h3>[name]()</h3>
 		<h3>[name]()</h3>
 
 
 		<p>
 		<p>
-			Creates and initializes the [name] to the 4x4
-			[link:https://en.wikipedia.org/wiki/Identity_matrix identity matrix].
+			创建并初始化一个4X4的单位矩阵[link:https://en.wikipedia.org/wiki/Identity_matrix identity matrix].
 	</p>
 	</p>
 
 
-		<h2>Properties</h2>
+		<h2>属性(Properties</h2>
 
 
 		<h3>[property:Float32Array elements]</h3>
 		<h3>[property:Float32Array elements]</h3>
 		<p>
 		<p>
-		A [link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major]
-		 list of matrix values.
+		矩阵列优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order column-major]列表。
 		</p>
 		</p>
 
 
 		<h3>[property:Boolean isMatrix4]</h3>
 		<h3>[property:Boolean isMatrix4]</h3>
 		<p>
 		<p>
-			Used to check whether this or derived classes are Matrix4s. Default is *true*.<br /><br />
-
-			You should not change this, as it used internally for optimisation.
+			用于判定此对象或者此类的派生对象是否是三维矩阵。默认值为 *true*。<br /><br />
+		
+			不应该改变该值,因为它在内部用于优化。
 		</p>
 		</p>
 
 
 
 
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法(Methods</h2>
 
 
 		<h3>[method:Array applyToBufferAttribute]( [param:BufferAttribute attribute] )</h3>
 		<h3>[method:Array applyToBufferAttribute]( [param:BufferAttribute attribute] )</h3>
 		<p>
 		<p>
-		[page:BufferAttribute attribute] - An attribute of floats that represent 3D vectors.<br /><br />
+		[page:BufferAttribute attribute] - 表示三维向量缓存属性。<br /><br />
 
 
-		Multiplies (applies) this matrix to every 3D vector in the [page:BufferAttribute attribute].
+		用这个矩阵乘以缓存属性[page:BufferAttribute attribute]里的所有3d向量。
 		</p>
 		</p>
 
 
 
 
 		<h3>[method:Matrix4 clone]()</h3>
 		<h3>[method:Matrix4 clone]()</h3>
-		<p>Creates a new Matrix4 with identical [page:.elements elements] to this one.</p>
+		<p>创建一个新的矩阵,元素[page:.elements elements]与该矩阵相同。</p>
 
 
 		<h3>[method:this compose]( [param:Vector3 position], [param:Quaternion quaternion], [param:Vector3 scale] )</h3>
 		<h3>[method:this compose]( [param:Vector3 position], [param:Quaternion quaternion], [param:Vector3 scale] )</h3>
 		<p>
 		<p>
-		Sets this matrix to the transformation composed of [page:Vector3 position],
-		[page:Quaternion quaternion] and [page:Vector3 scale]. Internally this calls
-		[page:.makeRotationFromQuaternion makeRotationFromQuaternion]( [page:Quaternion quaternion] )
-		followed by [page:.scale scale]( [page:Vector3 scale] ), then finally
-		[page:.setPosition setPosition]( [page:Vector3 position] ).
+		设置将该对象由位置[page:Vector3 position],四元数[page:Quaternion quaternion] 和 缩放[page:Vector3 scale]
+		组合变换的矩阵。内部先调用[page:.makeRotationFromQuaternion makeRotationFromQuaternion]( [page:Quaternion quaternion] )
+		再调用缩放[page:.scale scale]( [page:Vector3 scale] )最后是平移[page:.setPosition setPosition]( [page:Vector3 position] )。
 		</p>
 		</p>
 
 
 		<h3>[method:this copy]( [param:Matrix4 m] )</h3>
 		<h3>[method:this copy]( [param:Matrix4 m] )</h3>
-		<p>Copies the [page:.elements elements] of matrix [page:Matrix4 m] into this matrix.</p>
+		<p>将矩阵[page:Matrix3 m]的元素[page:.elements elements]复制到当前矩阵中。</p>
 
 
 		<h3>[method:this copyPosition]( [param:Matrix4 m] )</h3>
 		<h3>[method:this copyPosition]( [param:Matrix4 m] )</h3>
 		<p>
 		<p>
-		Copies the translation component of the supplied matrix [page:Matrix4 m] into this
-		matrix's translation component.
+		将给定矩阵[param:Matrix4 m] 的平移分量拷贝到当前矩阵中。
 		</p>
 		</p>
 
 
 		<h3>[method:null decompose]( [param:Vector3 position], [param:Quaternion quaternion], [param:Vector3 scale] )</h3>
 		<h3>[method:null decompose]( [param:Vector3 position], [param:Quaternion quaternion], [param:Vector3 scale] )</h3>
 		<p>
 		<p>
-		Decomposes this matrix into it's [page:Vector3 position], [page:Quaternion quaternion] and
-		[page:Vector3 scale] components.
+			将矩阵分解到给定的平移[page:Vector3 position] ,旋转 [page:Quaternion quaternion],缩放[page:Vector3 scale]分量中。
 		</p>
 		</p>
 
 
 		<h3>[method:Float determinant]()</h3>
 		<h3>[method:Float determinant]()</h3>
 		<p>
 		<p>
-		Computes and returns the
-		[link:https://en.wikipedia.org/wiki/Determinant determinant] of this matrix.<br /><br />
+				计算并返回矩阵的行列式[link:https://en.wikipedia.org/wiki/Determinant determinant] 。<br /><br />
 
 
-		Based on the method outlined [link:http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm here].
+		基于这个的方法概述[link:http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm here]。
 		</p>
 		</p>
 
 
 		<h3>[method:Boolean equals]( [param:Matrix4 m] )</h3>
 		<h3>[method:Boolean equals]( [param:Matrix4 m] )</h3>
-		<p>Return true if this matrix and [page:Matrix4 m] are equal.</p>
+		<p>如果矩阵[page:Matrix3 m] 与当前矩阵所有对应元素相同则返回true。</p>
 
 
 		<h3>[method:this extractBasis]( [param:Vector3 xAxis], [param:Vector3 yAxis], [param:Vector3 zAxis] )</h3>
 		<h3>[method:this extractBasis]( [param:Vector3 xAxis], [param:Vector3 yAxis], [param:Vector3 zAxis] )</h3>
 		<p>
 		<p>
-		Extracts the [link:https://en.wikipedia.org/wiki/Basis_(linear_algebra) basis] of this
-		matrix into the three axis vectors provided. If this matrix is:
+			将矩阵的基向量[link:https://en.wikipedia.org/wiki/Basis_(linear_algebra) basis]提取到指定的3个轴向量中。
+			如果矩阵如下:
 		<code>
 		<code>
 a, b, c, d,
 a, b, c, d,
 e, f, g, h,
 e, f, g, h,
 i, j, k, l,
 i, j, k, l,
 m, n, o, p
 m, n, o, p
 		</code>
 		</code>
-		then the [page:Vector3 xAxis], [page:Vector3 yAxis], [page:Vector3 zAxis] will be set to:
+		然后x轴y轴z轴被设为:
 		<code>
 		<code>
 xAxis = (a, e, i)
 xAxis = (a, e, i)
 yAxis = (b, f, j)
 yAxis = (b, f, j)
@@ -174,58 +161,54 @@ zAxis = (c, g, k)
 
 
 		<h3>[method:this extractRotation]( [param:Matrix4 m] )</h3>
 		<h3>[method:this extractRotation]( [param:Matrix4 m] )</h3>
 		<p>
 		<p>
-		Extracts the rotation component of the supplied matrix [page:Matrix4 m] into this matrix's
-		rotation component.
+		将给定矩阵[page:Matrix4 m]的旋转分量提取到该矩阵的旋转分量中。
 		</p>
 		</p>
 
 
 		<h3>[method:this fromArray]( [param:Array array], [param:Integer offset] )</h3>
 		<h3>[method:this fromArray]( [param:Array array], [param:Integer offset] )</h3>
 		<p>
 		<p>
-		[page:Array array] - the array to read the elements from.<br />
-		[page:Integer offset] - ( optional ) offset into the array. Default is 0.<br /><br />
-
-		Sets the elements of this matrix based on an [page:Array array] in
-		[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major] format.
-		</p>
+			[page:Array array] - 用来存储设置元素数据的数组<br />
+			[page:Integer offset] - (可选参数) 数组的偏移量,默认值为 0。<br /><br />
+	
+			使用基于列优先格式[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major]的数组来设置该矩阵。
+			</p>
 
 
 		<h3>[method:this getInverse]( [param:Matrix4 m], [param:Boolean throwOnDegenerate] )</h3>
 		<h3>[method:this getInverse]( [param:Matrix4 m], [param:Boolean throwOnDegenerate] )</h3>
 		<p>
 		<p>
-		[page:Matrix4 m] - the matrix to take the inverse of.<br />
-		[page:Boolean throwOnDegenerate] - (optional) If true, throw an error if the matrix is degenerate (not invertible).<br /><br />
-
-		Set this matrix to the [link:https://en.wikipedia.org/wiki/Invertible_matrix inverse] of the passed matrix [page:Matrix4 m],
-		using the method outlined [link:http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm here].
-
-		If [page:Boolean throwOnDegenerate] is not set and the matrix is not invertible, set this to the 4x4 identity matrix.
-		</p>
+			[page:Matrix3 m] - 取逆的矩阵。<br />
+			[page:Boolean throwOnDegenerate] - (optional) 如果设置为true,如果矩阵是退化的(如果不可逆的话),则会抛出一个错误。<br /><br />
+			
+			使用逆矩阵计算方法[link:https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution analytic method],
+			将当前矩阵设置为给定矩阵的逆矩阵[link:https://en.wikipedia.org/wiki/Invertible_matrix inverse],如果[page:Boolean throwOnDegenerate]
+			参数没有设置且给定矩阵不可逆,那么将当前矩阵设置为3X3单位矩阵。
+				</p>
 
 
 
 
 		<h3>[method:Float getMaxScaleOnAxis]()</h3>
 		<h3>[method:Float getMaxScaleOnAxis]()</h3>
-		<p>Gets the maximum scale value of the 3 axes.</p>
+		<p>获取3个轴方向的最大缩放值。</p>
 
 
 		<h3>[method:this identity]()</h3>
 		<h3>[method:this identity]()</h3>
-		<p>Resets this matrix to the [link:https://en.wikipedia.org/wiki/Identity_matrix identity matrix].</p>
+		<p>将当前矩阵重置为单位矩阵[link:https://en.wikipedia.org/wiki/Identity_matrix identity matrix]。</p>
 
 
 		<h3>[method:this lookAt]( [param:Vector3 eye], [param:Vector3 center], [param:Vector3 up], )</h3>
 		<h3>[method:this lookAt]( [param:Vector3 eye], [param:Vector3 center], [param:Vector3 up], )</h3>
 		<p>
 		<p>
-			Constructs a rotation matrix, looking from [page:Vector3 eye] towards [page:Vector3 center]
-			oriented by the [page:Vector3 up] vector.
+			构造一个旋转矩阵,从[page:Vector3 eye] 指向 [page:Vector3 center],由向量 [param:Vector3 up] 定向。
+<!--			Constructs a rotation matrix, looking from [page:Vector3 eye] towards [page:Vector3 center]
+			oriented by the [page:Vector3 up] vector.-->
 		</p>
 		</p>
 
 
 		<h3>[method:this makeRotationAxis]( [param:Vector3 axis], [param:Float theta] )</h3>
 		<h3>[method:this makeRotationAxis]( [param:Vector3 axis], [param:Float theta] )</h3>
 		<p>
 		<p>
-		[page:Vector3 axis] — Rotation axis, should be normalized.<br />
-		[page:Float theta] — Rotation angle in radians.<br /><br />
+		[page:Vector3 axis] — 旋转轴,需要被归一化。<br />
+		[page:Float theta] — 旋转量(弧度)。<br /><br />
 
 
-		Sets this matrix as rotation transform around [page:Vector3 axis] by [page:Float theta] radians.<br />
+		设置当前矩阵为围绕轴 [page:Vector3 axis] 旋转量为 [page:Float theta]弧度。<br />
 
 
-		This is a somewhat controversial but mathematically sound alternative to rotating via [page:Quaternions].
-		See the discussion [link:http://www.gamedev.net/reference/articles/article1199.asp here].
+		这是一种有点争议但在数学上可以替代通过四元数[page:Quaternions]旋转的办法。 请参阅此处[link:http://www.gamedev.net/reference/articles/article1199.asp here]的讨论。
 		</p>
 		</p>
 
 
 		<h3>[method:this makeBasis]( [param:Vector3 xAxis], [param:Vector3 yAxis], [param:Vector3 zAxis] )</h3>
 		<h3>[method:this makeBasis]( [param:Vector3 xAxis], [param:Vector3 yAxis], [param:Vector3 zAxis] )</h3>
 		<p>
 		<p>
-		Set this to the [link:https://en.wikipedia.org/wiki/Basis_(linear_algebra) basis] matrix consisting
-		of the three provided basis vectors:
+			通过给定的三个向量设置该矩阵为基矩阵[link:https://en.wikipedia.org/wiki/Basis_(linear_algebra) basis]:
 		<code>
 		<code>
 xAxis.x, yAxis.x, zAxis.x, 0,
 xAxis.x, yAxis.x, zAxis.x, 0,
 xAxis.y, yAxis.y, zAxis.y, 0,
 xAxis.y, yAxis.y, zAxis.y, 0,
@@ -236,28 +219,27 @@ xAxis.z, yAxis.z, zAxis.z, 0,
 
 
 		<h3>[method:this makePerspective]( [param:Float left], [param:Float right], [param:Float top], [param:Float bottom], [param:Float near], [param:Float far] )</h3>
 		<h3>[method:this makePerspective]( [param:Float left], [param:Float right], [param:Float top], [param:Float bottom], [param:Float near], [param:Float far] )</h3>
 		<p>
 		<p>
-			Creates a [link:https://en.wikipedia.org/wiki/3D_projection#Perspective_projection perspective projection] matrix.
-			This is used internally by [page:PerspectiveCamera.updateProjectionMatrix]()
+			创建一个透视投影矩阵[link:https://en.wikipedia.org/wiki/3D_projection#Perspective_projection perspective projection]。
+			在引擎内部由[page:PerspectiveCamera.updateProjectionMatrix]()使用。
 		</p>
 		</p>
 
 
 		<h3>[method:this makeOrthographic]( [param:Float left], [param:Float right], [param:Float top], [param:Float bottom], [param:Float near], [param:Float far] )</h3>
 		<h3>[method:this makeOrthographic]( [param:Float left], [param:Float right], [param:Float top], [param:Float bottom], [param:Float near], [param:Float far] )</h3>
 		<p>
 		<p>
-		Creates an [link:https://en.wikipedia.org/wiki/Orthographic_projection orthographic projection] matrix.
-		This is used internally by [page:OrthographicCamera.updateProjectionMatrix]().
+			创建一个正交投影矩阵[link:https://en.wikipedia.org/wiki/Orthographic_projection orthographic projection]。
+			在引擎内部由[page:OrthographicCamera.updateProjectionMatrix]()使用。
 		</p>
 		</p>
 
 
 		<h3>[method:this makeRotationFromEuler]( [param:Euler euler] )</h3>
 		<h3>[method:this makeRotationFromEuler]( [param:Euler euler] )</h3>
 		<p>
 		<p>
-		Sets the rotation component (the upper left 3x3 matrix) of this matrix to the rotation specified by the given [page:Euler Euler Angle].
-		The rest of the matrix is set to the identity. Depending on the [page:Euler.order order] of the [page:Euler euler], there are six possible outcomes.
-		See [link:https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix this page] for a complete list.
+		将传入的欧拉角转换为该矩阵的旋转分量(左上角的3x3矩阵)。
+		矩阵的其余部分被设为单位矩阵。根据欧拉角[page:Euler euler]的旋转顺序[page:Euler.order order],总共有六种可能的结果。
+		详细信息,请参阅本页[link:https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix this page]。
 		</p>
 		</p>
 
 
 		<h3>[method:this makeRotationFromQuaternion]( [param:Quaternion q] )</h3>
 		<h3>[method:this makeRotationFromQuaternion]( [param:Quaternion q] )</h3>
 		<p>
 		<p>
-		Sets the rotation component of this matrix to the rotation specified by [page:Quaternion q], as outlined
-		[link:https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion here].
-		The rest of the matrix is set to the identity. So, given [page:Quaternion q] = w + xi + yj + zk, the resulting matrix will be:
+		将这个矩阵的旋转分量设置为四元数[page:Quaternion q]指定的旋转,如下链接所诉[link:https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion here]。
+		矩阵的其余部分被设为单位矩阵。因此,给定四元数[page:Quaternion q] = w + xi + yj + zk,得到的矩阵为:
 		<code>
 		<code>
 1-2y²-2z²    2xy-2zw    2xz+2yw    0
 1-2y²-2z²    2xy-2zw    2xz+2yw    0
 2xy+2zw      1-2x²-2z²  2yz-2xw    0
 2xy+2zw      1-2x²-2z²  2yz-2xw    0
@@ -269,9 +251,9 @@ xAxis.z, yAxis.z, zAxis.z, 0,
 		<h3>[method:this makeRotationX]( [param:Float theta] )</h3>
 		<h3>[method:this makeRotationX]( [param:Float theta] )</h3>
 		<p>
 		<p>
 		[page:Float theta] — Rotation angle in radians.<br /><br />
 		[page:Float theta] — Rotation angle in radians.<br /><br />
-
-		Sets this matrix as a rotational transformation around the X axis by [page:Float theta] (&theta;) radians.
-		The resulting matrix will be:
+		
+		把该矩阵设置为绕x轴旋转弧度[page:Float theta] (&theta;)大小的矩阵。
+		结果如下:
 		<code>
 		<code>
 1 0      0        0
 1 0      0        0
 0 cos(&theta;) -sin(&theta;)  0
 0 cos(&theta;) -sin(&theta;)  0
@@ -284,8 +266,8 @@ xAxis.z, yAxis.z, zAxis.z, 0,
 		<p>
 		<p>
 		[page:Float theta] — Rotation angle in radians.<br /><br />
 		[page:Float theta] — Rotation angle in radians.<br /><br />
 
 
-		Sets this matrix as a rotational transformation around the Y axis by [page:Float theta] (&theta;) radians.
-		The resulting matrix will be:
+		把该矩阵设置为绕Y轴旋转弧度[page:Float theta] (&theta;)大小的矩阵。
+		结果如下:
 		<code>
 		<code>
 cos(&theta;)  0 sin(&theta;) 0
 cos(&theta;)  0 sin(&theta;) 0
 0       1 0      0
 0       1 0      0
@@ -298,8 +280,8 @@ cos(&theta;)  0 sin(&theta;) 0
 		<p>
 		<p>
 		[page:Float theta] — Rotation angle in radians.<br /><br />
 		[page:Float theta] — Rotation angle in radians.<br /><br />
 
 
-		Sets this matrix as a rotational transformation around the Z axis by [page:Float theta] (&theta;) radians.
-		The resulting matrix will be:
+		把该矩阵设置为绕z轴旋转弧度[page:Float theta] (&theta;)大小的矩阵。
+		结果如下:
 		<code>
 		<code>
 cos(&theta;) -sin(&theta;) 0 0
 cos(&theta;) -sin(&theta;) 0 0
 sin(&theta;) cos(&theta;)  0 0
 sin(&theta;) cos(&theta;)  0 0
@@ -310,11 +292,11 @@ sin(&theta;) cos(&theta;)  0 0
 
 
 		<h3>[method:this makeScale]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<h3>[method:this makeScale]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<p>
 		<p>
-			[page:Float x] - the amount to scale in the X axis.<br />
-			[page:Float y] - the amount to scale in the Y axis.<br />
-			[page:Float z] - the amount to scale in the Z axis.<br /><br />
+			[page:Float x] - 在X轴方向的缩放比。<br />
+			[page:Float y] - 在Y轴方向的缩放比。<br />
+			[page:Float z] - 在Z轴方向的缩放比。<br /><br />
 
 
-			Sets this matrix as scale transform:
+			将这个矩阵设置为缩放变换:
 			<code>
 			<code>
 x, 0, 0, 0,
 x, 0, 0, 0,
 0, y, 0, 0,
 0, y, 0, 0,
@@ -325,11 +307,11 @@ x, 0, 0, 0,
 
 
 		<h3>[method:this makeShear]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<h3>[method:this makeShear]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<p>
 		<p>
-		[page:Float x] - the amount to shear in the X axis.<br />
-		[page:Float y] - the amount to shear in the Y axis.<br />
-		[page:Float z] - the amount to shear in the Z axis.<br /><br />
+		[page:Float x] - 在X轴上剪切的量。<br />
+		[page:Float y] - 在Y轴上剪切的量。<br />
+		[page:Float z] - 在Z轴上剪切的量。<br /><br />
 
 
-		Sets this matrix as a shear transform:
+		将此矩阵设置为剪切变换:
 <code>
 <code>
 1, y, z, 0,
 1, y, z, 0,
 x, 1, z, 0,
 x, 1, z, 0,
@@ -340,11 +322,11 @@ x, y, 1, 0,
 
 
 		<h3>[method:this makeTranslation]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<h3>[method:this makeTranslation]( [param:Float x], [param:Float y], [param:Float z] )</h3>
 		<p>
 		<p>
-			[page:Float x] - the amount to translate in the X axis.<br />
-			[page:Float y] - the amount to translate in the Y axis.<br />
-			[page:Float z] - the amount to translate in the Z axis.<br /><br />
+			[page:Float x] - 在X轴上的平移量。<br />
+			[page:Float y] - 在Y轴上的平移量。<br />
+			[page:Float z] - 在Z轴上的平移量。<br /><br />
 
 
-		Sets this matrix as a translation transform:
+		设置该矩阵为平移变换:
 		<code>
 		<code>
 1, 0, 0, x,
 1, 0, 0, x,
 0, 1, 0, y,
 0, 1, 0, y,
@@ -354,37 +336,35 @@ x, y, 1, 0,
 		</p>
 		</p>
 
 
 		<h3>[method:this multiply]( [param:Matrix4 m] )</h3>
 		<h3>[method:this multiply]( [param:Matrix4 m] )</h3>
-		<p>Post-multiplies this matrix by [page:Matrix4 m].</p>
+		<p>将当前矩阵乘以矩阵[page:Matrix4 m]。</p>
 
 
 		<h3>[method:this multiplyMatrices]( [param:Matrix4 a], [param:Matrix4 b] )</h3>
 		<h3>[method:this multiplyMatrices]( [param:Matrix4 a], [param:Matrix4 b] )</h3>
-		<p>Sets this matrix to [page:Matrix4 a] x [page:Matrix4 b].</p>
+		<p>设置当前矩阵为矩阵[page:Matrix4 a] x 矩阵[page:Matrix4 b]。</p>
 
 
 		<h3>[method:this multiplyScalar]( [param:Float s] )</h3>
 		<h3>[method:this multiplyScalar]( [param:Float s] )</h3>
-		<p>Multiplies every component of the matrix by a scalar value [page:Float s].</p>
+		<p>当前矩阵所有的元素乘以该缩放值*s*</p>
 
 
 		<h3>[method:this premultiply]( [param:Matrix4 m] )</h3>
 		<h3>[method:this premultiply]( [param:Matrix4 m] )</h3>
-		<p>Pre-multiplies this matrix by [page:Matrix4 m].</p>
+		<p>将矩阵[page:Matrix4 m]乘以当前矩阵。</p>
 
 
 		<h3>[method:this scale]( [param:Vector3 v] )</h3>
 		<h3>[method:this scale]( [param:Vector3 v] )</h3>
-		<p>Multiplies the columns of this matrix by vector [page:Vector3 v].</p>
+		<p>将该矩阵的列向量乘以对应向量[page:Vector3 v]的分量。</p>
 
 
 		<h3>[method:this set]( [param:Float n11], [param:Float n12], [param:Float n13], [param:Float n14], [param:Float n21], [param:Float n22], [param:Float n23], [param:Float n24], [param:Float n31], [param:Float n32], [param:Float n33], [param:Float n34], [param:Float n41], [param:Float n42], [param:Float n43], [param:Float n44] )</h3>
 		<h3>[method:this set]( [param:Float n11], [param:Float n12], [param:Float n13], [param:Float n14], [param:Float n21], [param:Float n22], [param:Float n23], [param:Float n24], [param:Float n31], [param:Float n32], [param:Float n33], [param:Float n34], [param:Float n41], [param:Float n42], [param:Float n43], [param:Float n44] )</h3>
 		<p>
 		<p>
-			Set the [page:.elements elements] of this matrix to the supplied row-major values [page:Float n11],
-			[page:Float n12], ... [page:Float n44].
+			以行优先的格式将传入的数值设置给该矩阵中的元素[page:.elements elements]。
 		</p>
 		</p>
 
 
 		<h3>[method:this setPosition]( [param:Vector3 v] )</h3>
 		<h3>[method:this setPosition]( [param:Vector3 v] )</h3>
 		<p>
 		<p>
-			Sets the position component for this matrix from vector [page:Vector3 v], without affecting the
-			rest of the matrix - i.e. if the matrix is currently:
+			取传入参数[param:Vector3 v]中值设置该矩阵的位置分量,不影响该矩阵的其余部分——即,如果该矩阵当前为:
 <code>
 <code>
 a, b, c, d,
 a, b, c, d,
 e, f, g, h,
 e, f, g, h,
 i, j, k, l,
 i, j, k, l,
 m, n, o, p
 m, n, o, p
 </code>
 </code>
-This becomes:
+变成:
 <code>
 <code>
 a, b, c, v.x,
 a, b, c, v.x,
 e, f, g, v.y,
 e, f, g, v.y,
@@ -395,17 +375,16 @@ m, n, o, p
 
 
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] )</h3>
 		<h3>[method:Array toArray]( [param:Array array], [param:Integer offset] )</h3>
 		<p>
 		<p>
-		[page:Array array] - (optional) array to store the resulting vector in.<br />
-		[page:Integer offset] - (optional) offset in the array at which to put the result.<br /><br />
+		[page:Array array] - (可选参数) 存储矩阵元素的数组,如果未指定会创建一个新的数组。<br />
+		[page:Integer offset] -  (可选参数) 存放矩阵元素数组的偏移量。<br /><br />
 
 
-		Writes the elements of this matrix to an array in
-		[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major] format.
+		使用列优先[link:https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order column-major]格式将此矩阵的元素写入数组中。
 		</p>
 		</p>
 
 
 		<h3>[method:this transpose]()</h3>
 		<h3>[method:this transpose]()</h3>
-		<p>[link:https://en.wikipedia.org/wiki/Transpose Transposes] this matrix.</p>
+		<p>将该矩阵转置[link:https://en.wikipedia.org/wiki/Transpose Transposes]</p>
 
 
-		<h2>Source</h2>
+		<h2>源码(Source</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/api/zh/math/Plane.html

@@ -8,7 +8,7 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>平面([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
 			A two dimensional surface that extends infinitely in 3d space, represented in [link:http://mathworld.wolfram.com/HessianNormalForm.html Hessian normal form]
 			A two dimensional surface that extends infinitely in 3d space, represented in [link:http://mathworld.wolfram.com/HessianNormalForm.html Hessian normal form]

+ 28 - 28
docs/api/zh/textures/CanvasTexture.html

@@ -10,67 +10,67 @@
 	<body>
 	<body>
 		[page:Texture] &rarr;
 		[page:Texture] &rarr;
 
 
-		<h1>[name]</h1>
+		<h1>Canvas纹理([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-		Creates a texture from a canvas element.<br /><br />
+		从Canvas元素中创建纹理贴图。<br /><br />
 
 
-		This is almost the same as the base [page:Texture Texture] class, except that it sets [page:Texture.needsUpdate needsUpdate] to *true* immediately.
+		它几乎与其基类[page:Texture Texture]相同,但它直接将[page:Texture.needsUpdate needsUpdate](需要更新)设置为了*true*。
 		</p>
 		</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造函数</h2>
 		<h3>[name]( [param:HTMLElement canvas], [param:Constant mapping], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Constant format], [param:Constant type], [param:Number anisotropy] )</h3>
 		<h3>[name]( [param:HTMLElement canvas], [param:Constant mapping], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Constant format], [param:Constant type], [param:Number anisotropy] )</h3>
 		<p>
 		<p>
-		[page:HTMLElement canvas] -- The HTML canvas element from which to load the texture. <br />
+		[page:HTMLElement canvas] -- 将会被用于加载纹理贴图的Canvas元素。<br />
 
 
-		[page:Constant mapping] --  How the image is applied to the object. An object type of [page:Textures THREE.UVMapping].
-		See [page:Textures mapping constants] for other choices.<br />
+		[page:Constant mapping] --  纹理贴图将被如何应用(映射)到物体上,它是[page:Textures THREE.UVMapping]中的对象类型。
+		请参阅[page:Textures mapping constants](映射模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapS] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapS] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapT] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapT] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant magFilter] -- How the texture is sampled when a texel covers more than one pixel.
-		The default is [page:Textures THREE.LinearFilter]. See [page:Textures magnification filter constants] for other choices.<br />
+		[page:Constant magFilter] -- 当一个纹素覆盖大于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearFilter]。请参阅[page:Textures magnification filter constants](放大滤镜常量)来了解其它选项。<br />
 
 
-		[page:Constant minFilter] -- How the texture is sampled when a texel covers less than one pixel.
-		 The default is [page:Textures THREE.LinearMipMapLinearFilter]. See [page:Textures minification filter constants] for other choices.<br />
+		[page:Constant minFilter] -- 当一个纹素覆盖小于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearMipMapLinearFilter]。请参阅[page:Textures minification filter constants](缩小滤镜常量)来了解其它选项。<br />
 
 
-    [page:Constant format] -- The format used in the texture.
-     See [page:Textures format constants] for other choices.<br />
+    	[page:Constant format] -- 在纹理贴图中使用的格式。
+     	请参阅[page:Textures format constants](格式常量)来了解各个选项。<br />
 
 
-    [page:Constant type] -- Default is [page:Textures THREE.UnsignedByteType].
-     See [page:Textures type constants] for other choices.<br />
+    	[page:Constant type] -- 默认值是[page:Textures THREE.UnsignedByteType].
+    	请参阅[page:Textures type constants](类型常量)来了解其他选项。<br />
 
 
-		[page:Number anisotropy] -- The number of samples taken along the axis through the pixel that has the highest density of texels.
-		By default, this value is 1. A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used.
-		Use [page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.<br /><br />
+		[page:Number anisotropy] -- 沿着轴,通过具有最高纹素密度的像素的样本数。
+		默认情况下,这个值为1。设置一个较高的值将会产生比基本的mipmap更清晰的效果,代价是需要使用更多纹理样本。
+		使用[page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() 来查询GPU中各向异性的最大有效值;这个值通常是2的幂。<br /><br />
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性</h2>
 
 
 		<p>
 		<p>
-    See the base [page:Texture Texture] class for common properties.
+    请参阅其基类[page:Texture Texture]来了解共有属性。
     </p>
     </p>
 
 
 		<h3>[property:boolean needsUpdate]</h3>
 		<h3>[property:boolean needsUpdate]</h3>
 
 
 		<p>
 		<p>
-			True by default. This is required so that the canvas data is loaded.
+			默认值为true,这是必须的,以便使得Canvas中的数据能够载入。
 		</p>
 		</p>
 
 
-		<h2>Methods</h2>
+		<h2>方法</h2>
 
 
     <p>
     <p>
-    See the base [page:Texture Texture] class for common methods.
+    请参阅[page:Texture Texture]来了解共有方法。
     </p>
     </p>
 
 
 
 
-		<h2>Source</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 32 - 32
docs/api/zh/textures/CompressedTexture.html

@@ -10,78 +10,78 @@
 	<body>
 	<body>
 		[page:Texture] &rarr;
 		[page:Texture] &rarr;
 
 
-		<h1>[name]</h1>
+		<h1>压缩的纹理([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-		Creates a texture based on data in compressed form, for example from a [link:https://en.wikipedia.org/wiki/DirectDraw_Surface DDS] file.<br /><br />
+		基于被压缩的数据,创建一个纹理贴图,例如从一个[link:https://en.wikipedia.org/wiki/DirectDraw_Surface DDS]文件中。<br /><br />
 
 
 
 
-		For use with the [page:CompressedTextureLoader CompressedTextureLoader].
+		它和[page:CompressedTextureLoader CompressedTextureLoader]一起使用。
 		</p>
 		</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造函数</h2>
 
 
 
 
 		<h3>[name]( [param:Array mipmaps], [param:Number width], [param:Number height], [param:Constant format], [param:Constant type], [param:Constant mapping], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Number anisotropy] )</h3>
 		<h3>[name]( [param:Array mipmaps], [param:Number width], [param:Number height], [param:Constant format], [param:Constant type], [param:Constant mapping], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Number anisotropy] )</h3>
 		<p>
 		<p>
-		[page:Array mipmaps] -- The mipmaps array should contain objects with data, width and height. The mipmaps should be of the correct format and type.<br />
+		[page:Array mipmaps] -- mipmaps数组中需要包含具有数据、宽、高的对象。mipmaps应当具有正确的格式与类型。<br />
 
 
-		[page:Number width] -- The width of the biggest mipmap.<br />
+		[page:Number width] -- 最大的mipmap的宽。<br />
 
 
-		[page:Number height] -- The height of the biggest mipmap.<br />
+		[page:Number height] -- 最大的mipmap的高。<br />
 
 
-		[page:Constant format] -- The format used in the mipmaps.
-		See [page:Textures ST3C Compressed Texture Formats],
-		[page:Textures PVRTC Compressed Texture Formats] and
-		[page:Textures ETC Compressed Texture Format] for other choices.<br />
+		[page:Constant format] -- 在mipmaps中使用的格式。
+		请参阅[page:Textures ST3C Compressed Texture Formats]、
+		[page:Textures PVRTC Compressed Texture Formats]
+		[page:Textures ETC Compressed Texture Format]页面来了解其它选项。<br />
 
 
-		[page:Constant type] -- Default is [page:Textures THREE.UnsignedByteType].
-		See [page:Textures type constants] for other choices.<br />
+		[page:Constant type] -- 默认值是[page:Textures THREE.UnsignedByteType]。
+		请参阅[page:Textures type constants]页面来了解其它选项。<br />
 
 
-		[page:Constant mapping] --  How the image is applied to the object. An object type of [page:Textures THREE.UVMapping].
-		See [page:Textures mapping constants] for other choices.<br />
+		[page:Constant mapping] --  纹理贴图将被如何应用(映射)到物体上,它是[page:Textures THREE.UVMapping]中的对象类型。
+		请参阅[page:Textures mapping constants](映射模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapS] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapS] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapT] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapT] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant magFilter] -- How the texture is sampled when a texel covers more than one pixel.
-		The default is [page:Textures THREE.LinearFilter]. See [page:Textures magnification filter constants] for other choices.<br />
+		[page:Constant magFilter] -- 当一个纹素覆盖大于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearFilter]。请参阅[page:Textures magnification filter constants](放大滤镜常量)来了解其它选项。<br />
 
 
-		[page:Constant minFilter] -- How the texture is sampled when a texel covers less than one pixel.
-		 The default is [page:Textures THREE.LinearMipMapLinearFilter]. See [page:Textures minification filter constants] for other choices.<br />
+		[page:Constant minFilter] -- 当一个纹素覆盖小于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearMipMapLinearFilter]。请参阅[page:Textures minification filter constants](缩小滤镜常量)来了解其它选项。<br />
 
 
-		[page:Number anisotropy] -- The number of samples taken along the axis through the pixel that has the highest density of texels.
-		By default, this value is 1. A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used.
-		Use renderer.getMaxAnisotropy() to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.<br /><br />
+		[page:Number anisotropy] -- 沿着轴,通过具有最高纹素密度的像素的样本数。
+		默认情况下,这个值为1。设置一个较高的值将会产生比基本的mipmap更清晰的效果,代价是需要使用更多纹理样本。
+		使用[page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() 来查询GPU中各向异性的最大有效值;这个值通常是2的幂。<br /><br />
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性</h2>
 
 
-		See the base [page:Texture Texture] class for common properties.
+		请参阅其基类[page:Texture Texture]来了解共有属性。
 
 
 		<h3>[property:boolean flipY]</h3>
 		<h3>[property:boolean flipY]</h3>
 
 
 		<p>
 		<p>
-			False by default. Flipping textures does not work for compressed textures.
+			默认值为false。翻转纹理在压缩的纹理贴图中无法工作。
 		</p>
 		</p>
 
 
 		<h3>[property:boolean generateMipmaps]</h3>
 		<h3>[property:boolean generateMipmaps]</h3>
 
 
 		<p>
 		<p>
-			False by default. Mipmaps can't be generated for compressed textures
+			默认值为false。无法为压缩的纹理贴图生成Mipmap。
 		</p>
 		</p>
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法</h2>
 
 
 
 
 
 
-		<h2>Source</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 11 - 12
docs/api/zh/textures/CubeTexture.html

@@ -10,11 +10,11 @@
 	<body>
 	<body>
 		[page:Texture] &rarr;
 		[page:Texture] &rarr;
 		
 		
-		<h1>[name]</h1>
+		<h1>立方纹理([name]</h1>
 
 
-		<p class="desc">Creates a cube texture made up of six images.</p>
+		<p class="desc">创建一个由6张图片所组成的纹理对象。</p>
 
 
-		<h2>Example</h2>
+		<h2>示例</h2>
 
 
 		<code>
 		<code>
 		var loader = new THREE.CubeTextureLoader();
 		var loader = new THREE.CubeTextureLoader();
@@ -29,28 +29,27 @@
 		var material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );
 		var material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );
 		</code>
 		</code>
 
 
-		<h2>Constructor</h2>
+		<h2>构造函数</h2>
 
 
 
 
 		<h3>[name]( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy )</h3>
 		<h3>[name]( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy )</h3>
 		
 		
 		<p>
 		<p>
-		CubeTexture is almost equivalent in functionality and usage to [page:Texture]. The only differences are that the
-		images are an array of 6 images as opposed to a single image, and the mapping options are
-		[page:Textures THREE.CubeReflectionMapping] (default) or [page:Textures THREE.CubeRefractionMapping]
+		CubeTexture(立方贴图)的功能以及用法几乎和[page:Texture]是相同的。区别在于,CubeTexture中的图像是6个单独的图像所组成的数组,
+		纹理映射选项为[page:Textures THREE.CubeReflectionMapping](默认值)或[page:Textures THREE.CubeRefractionMapping]。
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性</h2>
 
 
-		<h3>See [page:Texture]</h3>
+		<h3>请参阅[page:Texture]页面。</h3>
 
 
-		<h2>Methods</h2>
+		<h2>方法</h2>
 		
 		
 
 
-		<h3>See [page:Texture]</h3>
+		<h3>请参阅[page:Texture]页面。</h3>
 		
 		
-		<h2>Source</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 12 - 12
docs/api/zh/textures/DataTexture3D.html

@@ -12,39 +12,39 @@
 
 
 		<h1>[name]</h1>
 		<h1>[name]</h1>
 
 
-		<p class="desc">Creates a three-dimensional texture. This type of texture can only be used with a WebGL 2 rendering context.</p>
+		<p class="desc">创建一个三维的纹理贴图。这种纹理贴图只能被用于WebGL 2渲染环境中。</p>
 
 
-		<h2>Constructor</h2>
+		<h2>构造函数</h2>
 
 
 		<h3>[name]( [param:TypedArray data], [param:Number width], [param:Number height], [param:Number depth] )</h3>
 		<h3>[name]( [param:TypedArray data], [param:Number width], [param:Number height], [param:Number depth] )</h3>
 		<p>
 		<p>
-			[page:Object data] -- data of the texture.<br />
+			[page:Object data] -- 纹理的数据。<br />
 
 
-			[page:Number width] -- width of the texture.<br />
+			[page:Number width] -- 纹理的宽度。<br />
 
 
-			[page:Number height] -- height of the texture.<br />
+			[page:Number height] -- 纹理的高度。<br />
 
 
-			[page:Number depth] -- depth of the texture.
+			[page:Number depth] -- 纹理的深度。
 		</p>
 		</p>
 
 
-		<h2>Example</h2>
+		<h2>示例</h2>
 
 
 		<div>[example:webgl2_materials_texture3d WebGL2 / materials / texture3d]</div>
 		<div>[example:webgl2_materials_texture3d WebGL2 / materials / texture3d]</div>
 		<div>[example:webgl2_materials_texture3d_volume WebGL2 / materials / texture3d / volume]</div>
 		<div>[example:webgl2_materials_texture3d_volume WebGL2 / materials / texture3d / volume]</div>
 
 
-		<h2>Properties</h2>
+		<h2>属性</h2>
 
 
 		<p>
 		<p>
-		See the base [page:Texture Texture] class for common properties.
+		请参阅其基类[page:Texture Texture]来了解共有属性。
 		</p>
 		</p>
 
 
-		<h2>Methods</h2>
+		<h2>方法</h2>
 
 
 		<p>
 		<p>
-		See the base [page:Texture Texture] class for common methods.
+		请参阅其基类[page:Texture Texture]来了解共有方法。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 40 - 41
docs/api/zh/textures/DepthTexture.html

@@ -10,103 +10,102 @@
 	<body>
 	<body>
 		[page:Texture] &rarr;
 		[page:Texture] &rarr;
 
 
-		<h1>[name]</h1>
+		<h1>深度纹理([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-		Creates a texture for use as a Depth Texture. Require support for the
-	[link:https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/ WEBGL_depth_texture] extension.
+		创建一个作为深度纹理贴图来使用的纹理。需要支持[link:https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/ WEBGL_depth_texture]扩展。
 		</p>
 		</p>
 
 
-		<h2>Example</h2>
+		<h2>示例</h2>
 
 
 		[example:webgl_depth_texture depth / texture]
 		[example:webgl_depth_texture depth / texture]
 
 
-		<h2>Constructor</h2>
+		<h2>构造函数</h2>
 		<h3>[name]( [param:Number width], [param:Number height], [param:Constant type], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Number anisotropy], [param:Constant format] )</h3>
 		<h3>[name]( [param:Number width], [param:Number height], [param:Constant type], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Number anisotropy], [param:Constant format] )</h3>
 
 
 		<p>
 		<p>
-		[page:Number width] -- width of the texture.<br />
+		[page:Number width] -- 纹理的宽度。<br />
 
 
-		[page:Number height] -- height of the texture.<br />
+		[page:Number height] -- 纹理的高度。<br />
 
 
-		[page:Constant type] -- Default is [page:Textures THREE.UnsignedShortType].
-		See [page:Textures type constants] for other choices.<br />
+		[page:Constant type] -- 默认值是[page:Textures THREE.UnsignedShortType]。
+    	请参阅[page:Textures type constants](类型常量)来了解其他选项。<br />
 
 
 		[page:Constant mapping] --
 		[page:Constant mapping] --
-		See [page:Textures type constants] for details.<br />
+		请参阅[page:Textures mapping constants](映射模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapS] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapS] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapT] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapT] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant magFilter] -- How the texture is sampled when a texel covers more than one pixel.
-		The default is [page:Textures THREE.NearestFilter]. See [page:Textures magnification filter constants] for other choices.<br />
+		[page:Constant magFilter] -- 当一个纹素覆盖大于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearFilter]。请参阅[page:Textures magnification filter constants](放大滤镜常量)来了解其它选项。<br />
 
 
-		[page:Constant minFilter] -- How the texture is sampled when a texel covers less than one pixel.
-		The default is [page:Textures THREE.NearestFilter]. See [page:Textures minification filter constants] for other choices.<br />
+		[page:Constant minFilter] -- 当一个纹素覆盖小于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearMipMapLinearFilter]。请参阅[page:Textures minification filter constants](缩小滤镜常量)来了解其它选项。<br />
 
 
-		[page:Number anisotropy] -- The number of samples taken along the axis through the pixel that has the highest density of texels.
-		By default, this value is 1. A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used.
-		Use [page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.<br />
+		[page:Number anisotropy] -- 沿着轴,通过具有最高纹素密度的像素的样本数。
+		默认情况下,这个值为1。设置一个较高的值将会产生比基本的mipmap更清晰的效果,代价是需要使用更多纹理样本。
+		使用[page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() 来查询GPU中各向异性的最大有效值;这个值通常是2的幂。<br /><br />
 
 
-		[page:Constant format] -- must be either [page:Textures DepthFormat] (default) or [page:Textures DepthStencilFormat].
-		See [page:Textures format constants] for details.<br />
+		[page:Constant format] -- 这个值必须是[page:Textures DepthFormat](默认值)或者[page:Textures DepthStencilFormat]。
+		请参阅[page:Textures format constants](格式常量)来了解详细信息。<br />
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性</h2>
 
 
 		<p>
 		<p>
-		See the base [page:Texture Texture] class for common properties
-		- the following are also part of the texture class, but have different defaults here.
+		请参阅其基类[page:Texture Texture]来了解共有属性。
+		—— 以下属性也是texture类中的一部分,但在这里默认值不同。
 		</p>
 		</p>
 
 
 		<h3>[page:Texture.format .format]</h3>
 		<h3>[page:Texture.format .format]</h3>
 		<p>
 		<p>
-		Either [page:Textures DepthFormat] (default) or [page:Textures DepthStencilFormat].
-		See [page:Textures format constants] for details.<br />
+		[page:Textures DepthFormat](默认值)或者[page:Textures DepthStencilFormat]中的一个。
+		请参阅[page:Textures format constants]来了解详细信息。<br />
 		</p>
 		</p>
 
 
 		<h3>[page:Texture.type .type]</h3>
 		<h3>[page:Texture.type .type]</h3>
 		<p>
 		<p>
-		Default is [page:Textures THREE.UnsignedShortType].
-		See [page:Textures format constants] for details.<br />
+		默认值是[page:Textures THREE.UnsignedShortType]。
+		请参阅[page:Textures format constants]来了解详细信息。<br />
 		</p>
 		</p>
 
 
 		<h3>[page:Texture.magFilter .magFilter]</h3>
 		<h3>[page:Texture.magFilter .magFilter]</h3>
 		<p>
 		<p>
-		  How the texture is sampled when a texel covers more than one pixel.
-			The default is [page:Textures THREE.NearestFilter].
-		  See [page:Textures magnification filter constants] for other choices.
+		当一个纹素覆盖大于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.NearestFilter]。
+		请参阅[page:Textures magnification filter constants](放大滤镜常量)来了解其他选项。
 		</p>
 		</p>
 
 
 		<h3>[page:Texture.minFilter .minFilter]</h3>
 		<h3>[page:Texture.minFilter .minFilter]</h3>
 		<p>
 		<p>
-		How the texture is sampled when a texel covers less than one pixel.
-		The default is [page:Textures THREE.NearestFilter].
-		See [page:Textures magnification filter constants] for other choices.
+		当一个纹素覆盖小于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.NearestFilter]。
+		请参阅[page:Textures minification filter constants](缩小滤镜常量)来了解其他选项。
 		</p>
 		</p>
 
 
 		<h3>[page:Texture.flipY .flipY]</h3>
 		<h3>[page:Texture.flipY .flipY]</h3>
 		<p>
 		<p>
-		Depth textures do not need to be flipped so this is *false* by default.
+		深度贴图不需要被翻转,因此其默认值为*false*。
 		</p>
 		</p>
 
 
 		<h3>[page:Texture.generateMipmaps .generateMipmaps]</h3>
 		<h3>[page:Texture.generateMipmaps .generateMipmaps]</h3>
 		<p>
 		<p>
-		Depth textures do not use mipmaps.
+		深度贴图不使用mipmap。
 		</p>
 		</p>
 
 
-		<h2>Methods</h2>
+		<h2>方法</h2>
 
 
 		<p>
 		<p>
-		See the base [page:Texture Texture] class for common methods.
+		请参阅其基类[page:Texture Texture]来了解共有方法。
 		</p>
 		</p>
 
 
 
 
-		<h2>Source</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 92 - 95
docs/api/zh/textures/Texture.html

@@ -8,16 +8,16 @@
 		<link type="text/css" rel="stylesheet" href="page.css" />
 		<link type="text/css" rel="stylesheet" href="page.css" />
 	</head>
 	</head>
 	<body>
 	<body>
-		<h1>[name]</h1>
+		<h1>纹理([name]</h1>
 
 
-		<p class="desc">Create a texture to apply to a surface or as a reflection or refraction map.</p>
+		<p class="desc">创建一个纹理贴图,将其应用到一个表面,或者作为反射/折射贴图。</p>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造函数</h2>
 
 
 		<h3>[name]( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding )</h3>
 		<h3>[name]( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding )</h3>
 
 
-		<h2>Example</h2>
+		<h2>源代码</h2>
 
 
 		<code>
 		<code>
 		// load a texture, set wrap mode to repeat
 		// load a texture, set wrap mode to repeat
@@ -27,236 +27,233 @@
 		texture.repeat.set( 4, 4 );
 		texture.repeat.set( 4, 4 );
 		</code>
 		</code>
 
 
-		<h2>Properties</h2>
+		<h2>属性</h2>
 
 
 		<h3>[property:Integer id]</h3>
 		<h3>[property:Integer id]</h3>
 		<p>
 		<p>
-		Readonly - unique number for this texture instance.
+		只读 - 表示该纹理实例的唯一数字。
 		</p>
 		</p>
 
 
 		<h3>[property:String uuid]</h3>
 		<h3>[property:String uuid]</h3>
 		<p>
 		<p>
-		[link:http://en.wikipedia.org/wiki/Universally_unique_identifier UUID] of this object instance.
-		This gets automatically assigned, so this shouldn't be edited.
+		该对象实例的[link:http://en.wikipedia.org/wiki/Universally_unique_identifier UUID]
+		这个值是自动分配的,因此不应当对其进行编辑。
 		</p>
 		</p>
 
 
 		<h3>[property:String name]</h3>
 		<h3>[property:String name]</h3>
 		<p>
 		<p>
-		Optional name of the object (doesn't need to be unique). Default is an empty string.
+		该对象的名称,可选,且无需唯一。默认值是一个空字符串。
 		</p>
 		</p>
 
 
 		<h3>[property:Image image]</h3>
 		<h3>[property:Image image]</h3>
 		<p>
 		<p>
-		An image object, typically created using the [page:TextureLoader.load] method.
-		This can be any image (e.g., PNG, JPG, GIF, DDS) or video (e.g., MP4, OGG/OGV) type supported by three.js.<br /><br />
+		一个图片对象,通常由[page:TextureLoader.load]方法创建。
+		该对象可以是被three.js所支持的任意图片(例如PNG、JPG、GIF、DDS)或视频(例如MP4、OGG/OGV)格式。<br /><br />
 
 
-		To use video as a texture you need to have a playing HTML5
-		video element as a source for your texture image and continuously update this texture
-		as long as video is playing - the [page:VideoTexture VideoTexture] class handles this automatically.
+		要使用视频来作为纹理贴图,你需要有一个正在播放的HTML5 Video元素来作为你纹理贴图的源图像,
+		并在视频播放时不断地更新这个纹理贴图。——[page:VideoTexture VideoTexture] 类会对此自动进行处理。
 		</p>
 		</p>
 
 
 		<h3>[property:array mipmaps]</h3>
 		<h3>[property:array mipmaps]</h3>
 		<p>
 		<p>
-		Array of user-specified mipmaps (optional).
+		用户所给定的mipmap数组(可选)。
 		</p>
 		</p>
 
 
 		<h3>[property:number mapping]</h3>
 		<h3>[property:number mapping]</h3>
 		<p>
 		<p>
-		How the image is applied to the object. An object type of [page:Textures THREE.UVMapping] is the default,
-		where the U,V coordinates are used to apply the map.<br />
+		图像将如何应用到物体(对象)上。默认值是[page:Textures THREE.UVMapping]对象类型,
+		即UV坐标将被用于纹理映射。<br />
 
 
-		See the [page:Textures texture constants] page for other mapping types.
+		请参阅[page:Textures texture constants](映射模式常量)来了解其他映射类型。
 		</p>
 		</p>
 
 
 		<h3>[property:number wrapS]</h3>
 		<h3>[property:number wrapS]</h3>
 		<p>
 		<p>
-		This defines how the texture is wrapped horizontally and corresponds to *U* in UV mapping.<br />
-		The default is [page:Textures THREE.ClampToEdgeWrapping], where the edge is clamped to the outer edge texels.
-		The other two choices are [page:Textures THREE.RepeatWrapping] and [page:Textures THREE.MirroredRepeatWrapping].
-		See the [page:Textures texture constants] page for details.
+		这个值定义了纹理贴图在水平方向上将如何包裹,在UV映射中对应于*U*。<br />
+		默认值是[page:Textures THREE.ClampToEdgeWrapping],即纹理边缘将被推到外部边缘的纹素。
+
+		其它的两个选项分别是[page:Textures THREE.RepeatWrapping]和[page:Textures THREE.MirroredRepeatWrapping]。
+		请参阅[page:Textures texture constants]来了解详细信息。
 		</p>
 		</p>
 
 
 		<h3>[property:number wrapT]</h3>
 		<h3>[property:number wrapT]</h3>
 		<p>
 		<p>
-		This defines how the texture is wrapped vertically and corresponds to *V* in UV mapping.<br />
-		The same choices are available as for [property:number wrapS].<br /><br />
+		这个值定义了纹理贴图在垂直方向上将如何包裹,在UV映射中对应于*V*。<br />
+		可以使用与[property:number wrapS]相同的选项。<br /><br />
 
 
-		NOTE: tiling of images in textures only functions if image dimensions are powers of two
-		 (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...) in terms of pixels.
-		 Individual dimensions need not be equal, but each must be a power of two.
-		 This is a limitation of WebGL, not three.js.
+		请注意:纹理中图像的平铺,仅有当图像大小(以像素为单位)为2的幂(2、4、8、16、32、64、128、256、512、1024、2048、……)时才起作用。
+		宽度、高度无需相等,但每个维度的长度必须都是2的幂。
+		这是WebGL中的限制,不是由three.js所限制的。
 		</p>
 		</p>
 
 
 		<h3>[property:number magFilter]</h3>
 		<h3>[property:number magFilter]</h3>
 		<p>
 		<p>
-		How the texture is sampled when a texel covers more than one pixel. The default is
-		 [page:Textures THREE.LinearFilter], which takes the four closest texels and bilinearly interpolates among them.
-		 The other option is [page:Textures THREE.NearestFilter], which uses the value of the closest texel.<br />
-		 See the [page:Textures texture constants] page for details.
+		当一个纹素覆盖大于一个像素时,贴图将如何采样。默认值为[page:Textures THREE.LinearFilter],
+		它将获取四个最接近的纹素,并在他们之间进行双线性插值。
+		另一个选项是[page:Textures THREE.NearestFilter],它将使用最接近的纹素的值。<br />
+		请参阅[page:Textures texture constants]页面来了解详细信息。
 		</p>
 		</p>
 
 
 		<h3>[property:number minFilter]</h3>
 		<h3>[property:number minFilter]</h3>
 		<p>
 		<p>
-		How the texture is sampled when a texel covers less than one pixel. The default is
-		[page:Textures THREE.LinearMipMapLinearFilter], which uses mipmapping and a trilinear filter. <br /><br />
+		当一个纹素覆盖小于一个像素时,贴图将如何采样。默认值为[page:Textures THREE.LinearMipMapLinearFilter],
+		它将使用mipmapping以及三次线性滤镜。<br /><br />
 
 
-		See the [page:Textures texture constants] page for all possible choices.
+		请参阅[page:Textures texture constants]页面来了解所有可能的选项。
 		</p>
 		</p>
 
 
 		<h3>[property:number anisotropy]</h3>
 		<h3>[property:number anisotropy]</h3>
 		<p>
 		<p>
-		The number of samples taken along the axis through the pixel that has the highest density of texels.
-		By default, this value is 1. A higher value gives a less blurry result than a basic mipmap,
-		at the cost of more texture samples being used. Use [page:WebGLRenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() to
-		find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.
+		沿着轴,通过具有最高纹素密度的像素的样本数。
+		默认情况下,这个值为1。设置一个较高的值将会产生比基本的mipmap更清晰的效果,代价是需要使用更多纹理样本。
+		使用[page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() 来查询GPU中各向异性的最大有效值;这个值通常是2的幂。
 		</p>
 		</p>
 
 
 		<h3>[property:number format]</h3>
 		<h3>[property:number format]</h3>
 		<p>
 		<p>
-		The default is [page:Textures THREE.RGBAFormat], although the [page:TextureLoader TextureLoader] will automatically
-		set this to [page:Textures THREE.RGBFormat] for JPG images. <br /><br />
+		默认值为[page:Textures THREE.RGBAFormat],
+		但[page:TextureLoader TextureLoader]将会在载入JPG图片时自动将这个值设置为[page:Textures THREE.RGBFormat]。<br /><br />
 
 
-		See the [page:Textures texture constants] page for details of other formats.
+		请参阅[page:Textures texture constants]页面来了解其它格式。
 		</p>
 		</p>
 
 
 		<h3>[property:number type]</h3>
 		<h3>[property:number type]</h3>
 		<p>
 		<p>
-		This must correspond to the [page:Texture.format .format]. The default is [page:Textures THREE.UnsignedByteType],
-		which will be used for most texture formats.<br /><br />
+			这个值必须与[page:Texture.format .format]相对应。默认值为[page:Textures THREE.UnsignedByteType],
+			它将会被用于绝大多数纹理格式。<br /><br />
 
 
-		See the [page:Textures texture constants] page for details of other formats.
+		请参阅[page:Textures texture constants]来了解其它格式。
 		</p>
 		</p>
 
 
 		<h3>[property:Vector2 offset]</h3>
 		<h3>[property:Vector2 offset]</h3>
 		<p>
 		<p>
-		How much a single repetition of the texture is offset from the beginning, in each direction U and V.
-		Typical range is *0.0* to *1.0*.  _Note:_ The offset property is a convenience modifier and only affects
-		the Texture's application to the first set of UVs on a model.  If the Texture is used as a map requiring
-		additional UV sets (e.g. the aoMap or lightMap of most stock materials), those UVs must be manually
-		assigned to achieve the desired offset.
+		纹理在单次重复时,从一开始将分别在U、V方向上偏移多少。
+		这个值的范围通常在*0.0*之间*1.0*。
+		请注意:这一属性是一个非常方便的修改器,仅仅影响纹理对模型上第一组UV的应用。
+		如果该纹理被用于需要额外的UV集的贴图(例如一些成品材质中的aoMap或lightMap),
+		这些UV必须被手动调整来实现所期望的偏移。
 		</p>
 		</p>
 
 
 		<h3>[property:Vector2 repeat]</h3>
 		<h3>[property:Vector2 repeat]</h3>
 		<p>
 		<p>
-		How many times the texture is repeated across the surface, in each direction U and V.  If repeat is set
-		greater than 1 in either direction, the corresponding Wrap parameter should also be set to
-		[page:Textures THREE.RepeatWrapping] or [page:Textures THREE.MirroredRepeatWrapping] to achieve the desired
-		tiling effect.  _Note:_ The repeat property is a convenience modifier and only affects
-		the Texture's application to the first set of UVs on a model.  If the Texture is used as a map requiring
-		additional UV sets (e.g. the aoMap or lightMap of most stock materials), those UVs must be manually
-		assigned to achieve the desired repetiton.
+		纹理将在表面上,分别在U、V方向重复多少次。如果这个值在任意方向上设置为大于1,
+		则对应的Wrap参数应当也被设为[page:Textures THREE.RepeatWrapping]或[page:Textures THREE.MirroredRepeatWrapping],
+		以实现所期望的平铺效果。
+		请注意:这一属性是一个非常方便的修改器,仅仅影响纹理对模型上第一组UV的应用。
+		如果该纹理被用于需要额外的UV集的贴图(例如一些成品材质中的aoMap或lightMap),
+		这些UV必须被手动调整来实现所期望的重复。
 		</p>
 		</p>
 
 
 		<h3>[property:number rotation]</h3>
 		<h3>[property:number rotation]</h3>
 		<p>
 		<p>
-		How much the texture is rotated around the center point, in radians. Postive values are counter-clockwise. Default is *0*.
+		纹理将围绕中心点旋转多少度,单位为弧度(rad)。正值为逆时针方向旋转,默认值为*0*。
 		</p>
 		</p>
 
 
 		<h3>[property:Vector2 center]</h3>
 		<h3>[property:Vector2 center]</h3>
 		<p>
 		<p>
-		The point around which rotation occurs. A value of (0.5, 0.5) corresponds to the center of the texture. Default is (0, 0), the lower left.
+		旋转中心点。(0.5, 0.5)对应纹理的正中心。默认值为(0,0),即左下角。
 		</p>
 		</p>
 
 
 		<h3>[property:boolean matrixAutoUpdate]</h3>
 		<h3>[property:boolean matrixAutoUpdate]</h3>
 		<p>
 		<p>
-		Whether to update the texture's uv-transform [page:Texture.matrix .matrix] from the texture properties [page:Texture.offset .offset], [page:Texture.repeat .repeat],
-		[page:Texture.rotation .rotation], and [page:Texture.center .center]. True by default.
-		Set this to false if you are specifying the uv-transform matrix directly.
+		是否从纹理的[page:Texture.offset .offset]、[page:Texture.repeat .repeat]、[page:Texture.rotation .rotation]和[page:Texture.center .center]属性更新纹理的UV变换矩阵(uv-transform [page:Texture.matrix .matrix])。
+		默认值为true。
+		如果你要直接指定纹理的变换矩阵,请将其设为false。
 		</p>
 		</p>
 
 
 		<h3>[property:Matrix3 matrix]</h3>
 		<h3>[property:Matrix3 matrix]</h3>
 		<p>
 		<p>
-		The uv-transform matrix for the texture. Updated by the renderer from the texture properties [page:Texture.offset .offset], [page:Texture.repeat .repeat],
-		[page:Texture.rotation .rotation], and [page:Texture.center .center] when the texture's [page:Texture.matrixAutoUpdate .matrixAutoUpdate] property is true.
-		When [page:Texture.matrixAutoUpdate .matrixAutoUpdate] property is false, this matrix may be set manually.
-		Default is the identity matrix.
+			纹理的UV变换矩阵。
+			当纹理的[page:Texture.matrixAutoUpdate .matrixAutoUpdate]属性为true时,
+			由渲染器从纹理的[page:Texture.offset .offset]、[page:Texture.repeat .repeat]、[page:Texture.rotation .rotation]和[page:Texture.center .center]属性中进行更新。
+			当[page:Texture.matrixAutoUpdate .matrixAutoUpdate]属性为false时,该矩阵可以被手动设置。
+			默认值为单位矩阵。
 		</p>
 		</p>
 
 
 		<h3>[property:boolean generateMipmaps]</h3>
 		<h3>[property:boolean generateMipmaps]</h3>
 		<p>
 		<p>
-		Whether to generate mipmaps (if possible) for a texture. True by default. Set this to false if you are
-		creating mipmaps manually.
+			是否为纹理生成mipmap(如果可用)。默认为true。
+			如果你手动生成mipmap,请将其设为false。
 		</p>
 		</p>
 
 
 		<h3>[property:boolean premultiplyAlpha]</h3>
 		<h3>[property:boolean premultiplyAlpha]</h3>
 		<p>
 		<p>
-		False by default, which is the norm for PNG images. Set to true if the RGB values have
-		been stored premultiplied by alpha.
+			默认为false,这是PNG图像的规范。
+			如果RGB值已被Alpha预乘,请将其设为true。
 		</p>
 		</p>
 
 
 		<h3>[property:boolean flipY]</h3>
 		<h3>[property:boolean flipY]</h3>
 		<p>
 		<p>
-		True by default. Flips the image's Y axis to match the WebGL texture coordinate space.
+		默认为true。翻转图像的Y轴以匹配WebGL纹理坐标空间。
 		</p>
 		</p>
 
 
 		<h3>[property:number unpackAlignment]</h3>
 		<h3>[property:number unpackAlignment]</h3>
 		<p>
 		<p>
-		4 by default. Specifies the alignment requirements for the start of each pixel row in memory.
-		The allowable values are 1 (byte-alignment), 2 (rows aligned to even-numbered bytes),
-		4 (word-alignment), and 8 (rows start on double-word boundaries).
-		See [link:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml glPixelStorei]
-		for more information.
+			默认为4。指定内存中每个像素行起点的对齐要求。
+			允许的值为1(字节对齐)、2(行对齐到偶数字节)、4(字对齐)和8(行从双字边界开始)。
+			请参阅[link:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml glPixelStorei]来了解详细信息。
 		</p>
 		</p>
 
 
 		<h3>[property:number encoding]</h3>
 		<h3>[property:number encoding]</h3>
 		<p>
 		<p>
-		[page:Textures THREE.LinearEncoding] is the default.
-		See the [page:Textures texture constants] page for details of other formats.<br /><br />
+		默认值为[page:Textures THREE.LinearEncoding]。
+		请参阅[page:Textures texture constants]来了解其他格式的详细信息。<br /><br />
 
 
-		Note that if this value is changed on a texture after the material has been used,
-		it is necessary to trigger a Material.needsUpdate for this value to be realized in the shader.
+		请注意,如果在材质被使用之后,纹理贴图中这个值发生了改变,
+		需要触发Material.needsUpdate,来使得这个值在着色器中实现。
 		</p>
 		</p>
 
 
 		<h3>[property:Integer version]</h3>
 		<h3>[property:Integer version]</h3>
 		<p>
 		<p>
-		This starts at *0* and counts how many times [property:Boolean needsUpdate] is set to *true*.
+		这个值起始值为*0*,计算[property:Boolean needsUpdate]被设置为*true*的次数。
 		</p>
 		</p>
 
 
 		<h3>[property:Function onUpdate]</h3>
 		<h3>[property:Function onUpdate]</h3>
 		<p>
 		<p>
-		A callback function, called when the texture is updated (e.g., when needsUpdate has been set to true
-		and then the texture is used).
+		一个回调函数,在纹理被更新后调用。
+		(例如,当needsUpdate被设为true且纹理被使用。)
 		</p>
 		</p>
 
 
 		<h3>[property:Boolean needsUpdate]</h3>
 		<h3>[property:Boolean needsUpdate]</h3>
 		<p>
 		<p>
-		Set this to *true* to trigger an update next time the texture is used. Particularly important for setting the wrap mode.
+			将其设置为*true*,以便在下次使用纹理时触发一次更新。
+			这对于设置包裹模式尤其重要。
 		</p>
 		</p>
 
 
 
 
-		<h2>Methods</h2>
+		<h2>方法</h2>
 
 
-		<h3>[page:EventDispatcher EventDispatcher] methods are available on this class.</h3>
+		<h3>[page:EventDispatcher EventDispatcher]方法在这个类上可以使用。</h3>
 
 
 		<h3>[method:null updateMatrix]()</h3>
 		<h3>[method:null updateMatrix]()</h3>
 		<p>
 		<p>
-		Update the texture's uv-transform [page:Texture.matrix .matrix] from the texture properties [page:Texture.offset .offset], [page:Texture.repeat .repeat],
-		[page:Texture.rotation .rotation], and [page:Texture.center .center].
+			从纹理的[page:Texture.offset .offset]、[page:Texture.repeat .repeat]、
+			[page:Texture.rotation .rotation]和[page:Texture.center .center]属性来更新纹理的UV变换矩阵(uv-transform [page:Texture.matrix .matrix])。
 		</p>
 		</p>
 
 
 		<h3>[method:Texture clone]()</h3>
 		<h3>[method:Texture clone]()</h3>
 		<p>
 		<p>
-		Make copy of the texture. Note this is not a "deep copy", the image is shared.
+			拷贝纹理。请注意。这不是“深拷贝”,图像是共用的。
 		</p>
 		</p>
 
 
 		<h3>[method:Texture toJSON]( [param:Object meta] )</h3>
 		<h3>[method:Texture toJSON]( [param:Object meta] )</h3>
 		<p>
 		<p>
-		meta -- optional object containing metadata.<br />
-		Convert the material to three.js JSON format.
+		meta -- 可选,包含有元数据的对象。<br />
+		将材质转换为three.js JSON格式。
 		</p>
 		</p>
 
 
 		<h3>[method:null dispose]()</h3>
 		<h3>[method:null dispose]()</h3>
 		<p>
 		<p>
-		Call [page:EventDispatcher EventDispatcher].dispatchEvent with a 'dispose' event type.
+			使用“dispose”事件类型调用[page:EventDispatcher EventDispatcher].dispatchEvent。
 		</p>
 		</p>
 
 
 		<h3>[method:Vector2 transformUv]( [param:Vector2 uv] )</h3>
 		<h3>[method:Vector2 transformUv]( [param:Vector2 uv] )</h3>
 		<p>
 		<p>
-		Transform the uv based on the value of this texture's [page:Texture.offset .offset], [page:Texture.repeat .repeat],
-		[page:Texture.wrapS .wrapS], [page:Texture.wrapT .wrapT] and [page:Texture.flipY .flipY] properties.
+			基于纹理的[page:Texture.offset .offset]、[page:Texture.repeat .repeat]、
+			[page:Texture.wrapS .wrapS]、[page:Texture.wrapT .wrapT]和[page:Texture.flipY .flipY]属性值来变换uv。
 		</p>
 		</p>
 
 
-		<h2>Source</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 31 - 31
docs/api/zh/textures/VideoTexture.html

@@ -10,15 +10,15 @@
 	<body>
 	<body>
 		[page:Texture] &rarr;
 		[page:Texture] &rarr;
 
 
-		<h1>[name]</h1>
+		<h1>视频纹理([name]</h1>
 
 
 		<p class="desc">
 		<p class="desc">
-		Creates a texture for use with a video texture.<br /><br />
+		创建一个使用视频来作为贴图的纹理对象。<br /><br />
 
 
-		This is almost the same as the base [page:Texture Texture] class, except that it continuosly sets [page:Texture.needsUpdate needsUpdate] to *true* so that the texture is updated as the video plays. Automatic creation of [page:Texture.mipmaps mipmaps] is also disabled.
+		它和其基类[page:Texture Texture]几乎是相同的,除了它总是将[page:Texture.needsUpdate needsUpdate]设置为*true*,以便使得贴图能够在视频播放时进行更新。自动创建[page:Texture.mipmaps mipmaps]也会被禁用。
 		</p>
 		</p>
 
 
-    <h2>Example</h2>
+    <h2>示例</h2>
 
 
 		<p>[example:webgl_materials_video materials / video ]</p>
 		<p>[example:webgl_materials_video materials / video ]</p>
 
 
@@ -33,63 +33,63 @@ texture.format = THREE.RGBFormat;
     </code>
     </code>
 
 
 
 
-		<h2>Constructor</h2>
+		<h2>构造函数</h2>
 		<h3>[name]( [param:Video video], [param:Constant mapping], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Constant format], [param:Constant type], [param:Number anisotropy] )</h3>
 		<h3>[name]( [param:Video video], [param:Constant mapping], [param:Constant wrapS], [param:Constant wrapT], [param:Constant magFilter], [param:Constant minFilter], [param:Constant format], [param:Constant type], [param:Number anisotropy] )</h3>
 		<p>
 		<p>
-		[page:Video video] -- The video element to use as the texture. <br />
+		[page:Video video] -- 将被作为纹理贴图来使用的Video元素。<br />
 
 
-		[page:Constant mapping] --  How the image is applied to the object. An object type of [page:Textures THREE.UVMapping].
-		See [page:Textures mapping constants] for other choices.<br />
+		[page:Constant mapping] --  纹理贴图将被如何应用(映射)到物体上,它是[page:Textures THREE.UVMapping]中的对象类型。
+		请参阅[page:Textures mapping constants](映射模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapS] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapS] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant wrapT] -- The default is [page:Textures THREE.ClampToEdgeWrapping].
-		See [page:Textures wrap mode constants] for other choices.<br />
+		[page:Constant wrapT] -- 默认值是[page:Textures THREE.ClampToEdgeWrapping].
+		请参阅[page:Textures wrap mode constants](包裹模式常量)来了解其他选项。<br />
 
 
-		[page:Constant magFilter] -- How the texture is sampled when a texel covers more than one pixel.
-		The default is [page:Textures THREE.LinearFilter]. See [page:Textures magnification filter constants] for other choices.<br />
+		[page:Constant magFilter] -- 当一个纹素覆盖大于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearFilter]。请参阅[page:Textures magnification filter constants](放大滤镜常量)来了解其它选项。<br />
 
 
-		[page:Constant minFilter] -- How the texture is sampled when a texel covers less than one pixel.
-		 The default is [page:Textures THREE.LinearMipMapLinearFilter]. See [page:Textures minification filter constants] for other choices.<br />
+		[page:Constant minFilter] -- 当一个纹素覆盖小于一个像素时,贴图将如何采样。
+		其默认值为[page:Textures THREE.LinearMipMapLinearFilter]。请参阅[page:Textures minification filter constants](缩小滤镜常量)来了解其它选项。<br />
 
 
-    [page:Constant format] -- The format used in the texture.
-     See [page:Textures format constants] for other choices.<br />
+    	[page:Constant format] -- 在纹理贴图中使用的格式。
+     	请参阅[page:Textures format constants](格式常量)来了解各个选项。<br />
 
 
-    [page:Constant type] -- Default is [page:Textures THREE.UnsignedByteType].
-     See [page:Textures type constants] for other choices.<br />
+    	[page:Constant type] -- 默认值是[page:Textures THREE.UnsignedByteType].
+     	请参阅[page:Textures type constants](类型常量)来了解其他选项。<br />
 
 
-		[page:Number anisotropy] -- The number of samples taken along the axis through the pixel that has the highest density of texels.
-		By default, this value is 1. A higher value gives a less blurry result than a basic mipmap, at the cost of more texture samples being used.
-		Use [page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2.<br /><br />
+		[page:Number anisotropy] -- 沿着轴,通过具有最高纹素密度的像素的采样数。
+		默认情况下,这个值为1。设置一个较高的值将会比基本的mipmap产生更清晰的效果,代价是需要使用更多纹理样本。
+		使用[page:WebGLrenderer.getMaxAnisotropy renderer.getMaxAnisotropy]() 来查询GPU中各向异性的最大有效值;这个值通常是2的幂。<br /><br />
 		</p>
 		</p>
 
 
 
 
-		<h2>Properties</h2>
+		<h2>属性</h2>
 
 
 		<p>
 		<p>
-    See the base [page:Texture Texture] class for common properties.
+    请参阅其基类[page:Texture Texture]来了解共有属性。
     </p>
     </p>
 
 
 		<h3>[property:boolean needsUpdate]</h3>
 		<h3>[property:boolean needsUpdate]</h3>
 		<p>
 		<p>
-		You will not need to set this manually here as it is handled by the [page:VideoTexture.update update] method.
+		在这里,你不必手动设置这个值,因为它是由[page:VideoTexture.update update]方法来进行控制的。
 		</p>
 		</p>
 
 
-		<h2>Methods</h2>
+		<h2>方法</h2>
 
 
     <p>
     <p>
-    See the base [page:Texture Texture] class for common methods.
+    请参阅其基类[page:Texture Texture]来查看共有方法。
     </p>
     </p>
 
 
     <h3>[method:null update]()</h3>
     <h3>[method:null update]()</h3>
 		<p>
 		<p>
-		This is called automatically and sets [property:boolean needsUpdate] to *true* every time
-    a new frame is available.
+		在每一次新的一帧可用时,这个方法将被自动调用,
+		并将[property:boolean needsUpdate]设置为*true*。
 		</p>
 		</p>
 
 
 
 
-		<h2>Source</h2>
+		<h2>源代码</h2>
 
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
 	</body>
 	</body>

+ 1 - 1
docs/examples/loaders/SVGLoader.html

@@ -91,7 +91,7 @@
 		<h3>[method:null load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError] )</h3>
 		<h3>[method:null load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError] )</h3>
 		<p>
 		<p>
 		[page:String url] — A string containing the path/URL of the <em>.svg</em> file.<br />
 		[page:String url] — A string containing the path/URL of the <em>.svg</em> file.<br />
-		[page:Function onLoad] — (optional) A function to be called after loading is successfully completed. The function receives the loaded [page:SVGDocument] as an argument.<br />
+		[page:Function onLoad] — (optional) A function to be called after loading is successfully completed. The function receives an array of [page:ShapePath] as an argument.<br />
 		[page:Function onProgress] — (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains [page:Integer total] and [page:Integer loaded] bytes.<br />
 		[page:Function onProgress] — (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains [page:Integer total] and [page:Integer loaded] bytes.<br />
 		[page:Function onError] — (optional) A function to be called if an error occurs during loading. The function receives the error as an argument.<br />
 		[page:Function onError] — (optional) A function to be called if an error occurs during loading. The function receives the error as an argument.<br />
 		</p>
 		</p>

+ 3 - 2
docs/examples/utils/BufferGeometryUtils.html

@@ -25,9 +25,10 @@
 
 
     </p>
     </p>
 
 
-    <h3>[method:BufferGeometry mergeBufferGeometries]( [param:Array geometries] )</h3>
+    <h3>[method:BufferGeometry mergeBufferGeometries]( [param:Array geometries], [param:Boolean useGroups] )</h3>
     <p>
     <p>
-    geometries -- Array of [page:BufferGeometry BufferGeometry] instances.<br /><br />
+    geometries -- Array of [page:BufferGeometry BufferGeometry] instances.<br />
+    useGroups -- Whether groups should be generated for the merged geometry or not.<br /><br />
 
 
     Merges a set of geometries into a single instance. All geometries must have compatible attributes.
     Merges a set of geometries into a single instance. All geometries must have compatible attributes.
     If merge does not succeed, the method returns null.<br /><br />
     If merge does not succeed, the method returns null.<br /><br />

+ 4 - 4
docs/examples/utils/SceneUtils.html

@@ -29,11 +29,11 @@
 		<h3>[method:null attach]( [param:Object3D child], [param:Object3D scene], [param:Object3D parent] )</h3>
 		<h3>[method:null attach]( [param:Object3D child], [param:Object3D scene], [param:Object3D parent] )</h3>
 		<p>
 		<p>
 		child -- The object to add to the parent  <br />
 		child -- The object to add to the parent  <br />
-		scene -- The scene to detach the object on. <br />
-		parent -- The parent to attach the object from.
+		scene -- The scene to detach the object from. <br />
+		parent -- The parent to attach the object to.
 		</p>
 		</p>
 		<p>
 		<p>
-		Attaches the object to the parent without the moving the object in the worldspace. Beware that to do this the matrixWorld needs to be updated, this can be done by calling the updateMatrixWorld method on the parent object.
+		Attaches the object to the parent without the moving the object in the worldspace. Beware that to do this the matrixWorld needs to be updated. This can be done by calling the updateMatrixWorld method on the parent object.
 		</p>
 		</p>
 
 
 		<h3>[method:null detach]( [param:Object3D child], [param:Object3D parent], [param:Object3D scene] )</h3>
 		<h3>[method:null detach]( [param:Object3D child], [param:Object3D parent], [param:Object3D scene] )</h3>
@@ -43,7 +43,7 @@
 		parent -- The parent to detach the object from.
 		parent -- The parent to detach the object from.
 		</p>
 		</p>
 		<p>
 		<p>
-		Detaches the object from the parent and adds it back to the scene without moving in worldspace. Beware that to do this the matrixWorld needs to be updated, this can be done by calling the updateMatrixWorld method on the parent object.
+		Detaches the object from the parent and adds it back to the scene without moving in worldspace. Beware that to do this the matrixWorld needs to be updated. This can be done by calling the updateMatrixWorld method on the parent object.
 		</p>
 		</p>
 
 
 		<h2>Source</h2>
 		<h2>Source</h2>

+ 50 - 49
docs/list.js

@@ -427,15 +427,15 @@ var list = {
 
 
 	"zh": {
 	"zh": {
 
 
-		"Manual": {
+		"手册": {
 
 
-			"Getting Started": {
+			"起步": {
 				"创建一个场景": "manual/zh/introduction/Creating-a-scene",
 				"创建一个场景": "manual/zh/introduction/Creating-a-scene",
 				"通过模块来引入": "manual/zh/introduction/Import-via-modules",
 				"通过模块来引入": "manual/zh/introduction/Import-via-modules",
 				"浏览器支持": "manual/zh/introduction/Browser-support",
 				"浏览器支持": "manual/zh/introduction/Browser-support",
 				"WebGL兼容性检查": "manual/zh/introduction/WebGL-compatibility-check",
 				"WebGL兼容性检查": "manual/zh/introduction/WebGL-compatibility-check",
 				"如何在本地运行Three.js": "manual/zh/introduction/How-to-run-things-locally",
 				"如何在本地运行Three.js": "manual/zh/introduction/How-to-run-things-locally",
-				"How to use WebGL 2": "manual/zh/introduction/How-to-use-WebGL2",
+				"如何使用WebGL 2": "manual/zh/introduction/How-to-use-WebGL2",
 				"画线": "manual/zh/introduction/Drawing-lines",
 				"画线": "manual/zh/introduction/Drawing-lines",
 				"创建文字": "manual/zh/introduction/Creating-text",
 				"创建文字": "manual/zh/introduction/Creating-text",
 				"载入3D模型": "manual/zh/introduction/Loading-3D-models",
 				"载入3D模型": "manual/zh/introduction/Loading-3D-models",
@@ -445,21 +445,22 @@ var list = {
 				"一些有用的链接": "manual/zh/introduction/Useful-links"
 				"一些有用的链接": "manual/zh/introduction/Useful-links"
 			},
 			},
 
 
-			"Next Steps": {
-				"How to update things": "manual/zh/introduction/How-to-update-things",
-				"Matrix transformations": "manual/zh/introduction/Matrix-transformations",
-				"Animation system": "manual/zh/introduction/Animation-system"
+			"进阶": {
+				"如何更新场景": "manual/zh/introduction/How-to-update-things",
+				"如何创建VR内容": "manual/zh/introduction/How-to-create-VR-content",
+				"矩阵变换": "manual/zh/introduction/Matrix-transformations",
+				"动画系统": "manual/zh/introduction/Animation-system"
 			},
 			},
 
 
-			"Build Tools": {
-				"Testing with NPM": "manual/zh/buildTools/Testing-with-NPM"
+			"构建工具": {
+				"使用NPM进行测试": "manual/zh/buildTools/Testing-with-NPM"
 			}
 			}
 
 
 		},
 		},
 
 
-		"Reference": {
+		"参考": {
 
 
-			"Animation": {
+			"动画": {
 				"AnimationAction": "api/zh/animation/AnimationAction",
 				"AnimationAction": "api/zh/animation/AnimationAction",
 				"AnimationClip": "api/zh/animation/AnimationClip",
 				"AnimationClip": "api/zh/animation/AnimationClip",
 				"AnimationMixer": "api/zh/animation/AnimationMixer",
 				"AnimationMixer": "api/zh/animation/AnimationMixer",
@@ -470,7 +471,7 @@ var list = {
 				"PropertyMixer": "api/zh/animation/PropertyMixer"
 				"PropertyMixer": "api/zh/animation/PropertyMixer"
 			},
 			},
 
 
-			"Animation / Tracks": {
+			"动画 / 轨道": {
 				"BooleanKeyframeTrack": "api/zh/animation/tracks/BooleanKeyframeTrack",
 				"BooleanKeyframeTrack": "api/zh/animation/tracks/BooleanKeyframeTrack",
 				"ColorKeyframeTrack": "api/zh/animation/tracks/ColorKeyframeTrack",
 				"ColorKeyframeTrack": "api/zh/animation/tracks/ColorKeyframeTrack",
 				"NumberKeyframeTrack": "api/zh/animation/tracks/NumberKeyframeTrack",
 				"NumberKeyframeTrack": "api/zh/animation/tracks/NumberKeyframeTrack",
@@ -479,7 +480,7 @@ var list = {
 				"VectorKeyframeTrack": "api/zh/animation/tracks/VectorKeyframeTrack"
 				"VectorKeyframeTrack": "api/zh/animation/tracks/VectorKeyframeTrack"
 			},
 			},
 
 
-			"Audio": {
+			"音频": {
 				"Audio": "api/zh/audio/Audio",
 				"Audio": "api/zh/audio/Audio",
 				"AudioAnalyser": "api/zh/audio/AudioAnalyser",
 				"AudioAnalyser": "api/zh/audio/AudioAnalyser",
 				"AudioContext": "api/zh/audio/AudioContext",
 				"AudioContext": "api/zh/audio/AudioContext",
@@ -487,7 +488,7 @@ var list = {
 				"PositionalAudio": "api/zh/audio/PositionalAudio"
 				"PositionalAudio": "api/zh/audio/PositionalAudio"
 			},
 			},
 
 
-			"Cameras": {
+			"摄像机": {
 				"ArrayCamera": "api/zh/cameras/ArrayCamera",
 				"ArrayCamera": "api/zh/cameras/ArrayCamera",
 				"Camera": "api/zh/cameras/Camera",
 				"Camera": "api/zh/cameras/Camera",
 				"CubeCamera": "api/zh/cameras/CubeCamera",
 				"CubeCamera": "api/zh/cameras/CubeCamera",
@@ -496,7 +497,7 @@ var list = {
 				"StereoCamera": "api/zh/cameras/StereoCamera"
 				"StereoCamera": "api/zh/cameras/StereoCamera"
 			},
 			},
 
 
-			"Constants": {
+			"常量": {
 				"Animation": "api/zh/constants/Animation",
 				"Animation": "api/zh/constants/Animation",
 				"Core": "api/zh/constants/Core",
 				"Core": "api/zh/constants/Core",
 				"CustomBlendingEquation": "api/zh/constants/CustomBlendingEquations",
 				"CustomBlendingEquation": "api/zh/constants/CustomBlendingEquations",
@@ -506,7 +507,7 @@ var list = {
 				"Textures": "api/zh/constants/Textures"
 				"Textures": "api/zh/constants/Textures"
 			},
 			},
 
 
-			"Core": {
+			"核心": {
 				"BufferAttribute": "api/zh/core/BufferAttribute",
 				"BufferAttribute": "api/zh/core/BufferAttribute",
 				"BufferGeometry": "api/zh/core/BufferGeometry",
 				"BufferGeometry": "api/zh/core/BufferGeometry",
 				"Clock": "api/zh/core/Clock",
 				"Clock": "api/zh/core/Clock",
@@ -525,20 +526,20 @@ var list = {
 				"Uniform": "api/zh/core/Uniform"
 				"Uniform": "api/zh/core/Uniform"
 			},
 			},
 
 
-			"Core / BufferAttributes": {
+			"核心 / BufferAttributes": {
 				"BufferAttribute Types": "api/zh/core/bufferAttributeTypes/BufferAttributeTypes"
 				"BufferAttribute Types": "api/zh/core/bufferAttributeTypes/BufferAttributeTypes"
 			},
 			},
 
 
-			"Deprecated": {
+			"弃用列表": {
 				"DeprecatedList": "api/zh/deprecated/DeprecatedList"
 				"DeprecatedList": "api/zh/deprecated/DeprecatedList"
 			},
 			},
 
 
-			"Extras": {
+			"附件": {
 				"Earcut": "api/zh/extras/Earcut",
 				"Earcut": "api/zh/extras/Earcut",
 				"ShapeUtils": "api/zh/extras/ShapeUtils"
 				"ShapeUtils": "api/zh/extras/ShapeUtils"
 			},
 			},
 
 
-			"Extras / Core": {
+			"附件 / 核心": {
 				"Curve": "api/zh/extras/core/Curve",
 				"Curve": "api/zh/extras/core/Curve",
 				"CurvePath": "api/zh/extras/core/CurvePath",
 				"CurvePath": "api/zh/extras/core/CurvePath",
 				"Font": "api/zh/extras/core/Font",
 				"Font": "api/zh/extras/core/Font",
@@ -548,7 +549,7 @@ var list = {
 				"ShapePath": "api/zh/extras/core/ShapePath"
 				"ShapePath": "api/zh/extras/core/ShapePath"
 			},
 			},
 
 
-			"Extras / Curves": {
+			"附件 / 曲线": {
 				"ArcCurve": "api/zh/extras/curves/ArcCurve",
 				"ArcCurve": "api/zh/extras/curves/ArcCurve",
 				"CatmullRomCurve3": "api/zh/extras/curves/CatmullRomCurve3",
 				"CatmullRomCurve3": "api/zh/extras/curves/CatmullRomCurve3",
 				"CubicBezierCurve": "api/zh/extras/curves/CubicBezierCurve",
 				"CubicBezierCurve": "api/zh/extras/curves/CubicBezierCurve",
@@ -561,11 +562,11 @@ var list = {
 				"SplineCurve": "api/zh/extras/curves/SplineCurve"
 				"SplineCurve": "api/zh/extras/curves/SplineCurve"
 			},
 			},
 
 
-			"Extras / Objects": {
+			"附件 / 物体": {
 				"ImmediateRenderObject": "api/zh/extras/objects/ImmediateRenderObject",
 				"ImmediateRenderObject": "api/zh/extras/objects/ImmediateRenderObject",
 			},
 			},
 
 
-			"Geometries": {
+			"几何体": {
 				"BoxBufferGeometry": "api/zh/geometries/BoxBufferGeometry",
 				"BoxBufferGeometry": "api/zh/geometries/BoxBufferGeometry",
 				"BoxGeometry": "api/zh/geometries/BoxGeometry",
 				"BoxGeometry": "api/zh/geometries/BoxGeometry",
 				"CircleBufferGeometry": "api/zh/geometries/CircleBufferGeometry",
 				"CircleBufferGeometry": "api/zh/geometries/CircleBufferGeometry",
@@ -610,7 +611,7 @@ var list = {
 				"WireframeGeometry": "api/zh/geometries/WireframeGeometry"
 				"WireframeGeometry": "api/zh/geometries/WireframeGeometry"
 			},
 			},
 
 
-			"Helpers": {
+			"辅助对象": {
 				"ArrowHelper": "api/zh/helpers/ArrowHelper",
 				"ArrowHelper": "api/zh/helpers/ArrowHelper",
 				"AxesHelper": "api/zh/helpers/AxesHelper",
 				"AxesHelper": "api/zh/helpers/AxesHelper",
 				"BoxHelper": "api/zh/helpers/BoxHelper",
 				"BoxHelper": "api/zh/helpers/BoxHelper",
@@ -629,7 +630,7 @@ var list = {
 				"VertexNormalsHelper": "api/zh/helpers/VertexNormalsHelper"
 				"VertexNormalsHelper": "api/zh/helpers/VertexNormalsHelper"
 			},
 			},
 
 
-			"Lights": {
+			"灯光": {
 				"AmbientLight": "api/zh/lights/AmbientLight",
 				"AmbientLight": "api/zh/lights/AmbientLight",
 				"DirectionalLight": "api/zh/lights/DirectionalLight",
 				"DirectionalLight": "api/zh/lights/DirectionalLight",
 				"HemisphereLight": "api/zh/lights/HemisphereLight",
 				"HemisphereLight": "api/zh/lights/HemisphereLight",
@@ -639,13 +640,13 @@ var list = {
 				"SpotLight": "api/zh/lights/SpotLight"
 				"SpotLight": "api/zh/lights/SpotLight"
 			},
 			},
 
 
-			"Lights / Shadows": {
+			"灯光 / 阴影": {
 				"DirectionalLightShadow": "api/zh/lights/shadows/DirectionalLightShadow",
 				"DirectionalLightShadow": "api/zh/lights/shadows/DirectionalLightShadow",
 				"LightShadow": "api/zh/lights/shadows/LightShadow",
 				"LightShadow": "api/zh/lights/shadows/LightShadow",
 				"SpotLightShadow": "api/zh/lights/shadows/SpotLightShadow"
 				"SpotLightShadow": "api/zh/lights/shadows/SpotLightShadow"
 			},
 			},
 
 
-			"Loaders": {
+			"加载器": {
 				"AnimationLoader": "api/zh/loaders/AnimationLoader",
 				"AnimationLoader": "api/zh/loaders/AnimationLoader",
 				"AudioLoader": "api/zh/loaders/AudioLoader",
 				"AudioLoader": "api/zh/loaders/AudioLoader",
 				"BufferGeometryLoader": "api/zh/loaders/BufferGeometryLoader",
 				"BufferGeometryLoader": "api/zh/loaders/BufferGeometryLoader",
@@ -665,12 +666,12 @@ var list = {
 				"TextureLoader": "api/zh/loaders/TextureLoader"
 				"TextureLoader": "api/zh/loaders/TextureLoader"
 			},
 			},
 
 
-			"Loaders / Managers": {
+			"加载器 / 管理器": {
 				"DefaultLoadingManager": "api/zh/loaders/managers/DefaultLoadingManager",
 				"DefaultLoadingManager": "api/zh/loaders/managers/DefaultLoadingManager",
 				"LoadingManager": "api/zh/loaders/managers/LoadingManager"
 				"LoadingManager": "api/zh/loaders/managers/LoadingManager"
 			},
 			},
 
 
-			"Materials": {
+			"材质": {
 				"LineBasicMaterial": "api/zh/materials/LineBasicMaterial",
 				"LineBasicMaterial": "api/zh/materials/LineBasicMaterial",
 				"LineDashedMaterial": "api/zh/materials/LineDashedMaterial",
 				"LineDashedMaterial": "api/zh/materials/LineDashedMaterial",
 				"Material": "api/zh/materials/Material",
 				"Material": "api/zh/materials/Material",
@@ -689,7 +690,7 @@ var list = {
 				"SpriteMaterial": "api/zh/materials/SpriteMaterial"
 				"SpriteMaterial": "api/zh/materials/SpriteMaterial"
 			},
 			},
 
 
-			"Math": {
+			"数学库": {
 				"Box2": "api/zh/math/Box2",
 				"Box2": "api/zh/math/Box2",
 				"Box3": "api/zh/math/Box3",
 				"Box3": "api/zh/math/Box3",
 				"Color": "api/zh/math/Color",
 				"Color": "api/zh/math/Color",
@@ -712,14 +713,14 @@ var list = {
 				"Vector4": "api/zh/math/Vector4"
 				"Vector4": "api/zh/math/Vector4"
 			},
 			},
 
 
-			"Math / Interpolants": {
+			"数学库 / 插值": {
 				"CubicInterpolant": "api/zh/math/interpolants/CubicInterpolant",
 				"CubicInterpolant": "api/zh/math/interpolants/CubicInterpolant",
 				"DiscreteInterpolant": "api/zh/math/interpolants/DiscreteInterpolant",
 				"DiscreteInterpolant": "api/zh/math/interpolants/DiscreteInterpolant",
 				"LinearInterpolant": "api/zh/math/interpolants/LinearInterpolant",
 				"LinearInterpolant": "api/zh/math/interpolants/LinearInterpolant",
 				"QuaternionLinearInterpolant": "api/zh/math/interpolants/QuaternionLinearInterpolant"
 				"QuaternionLinearInterpolant": "api/zh/math/interpolants/QuaternionLinearInterpolant"
 			},
 			},
 
 
-			"Objects": {
+			"物体": {
 				"Bone": "api/zh/objects/Bone",
 				"Bone": "api/zh/objects/Bone",
 				"Group": "api/zh/objects/Group",
 				"Group": "api/zh/objects/Group",
 				"Line": "api/zh/objects/Line",
 				"Line": "api/zh/objects/Line",
@@ -733,26 +734,26 @@ var list = {
 				"Sprite": "api/zh/objects/Sprite"
 				"Sprite": "api/zh/objects/Sprite"
 			},
 			},
 
 
-			"Renderers": {
+			"渲染器": {
 				"WebGLRenderer": "api/zh/renderers/WebGLRenderer",
 				"WebGLRenderer": "api/zh/renderers/WebGLRenderer",
 				"WebGLRenderTarget": "api/zh/renderers/WebGLRenderTarget",
 				"WebGLRenderTarget": "api/zh/renderers/WebGLRenderTarget",
 				"WebGLRenderTargetCube": "api/zh/renderers/WebGLRenderTargetCube"
 				"WebGLRenderTargetCube": "api/zh/renderers/WebGLRenderTargetCube"
 			},
 			},
 
 
-			"Renderers / Shaders": {
+			"渲染器 / 着色器": {
 				"ShaderChunk": "api/zh/renderers/shaders/ShaderChunk",
 				"ShaderChunk": "api/zh/renderers/shaders/ShaderChunk",
 				"ShaderLib": "api/zh/renderers/shaders/ShaderLib",
 				"ShaderLib": "api/zh/renderers/shaders/ShaderLib",
 				"UniformsLib": "api/zh/renderers/shaders/UniformsLib",
 				"UniformsLib": "api/zh/renderers/shaders/UniformsLib",
 				"UniformsUtils": "api/zh/renderers/shaders/UniformsUtils"
 				"UniformsUtils": "api/zh/renderers/shaders/UniformsUtils"
 			},
 			},
 
 
-			"Scenes": {
+			"场景": {
 				"Fog": "api/zh/scenes/Fog",
 				"Fog": "api/zh/scenes/Fog",
 				"FogExp2": "api/zh/scenes/FogExp2",
 				"FogExp2": "api/zh/scenes/FogExp2",
 				"Scene": "api/zh/scenes/Scene"
 				"Scene": "api/zh/scenes/Scene"
 			},
 			},
 
 
-			"Textures": {
+			"纹理贴图": {
 				"CanvasTexture": "api/zh/textures/CanvasTexture",
 				"CanvasTexture": "api/zh/textures/CanvasTexture",
 				"CompressedTexture": "api/zh/textures/CompressedTexture",
 				"CompressedTexture": "api/zh/textures/CompressedTexture",
 				"CubeTexture": "api/zh/textures/CubeTexture",
 				"CubeTexture": "api/zh/textures/CubeTexture",
@@ -765,25 +766,25 @@ var list = {
 
 
 		},
 		},
 
 
-		"Examples": {
+		"示例": {
 
 
-			"Animations": {
+			"动画": {
 				"CCDIKSolver": "examples/animations/CCDIKSolver",
 				"CCDIKSolver": "examples/animations/CCDIKSolver",
 				"MMDAnimationHelper": "examples/animations/MMDAnimationHelper",
 				"MMDAnimationHelper": "examples/animations/MMDAnimationHelper",
 				"MMDPhysics": "examples/animations/MMDPhysics"
 				"MMDPhysics": "examples/animations/MMDPhysics"
 			},
 			},
 
 
-			"Controls": {
+			"控制": {
 				"OrbitControls": "examples/controls/OrbitControls"
 				"OrbitControls": "examples/controls/OrbitControls"
 			},
 			},
 
 
-			"Geometries": {
+			"几何体": {
 				"ConvexBufferGeometry": "examples/geometries/ConvexBufferGeometry",
 				"ConvexBufferGeometry": "examples/geometries/ConvexBufferGeometry",
 				"ConvexGeometry": "examples/geometries/ConvexGeometry",
 				"ConvexGeometry": "examples/geometries/ConvexGeometry",
 				"DecalGeometry": "examples/geometries/DecalGeometry"
 				"DecalGeometry": "examples/geometries/DecalGeometry"
 			},
 			},
 
 
-			"Loaders": {
+			"加载器": {
 				"BabylonLoader": "examples/loaders/BabylonLoader",
 				"BabylonLoader": "examples/loaders/BabylonLoader",
 				"GLTFLoader": "examples/loaders/GLTFLoader",
 				"GLTFLoader": "examples/loaders/GLTFLoader",
 				"MMDLoader": "examples/loaders/MMDLoader",
 				"MMDLoader": "examples/loaders/MMDLoader",
@@ -798,16 +799,16 @@ var list = {
 				"PRWMLoader": "examples/loaders/PRWMLoader"
 				"PRWMLoader": "examples/loaders/PRWMLoader"
 			},
 			},
 
 
-			"Objects": {
+			"物体": {
 				"Lensflare": "examples/objects/Lensflare",
 				"Lensflare": "examples/objects/Lensflare",
 			},
 			},
 
 
-			"Exporters": {
+			"导出器": {
 				"GLTFExporter": "examples/exporters/GLTFExporter",
 				"GLTFExporter": "examples/exporters/GLTFExporter",
 				"PLYExporter": "examples/exporters/PLYExporter"
 				"PLYExporter": "examples/exporters/PLYExporter"
 			},
 			},
 
 
-			"Plugins": {
+			"插件": {
 				"LookupTable": "examples/Lut",
 				"LookupTable": "examples/Lut",
 			},
 			},
 
 
@@ -819,27 +820,27 @@ var list = {
 				"VertexList": "examples/quickhull/VertexList"
 				"VertexList": "examples/quickhull/VertexList"
 			},
 			},
 
 
-			"Renderers": {
+			"渲染器": {
 				"CSS2DRenderer": "examples/renderers/CSS2DRenderer",
 				"CSS2DRenderer": "examples/renderers/CSS2DRenderer",
 				"CSS3DRenderer": "examples/renderers/CSS3DRenderer",
 				"CSS3DRenderer": "examples/renderers/CSS3DRenderer",
 				"SVGRenderer": "examples/renderers/SVGRenderer"
 				"SVGRenderer": "examples/renderers/SVGRenderer"
 
 
 			},
 			},
 
 
-			"Utils": {
+			"实用工具": {
 				"BufferGeometryUtils": "examples/utils/BufferGeometryUtils",
 				"BufferGeometryUtils": "examples/utils/BufferGeometryUtils",
 				"SceneUtils": "examples/utils/SceneUtils"
 				"SceneUtils": "examples/utils/SceneUtils"
 			}
 			}
 
 
 		},
 		},
 
 
-		"Developer Reference": {
+		"开发者参考": {
 
 
-			"Polyfills": {
+			"差异化支持": {
 				"Polyfills": "api/zh/Polyfills"
 				"Polyfills": "api/zh/Polyfills"
 			},
 			},
 
 
-			"WebGLRenderer": {
+			"WebGL渲染器": {
 				"WebGLProgram": "api/zh/renderers/webgl/WebGLProgram",
 				"WebGLProgram": "api/zh/renderers/webgl/WebGLProgram",
 				"WebGLShader": "api/zh/renderers/webgl/WebGLShader",
 				"WebGLShader": "api/zh/renderers/webgl/WebGLShader",
 				"WebGLState": "api/zh/renderers/webgl/WebGLState"
 				"WebGLState": "api/zh/renderers/webgl/WebGLState"

+ 84 - 0
docs/manual/zh/introduction/How-to-create-VR-content.html

@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="utf-8">
+	<base href="../../../" />
+	<script src="list.js"></script>
+	<script src="page.js"></script>
+	<link type="text/css" rel="stylesheet" href="page.css" />
+</head>
+
+<body>
+	<h1>如何创建VR内容([name])</h1>
+	<br />
+
+	<p>
+		本指南简要介绍了使用three.js来制作的基于Web的VR应用程序的基本组件。
+	</p>
+
+	<h2>工作流程</h2>
+
+	<p>
+		首先,你需要将[link:https://github.com/mrdoob/three.js/blob/master/examples/js/vr/WebVR.js WebVR.js]
+		包含到你的项目中。
+	</p>
+
+	<code>
+&lt;script src="/path/to/WebVR.js"&gt;&lt;/script&gt;
+	</code>
+
+	<p>*WEBVR.createButton()*做了两件重要的事情:首先,它创建了一个按钮,指示了VR的兼容性;
+		此外,若用户激活了这个按钮,则它将开启一个VR会话。
+		你所要做的唯一一件事情,便是把下面的这一行代码加入到你的应用程序里。
+	</p>
+
+	<code>
+document.body.appendChild( WEBVR.createButton( renderer ) );
+	</code>
+
+	<p>
+		接下来,你需要告诉你的*WebGLRenderer*实例来启用VR渲染。
+	</p>
+
+	<code>
+renderer.vr.enabled = true;
+	</code>
+
+	<p>
+		最后,你需要调整你的动画循环,因为在这里我们不能使用我们所熟知的
+		*window.requestAnimationFrame()*函数来更新场景。对于VR项目来说,我们使用的是[page:WebGLRenderer.setAnimationLoop setAnimationLoop]。
+		
+		简短的示例代码如下:
+	</p>
+
+	<code>
+renderer.setAnimationLoop( function () {
+
+	renderer.render( scene, camera );
+
+} );
+	</code>
+
+	<h2>接下来的步骤</h2>
+
+	<p>
+		请查看官方示例中与WebVR相关的示例,了解这一工作流程的实际使用、运行情况。
+		<br /><br />
+
+		[example:webvr_ballshooter WebVR / ballshoter]<br />
+		[example:webvr_cubes WebVR / cubes]<br />
+		[example:webvr_dragging WebVR / dragging]<br />
+		[example:webvr_lorenzattractor WebVR / lorenzattractor]<br />
+		[example:webvr_panorama WebVR / panorama]<br />
+		[example:webvr_paint WebVR / paint]<br />
+		[example:webvr_rollercoaster WebVR / rollercoaster]<br />
+		[example:webvr_sandbox WebVR / sandbox]<br />
+		[example:webvr_sculpt WebVR / sculpt]<br />
+		[example:webvr_vive_paint WebVR / vive / paint]<br />
+		[example:webvr_vive_sculpt WebVR / vive / sculpt]<br />
+	</p>
+
+</body>
+
+</html>

+ 17 - 19
docs/manual/zh/introduction/How-to-use-WebGL2.html

@@ -10,20 +10,19 @@
 </head>
 </head>
 
 
 <body>
 <body>
-	<h1>[name]</h1>
+	<h1>如何使用WebGL 2([name]</h1>
 	<br />
 	<br />
 
 
 	<p>
 	<p>
-		Starting with three.js R95, the engine supports rendering with a WebGL 2 context. By default three.js always uses a
-		WebGL 1 context when creating an instance of *WebGLRenderer*. If you want use a WebGL 2 context, please have a look
-		at the following workflow.
+		从R95版本起,three.js便开始支持使用WebGL 2环境来进行渲染。默认情况下,当创建一个*WebGLRenderer*实例时,
+		three.js总是使用WebGL 1环境。如果你希望来使用WebGL 2环境,请参阅以下的工作流程。
 	</p>
 	</p>
 
 
-	<h2>Workflow</h2>
+	<h2>工作流程</h2>
 
 
 	<p>
 	<p>
-		Since WebGL 2 is not supported by all devices that support WebGL 1, it's important to check the respective availability.
-		To do so, please include [link:https://github.com/mrdoob/three.js/blob/master/examples/js/WebGL.js WebGL.js] into your project.
+		由于WebGL 2并不被所有支持WebGL 1的设备所支持,因此检查各种设备上WebGL 2的可用性是非常重要的。
+		要对其可用性进行检查,请将[link:https://github.com/mrdoob/three.js/blob/master/examples/js/WebGL.js WebGL.js]包含到你的项目中。
 	</p>
 	</p>
 
 
 	<code>
 	<code>
@@ -31,7 +30,7 @@
 	</code>
 	</code>
 
 
 	<p>
 	<p>
-		Next, use a code similar to the following in order to perform the availability check.
+		接下来,使用和下列代码相似的代码来进行可用性检查。
 	</p>
 	</p>
 
 
 	<code>
 	<code>
@@ -44,9 +43,8 @@ if ( WEBGL.isWebGL2Available() === false ) {
 	</code>
 	</code>
 
 
 	<p>
 	<p>
-		Now it's time to create the renderer by applying the HTML5 canvas element and the respective WebGL 2 context
-		to the constructor of *WebGLRenderer*. As a result, three.js will internally use the given context for rendering and
-		automatically convert the built-in material's shader code to GLSL ES 3.00.
+		现在,你就可以将由*WebGLRenderer*所构造的renderer,应用到HTML5 Canvas元素和对应的WebGL 2绘图环境上了。
+		最终,three.js将在内部使用所给定的绘图环境来渲染,并自动将内置的材质的着色器代码转化为GLSL ES 3.00。
 	</p>
 	</p>
 
 
 	<code>
 	<code>
@@ -56,8 +54,8 @@ var renderer = new THREE.WebGLRenderer( { canvas: canvas, context: context } );
 	</code>
 	</code>
 
 
 	<p>
 	<p>
-		Sometimes it is necessary to write custom shader code. Use the following code template as a basis for your own
-		implementation. First, the GLSL ES 3.00 code.
+		有时候,写一些自定义着色器也是非常必要的。请使用下列的代码模板作为你自己来进行实现的基础。
+		首先是GLSL ES 3.00代码。
 	</p>
 	</p>
 
 
 	<code>
 	<code>
@@ -85,7 +83,7 @@ void main() {
 &lt;/script&gt;
 &lt;/script&gt;
 	</code>
 	</code>
 	<p>
 	<p>
-		Second, the corresponding material creation in JavaScript.
+		然后是使用JavaScript来创建的对应的材质。
 	</p>
 	</p>
 	<code>
 	<code>
 var material = new THREE.ShaderMaterial( {
 var material = new THREE.ShaderMaterial( {
@@ -94,20 +92,20 @@ var material = new THREE.ShaderMaterial( {
 } );
 } );
 	</code>
 	</code>
 
 
-	<h2>Next Steps</h2>
+	<h2>接下来</h2>
 
 
 	<p>
 	<p>
-		Have a look at one of the official examples in order to see WebGL 2 features in action.<br /><br />
+		请参阅官方示例,来看一看WebGL 2各种特性的运行。<br /><br />
 
 
 		[example:webgl2_materials_texture3d WebGL2 / materials / texture3d]<br />
 		[example:webgl2_materials_texture3d WebGL2 / materials / texture3d]<br />
 		[example:webgl2_materials_texture3d_volume WebGL2 / materials / texture3d / volume]<br />
 		[example:webgl2_materials_texture3d_volume WebGL2 / materials / texture3d / volume]<br />
 	</p>
 	</p>
 
 
-	<h2>Supported features</h2>
+	<h2>支持的特性</h2>
 
 
 	<p>
 	<p>
-		Right now, the engine does only support a subset of all existing WebGL 2 features. The following list provides an
-		overview about what's already available in the latest version of three.js.
+		当前,three.js引擎仅支持所有现有的WebGL 2特性的一个子集。
+		下列列表展现了在最新版本three.js中,已可用的特性的概览。
 		<ul>
 		<ul>
 			<li>3D Textures</li>
 			<li>3D Textures</li>
 		</ul>
 		</ul>

+ 1 - 0
editor/css/dark.css

@@ -107,6 +107,7 @@ select {
 			color: #888;
 			color: #888;
 			margin: 0;
 			margin: 0;
 			padding: 8px;
 			padding: 8px;
+			line-height: 16px;
 		}
 		}
 
 
 		#menubar .menu .options {
 		#menubar .menu .options {

+ 1 - 0
editor/css/light.css

@@ -103,6 +103,7 @@ select {
 			color: #888;
 			color: #888;
 			margin: 0;
 			margin: 0;
 			padding: 8px;
 			padding: 8px;
+			line-height: 16px;
 		}
 		}
 
 
 		#menubar .menu .options {
 		#menubar .menu .options {

+ 2 - 2
editor/js/Menubar.Play.js

@@ -20,13 +20,13 @@ Menubar.Play = function ( editor ) {
 		if ( isPlaying === false ) {
 		if ( isPlaying === false ) {
 
 
 			isPlaying = true;
 			isPlaying = true;
-			title.setTextContent( 'Stop' );
+			title.setTextContent( strings.getKey( 'menubar/play/stop' ) );
 			signals.startPlayer.dispatch();
 			signals.startPlayer.dispatch();
 
 
 		} else {
 		} else {
 
 
 			isPlaying = false;
 			isPlaying = false;
-			title.setTextContent( 'Play' );
+			title.setTextContent( strings.getKey( 'menubar/play/play' ) );
 			signals.stopPlayer.dispatch();
 			signals.stopPlayer.dispatch();
 
 
 		}
 		}

+ 3 - 1
editor/js/Menubar.Status.js

@@ -4,10 +4,12 @@
 
 
 Menubar.Status = function ( editor ) {
 Menubar.Status = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var container = new UI.Panel();
 	var container = new UI.Panel();
 	container.setClass( 'menu right' );
 	container.setClass( 'menu right' );
 
 
-	var autosave = new UI.THREE.Boolean( editor.config.getKey( 'autosave' ), 'autosave' );
+	var autosave = new UI.THREE.Boolean( editor.config.getKey( 'autosave' ), strings.getKey( 'menubar/status/autosave' ) );
 	autosave.text.setColor( '#888' );
 	autosave.text.setColor( '#888' );
 	autosave.onChange( function () {
 	autosave.onChange( function () {
 
 

+ 8 - 6
editor/js/Sidebar.Geometry.BoxGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 	var widthRow = new UI.Row();
 	var widthRow = new UI.Row();
 	var width = new UI.Number( parameters.width ).onChange( update );
 	var width = new UI.Number( parameters.width ).onChange( update );
 
 
-	widthRow.add( new UI.Text( 'Width' ).setWidth( '90px' ) );
+	widthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/box_geometry/width' ) ).setWidth( '90px' ) );
 	widthRow.add( width );
 	widthRow.add( width );
 
 
 	container.add( widthRow );
 	container.add( widthRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 	var heightRow = new UI.Row();
 	var heightRow = new UI.Row();
 	var height = new UI.Number( parameters.height ).onChange( update );
 	var height = new UI.Number( parameters.height ).onChange( update );
 
 
-	heightRow.add( new UI.Text( 'Height' ).setWidth( '90px' ) );
+	heightRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/box_geometry/height' ) ).setWidth( '90px' ) );
 	heightRow.add( height );
 	heightRow.add( height );
 
 
 	container.add( heightRow );
 	container.add( heightRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 	var depthRow = new UI.Row();
 	var depthRow = new UI.Row();
 	var depth = new UI.Number( parameters.depth ).onChange( update );
 	var depth = new UI.Number( parameters.depth ).onChange( update );
 
 
-	depthRow.add( new UI.Text( 'Depth' ).setWidth( '90px' ) );
+	depthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/box_geometry/depth' ) ).setWidth( '90px' ) );
 	depthRow.add( depth );
 	depthRow.add( depth );
 
 
 	container.add( depthRow );
 	container.add( depthRow );
@@ -46,7 +48,7 @@ Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 	var widthSegmentsRow = new UI.Row();
 	var widthSegmentsRow = new UI.Row();
 	var widthSegments = new UI.Integer( parameters.widthSegments ).setRange( 1, Infinity ).onChange( update );
 	var widthSegments = new UI.Integer( parameters.widthSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	widthSegmentsRow.add( new UI.Text( 'Width Seg' ).setWidth( '90px' ) );
+	widthSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/box_geometry/widthseg' ) ).setWidth( '90px' ) );
 	widthSegmentsRow.add( widthSegments );
 	widthSegmentsRow.add( widthSegments );
 
 
 	container.add( widthSegmentsRow );
 	container.add( widthSegmentsRow );
@@ -56,7 +58,7 @@ Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 	var heightSegmentsRow = new UI.Row();
 	var heightSegmentsRow = new UI.Row();
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	heightSegmentsRow.add( new UI.Text( 'Height Seg' ).setWidth( '90px' ) );
+	heightSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/box_geometry/heightseg' ) ).setWidth( '90px' ) );
 	heightSegmentsRow.add( heightSegments );
 	heightSegmentsRow.add( heightSegments );
 
 
 	container.add( heightSegmentsRow );
 	container.add( heightSegmentsRow );
@@ -66,7 +68,7 @@ Sidebar.Geometry.BoxGeometry = function ( editor, object ) {
 	var depthSegmentsRow = new UI.Row();
 	var depthSegmentsRow = new UI.Row();
 	var depthSegments = new UI.Integer( parameters.depthSegments ).setRange( 1, Infinity ).onChange( update );
 	var depthSegments = new UI.Integer( parameters.depthSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	depthSegmentsRow.add( new UI.Text( 'Depth Seg' ).setWidth( '90px' ) );
+	depthSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/box_geometry/depthseg' ) ).setWidth( '90px' ) );
 	depthSegmentsRow.add( depthSegments );
 	depthSegmentsRow.add( depthSegments );
 
 
 	container.add( depthSegmentsRow );
 	container.add( depthSegmentsRow );

+ 4 - 2
editor/js/Sidebar.Geometry.BufferGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.BufferGeometry = function ( editor ) {
 Sidebar.Geometry.BufferGeometry = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -20,7 +22,7 @@ Sidebar.Geometry.BufferGeometry = function ( editor ) {
 			container.clear();
 			container.clear();
 			container.setDisplay( 'block' );
 			container.setDisplay( 'block' );
 
 
-			var text = new UI.Text( 'Attributes' ).setWidth( '90px' );
+			var text = new UI.Text( strings.getKey( 'sidebar/geometry/buffer_geometry/attributes' ) ).setWidth( '90px' );
 			container.add( text );
 			container.add( text );
 
 
 			var container2 = new UI.Span().setDisplay( 'inline-block' ).setWidth( '160px' );
 			var container2 = new UI.Span().setDisplay( 'inline-block' ).setWidth( '160px' );
@@ -30,7 +32,7 @@ Sidebar.Geometry.BufferGeometry = function ( editor ) {
 
 
 			if ( index !== null ) {
 			if ( index !== null ) {
 
 
-				container2.add( new UI.Text( 'index' ).setWidth( '80px' ) );
+				container2.add( new UI.Text( strings.getKey( 'sidebar/geometry/buffer_geometry/index' ) ).setWidth( '80px' ) );
 				container2.add( new UI.Text( ( index.count ).format() ).setFontSize( '12px' ) );
 				container2.add( new UI.Text( ( index.count ).format() ).setFontSize( '12px' ) );
 				container2.add( new UI.Break() );
 				container2.add( new UI.Break() );
 
 

+ 6 - 4
editor/js/Sidebar.Geometry.CircleGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.CircleGeometry = function ( editor, object ) {
 Sidebar.Geometry.CircleGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.CircleGeometry = function ( editor, object ) {
 	var radiusRow = new UI.Row();
 	var radiusRow = new UI.Row();
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 
 
-	radiusRow.add( new UI.Text( 'Radius' ).setWidth( '90px' ) );
+	radiusRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/circle_geometry/radius' ) ).setWidth( '90px' ) );
 	radiusRow.add( radius );
 	radiusRow.add( radius );
 
 
 	container.add( radiusRow );
 	container.add( radiusRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.CircleGeometry = function ( editor, object ) {
 	var segmentsRow = new UI.Row();
 	var segmentsRow = new UI.Row();
 	var segments = new UI.Integer( parameters.segments ).setRange( 3, Infinity ).onChange( update );
 	var segments = new UI.Integer( parameters.segments ).setRange( 3, Infinity ).onChange( update );
 
 
-	segmentsRow.add( new UI.Text( 'Segments' ).setWidth( '90px' ) );
+	segmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/circle_geometry/segments' ) ).setWidth( '90px' ) );
 	segmentsRow.add( segments );
 	segmentsRow.add( segments );
 
 
 	container.add( segmentsRow );
 	container.add( segmentsRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.CircleGeometry = function ( editor, object ) {
 	var thetaStartRow = new UI.Row();
 	var thetaStartRow = new UI.Row();
 	var thetaStart = new UI.Number( parameters.thetaStart * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 	var thetaStart = new UI.Number( parameters.thetaStart * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 
 
-	thetaStartRow.add( new UI.Text( 'Theta start' ).setWidth( '90px' ) );
+	thetaStartRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/circle_geometry/thetastart' ) ).setWidth( '90px' ) );
 	thetaStartRow.add( thetaStart );
 	thetaStartRow.add( thetaStart );
 
 
 	container.add( thetaStartRow );
 	container.add( thetaStartRow );
@@ -46,7 +48,7 @@ Sidebar.Geometry.CircleGeometry = function ( editor, object ) {
 	var thetaLengthRow = new UI.Row();
 	var thetaLengthRow = new UI.Row();
 	var thetaLength = new UI.Number( parameters.thetaLength * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 	var thetaLength = new UI.Number( parameters.thetaLength * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 
 
-	thetaLengthRow.add( new UI.Text( 'Theta length' ).setWidth( '90px' ) );
+	thetaLengthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/circle_geometry/thetalength' ) ).setWidth( '90px' ) );
 	thetaLengthRow.add( thetaLength );
 	thetaLengthRow.add( thetaLength );
 
 
 	container.add( thetaLengthRow );
 	container.add( thetaLengthRow );

+ 8 - 6
editor/js/Sidebar.Geometry.CylinderGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 	var radiusTopRow = new UI.Row();
 	var radiusTopRow = new UI.Row();
 	var radiusTop = new UI.Number( parameters.radiusTop ).onChange( update );
 	var radiusTop = new UI.Number( parameters.radiusTop ).onChange( update );
 
 
-	radiusTopRow.add( new UI.Text( 'Radius top' ).setWidth( '90px' ) );
+	radiusTopRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/cylinder_geometry/radiustop' ) ).setWidth( '90px' ) );
 	radiusTopRow.add( radiusTop );
 	radiusTopRow.add( radiusTop );
 
 
 	container.add( radiusTopRow );
 	container.add( radiusTopRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 	var radiusBottomRow = new UI.Row();
 	var radiusBottomRow = new UI.Row();
 	var radiusBottom = new UI.Number( parameters.radiusBottom ).onChange( update );
 	var radiusBottom = new UI.Number( parameters.radiusBottom ).onChange( update );
 
 
-	radiusBottomRow.add( new UI.Text( 'Radius bottom' ).setWidth( '90px' ) );
+	radiusBottomRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/cylinder_geometry/radiusbottom' ) ).setWidth( '90px' ) );
 	radiusBottomRow.add( radiusBottom );
 	radiusBottomRow.add( radiusBottom );
 
 
 	container.add( radiusBottomRow );
 	container.add( radiusBottomRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 	var heightRow = new UI.Row();
 	var heightRow = new UI.Row();
 	var height = new UI.Number( parameters.height ).onChange( update );
 	var height = new UI.Number( parameters.height ).onChange( update );
 
 
-	heightRow.add( new UI.Text( 'Height' ).setWidth( '90px' ) );
+	heightRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/cylinder_geometry/height' ) ).setWidth( '90px' ) );
 	heightRow.add( height );
 	heightRow.add( height );
 
 
 	container.add( heightRow );
 	container.add( heightRow );
@@ -46,7 +48,7 @@ Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 	var radialSegmentsRow = new UI.Row();
 	var radialSegmentsRow = new UI.Row();
 	var radialSegments = new UI.Integer( parameters.radialSegments ).setRange( 1, Infinity ).onChange( update );
 	var radialSegments = new UI.Integer( parameters.radialSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	radialSegmentsRow.add( new UI.Text( 'Radial segments' ).setWidth( '90px' ) );
+	radialSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/cylinder_geometry/radialsegments' ) ).setWidth( '90px' ) );
 	radialSegmentsRow.add( radialSegments );
 	radialSegmentsRow.add( radialSegments );
 
 
 	container.add( radialSegmentsRow );
 	container.add( radialSegmentsRow );
@@ -56,7 +58,7 @@ Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 	var heightSegmentsRow = new UI.Row();
 	var heightSegmentsRow = new UI.Row();
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	heightSegmentsRow.add( new UI.Text( 'Height segments' ).setWidth( '90px' ) );
+	heightSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/cylinder_geometry/heightsegments' ) ).setWidth( '90px' ) );
 	heightSegmentsRow.add( heightSegments );
 	heightSegmentsRow.add( heightSegments );
 
 
 	container.add( heightSegmentsRow );
 	container.add( heightSegmentsRow );
@@ -66,7 +68,7 @@ Sidebar.Geometry.CylinderGeometry = function ( editor, object ) {
 	var openEndedRow = new UI.Row();
 	var openEndedRow = new UI.Row();
 	var openEnded = new UI.Checkbox( parameters.openEnded ).onChange( update );
 	var openEnded = new UI.Checkbox( parameters.openEnded ).onChange( update );
 
 
-	openEndedRow.add( new UI.Text( 'Open ended' ).setWidth( '90px' ) );
+	openEndedRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/cylinder_geometry/openended' ) ).setWidth( '90px' ) );
 	openEndedRow.add( openEnded );
 	openEndedRow.add( openEnded );
 
 
 	container.add( openEndedRow );
 	container.add( openEndedRow );

+ 4 - 2
editor/js/Sidebar.Geometry.Geometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.Geometry = function ( editor ) {
 Sidebar.Geometry.Geometry = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -13,7 +15,7 @@ Sidebar.Geometry.Geometry = function ( editor ) {
 	var verticesRow = new UI.Row();
 	var verticesRow = new UI.Row();
 	var vertices = new UI.Text();
 	var vertices = new UI.Text();
 
 
-	verticesRow.add( new UI.Text( 'Vertices' ).setWidth( '90px' ) );
+	verticesRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/geometry/vertices' ) ).setWidth( '90px' ) );
 	verticesRow.add( vertices );
 	verticesRow.add( vertices );
 
 
 	container.add( verticesRow );
 	container.add( verticesRow );
@@ -23,7 +25,7 @@ Sidebar.Geometry.Geometry = function ( editor ) {
 	var facesRow = new UI.Row();
 	var facesRow = new UI.Row();
 	var faces = new UI.Text();
 	var faces = new UI.Text();
 
 
-	facesRow.add( new UI.Text( 'Faces' ).setWidth( '90px' ) );
+	facesRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/geometry/faces' ) ).setWidth( '90px' ) );
 	facesRow.add( faces );
 	facesRow.add( faces );
 
 
 	container.add( facesRow );
 	container.add( facesRow );

+ 4 - 2
editor/js/Sidebar.Geometry.IcosahedronGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.IcosahedronGeometry = function ( editor, object ) {
 Sidebar.Geometry.IcosahedronGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.IcosahedronGeometry = function ( editor, object ) {
 	var radiusRow = new UI.Row();
 	var radiusRow = new UI.Row();
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 
 
-	radiusRow.add( new UI.Text( 'Radius' ).setWidth( '90px' ) );
+	radiusRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/icosahedron_geometry/radius' ) ).setWidth( '90px' ) );
 	radiusRow.add( radius );
 	radiusRow.add( radius );
 
 
 	container.add( radiusRow );
 	container.add( radiusRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.IcosahedronGeometry = function ( editor, object ) {
 	var detailRow = new UI.Row();
 	var detailRow = new UI.Row();
 	var detail = new UI.Integer( parameters.detail ).setRange( 0, Infinity ).onChange( update );
 	var detail = new UI.Integer( parameters.detail ).setRange( 0, Infinity ).onChange( update );
 
 
-	detailRow.add( new UI.Text( 'Detail' ).setWidth( '90px' ) );
+	detailRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/icosahedron_geometry/detail' ) ).setWidth( '90px' ) );
 	detailRow.add( detail );
 	detailRow.add( detail );
 
 
 	container.add( detailRow );
 	container.add( detailRow );

+ 6 - 4
editor/js/Sidebar.Geometry.LatheGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 	var segmentsRow = new UI.Row();
 	var segmentsRow = new UI.Row();
 	var segments = new UI.Integer( parameters.segments ).onChange( update );
 	var segments = new UI.Integer( parameters.segments ).onChange( update );
 
 
-	segmentsRow.add( new UI.Text( 'Segments' ).setWidth( '90px' ) );
+	segmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/lathe_geometry/segments' ) ).setWidth( '90px' ) );
 	segmentsRow.add( segments );
 	segmentsRow.add( segments );
 
 
 	container.add( segmentsRow );
 	container.add( segmentsRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 	var phiStartRow = new UI.Row();
 	var phiStartRow = new UI.Row();
 	var phiStart = new UI.Number( parameters.phiStart * 180 / Math.PI ).onChange( update );
 	var phiStart = new UI.Number( parameters.phiStart * 180 / Math.PI ).onChange( update );
 
 
-	phiStartRow.add( new UI.Text( 'Phi start (°)' ).setWidth( '90px' ) );
+	phiStartRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/lathe_geometry/phistart' ) ).setWidth( '90px' ) );
 	phiStartRow.add( phiStart );
 	phiStartRow.add( phiStart );
 
 
 	container.add( phiStartRow );
 	container.add( phiStartRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 	var phiLengthRow = new UI.Row();
 	var phiLengthRow = new UI.Row();
 	var phiLength = new UI.Number( parameters.phiLength * 180 / Math.PI ).onChange( update );
 	var phiLength = new UI.Number( parameters.phiLength * 180 / Math.PI ).onChange( update );
 
 
-	phiLengthRow.add( new UI.Text( 'Phi length (°)' ).setWidth( '90px' ) );
+	phiLengthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/lathe_geometry/philength' ) ).setWidth( '90px' ) );
 	phiLengthRow.add( phiLength );
 	phiLengthRow.add( phiLength );
 
 
 	container.add( phiLengthRow );
 	container.add( phiLengthRow );
@@ -47,7 +49,7 @@ Sidebar.Geometry.LatheGeometry = function( editor, object ) {
 	var pointsUI = [];
 	var pointsUI = [];
 
 
 	var pointsRow = new UI.Row();
 	var pointsRow = new UI.Row();
-	pointsRow.add( new UI.Text( 'Points' ).setWidth( '90px' ) );
+	pointsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/lathe_geometry/points' ) ).setWidth( '90px' ) );
 
 
 	var points = new UI.Span().setDisplay( 'inline-block' );
 	var points = new UI.Span().setDisplay( 'inline-block' );
 	pointsRow.add( points );
 	pointsRow.add( points );

+ 6 - 4
editor/js/Sidebar.Geometry.PlaneGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.PlaneGeometry = function ( editor, object ) {
 Sidebar.Geometry.PlaneGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.PlaneGeometry = function ( editor, object ) {
 	var widthRow = new UI.Row();
 	var widthRow = new UI.Row();
 	var width = new UI.Number( parameters.width ).onChange( update );
 	var width = new UI.Number( parameters.width ).onChange( update );
 
 
-	widthRow.add( new UI.Text( 'Width' ).setWidth( '90px' ) );
+	widthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/plane_geometry/width' ) ).setWidth( '90px' ) );
 	widthRow.add( width );
 	widthRow.add( width );
 
 
 	container.add( widthRow );
 	container.add( widthRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.PlaneGeometry = function ( editor, object ) {
 	var heightRow = new UI.Row();
 	var heightRow = new UI.Row();
 	var height = new UI.Number( parameters.height ).onChange( update );
 	var height = new UI.Number( parameters.height ).onChange( update );
 
 
-	heightRow.add( new UI.Text( 'Height' ).setWidth( '90px' ) );
+	heightRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/plane_geometry/height' ) ).setWidth( '90px' ) );
 	heightRow.add( height );
 	heightRow.add( height );
 
 
 	container.add( heightRow );
 	container.add( heightRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.PlaneGeometry = function ( editor, object ) {
 	var widthSegmentsRow = new UI.Row();
 	var widthSegmentsRow = new UI.Row();
 	var widthSegments = new UI.Integer( parameters.widthSegments ).setRange( 1, Infinity ).onChange( update );
 	var widthSegments = new UI.Integer( parameters.widthSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	widthSegmentsRow.add( new UI.Text( 'Width segments' ).setWidth( '90px' ) );
+	widthSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/plane_geometry/widthsegments' ) ).setWidth( '90px' ) );
 	widthSegmentsRow.add( widthSegments );
 	widthSegmentsRow.add( widthSegments );
 
 
 	container.add( widthSegmentsRow );
 	container.add( widthSegmentsRow );
@@ -46,7 +48,7 @@ Sidebar.Geometry.PlaneGeometry = function ( editor, object ) {
 	var heightSegmentsRow = new UI.Row();
 	var heightSegmentsRow = new UI.Row();
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	heightSegmentsRow.add( new UI.Text( 'Height segments' ).setWidth( '90px' ) );
+	heightSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/plane_geometry/heightsegments' ) ).setWidth( '90px' ) );
 	heightSegmentsRow.add( heightSegments );
 	heightSegmentsRow.add( heightSegments );
 
 
 	container.add( heightSegmentsRow );
 	container.add( heightSegmentsRow );

+ 9 - 7
editor/js/Sidebar.Geometry.SphereGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 	var radiusRow = new UI.Row();
 	var radiusRow = new UI.Row();
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 
 
-	radiusRow.add( new UI.Text( 'Radius' ).setWidth( '90px' ) );
+	radiusRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/sphere_geometry/radius' ) ).setWidth( '90px' ) );
 	radiusRow.add( radius );
 	radiusRow.add( radius );
 
 
 	container.add( radiusRow );
 	container.add( radiusRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 	var widthSegmentsRow = new UI.Row();
 	var widthSegmentsRow = new UI.Row();
 	var widthSegments = new UI.Integer( parameters.widthSegments ).setRange( 1, Infinity ).onChange( update );
 	var widthSegments = new UI.Integer( parameters.widthSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	widthSegmentsRow.add( new UI.Text( 'Width segments' ).setWidth( '90px' ) );
+	widthSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/sphere_geometry/widthsegments' ) ).setWidth( '90px' ) );
 	widthSegmentsRow.add( widthSegments );
 	widthSegmentsRow.add( widthSegments );
 
 
 	container.add( widthSegmentsRow );
 	container.add( widthSegmentsRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 	var heightSegmentsRow = new UI.Row();
 	var heightSegmentsRow = new UI.Row();
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 	var heightSegments = new UI.Integer( parameters.heightSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	heightSegmentsRow.add( new UI.Text( 'Height segments' ).setWidth( '90px' ) );
+	heightSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/sphere_geometry/heightsegments' ) ).setWidth( '90px' ) );
 	heightSegmentsRow.add( heightSegments );
 	heightSegmentsRow.add( heightSegments );
 
 
 	container.add( heightSegmentsRow );
 	container.add( heightSegmentsRow );
@@ -46,7 +48,7 @@ Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 	var phiStartRow = new UI.Row();
 	var phiStartRow = new UI.Row();
 	var phiStart = new UI.Number( parameters.phiStart * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 	var phiStart = new UI.Number( parameters.phiStart * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 
 
-	phiStartRow.add( new UI.Text( 'Phi start' ).setWidth( '90px' ) );
+	phiStartRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/sphere_geometry/phistart' ) ).setWidth( '90px' ) );
 	phiStartRow.add( phiStart );
 	phiStartRow.add( phiStart );
 
 
 	container.add( phiStartRow );
 	container.add( phiStartRow );
@@ -56,7 +58,7 @@ Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 	var phiLengthRow = new UI.Row();
 	var phiLengthRow = new UI.Row();
 	var phiLength = new UI.Number( parameters.phiLength * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 	var phiLength = new UI.Number( parameters.phiLength * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 
 
-	phiLengthRow.add( new UI.Text( 'Phi length' ).setWidth( '90px' ) );
+	phiLengthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/sphere_geometry/philength' ) ).setWidth( '90px' ) );
 	phiLengthRow.add( phiLength );
 	phiLengthRow.add( phiLength );
 
 
 	container.add( phiLengthRow );
 	container.add( phiLengthRow );
@@ -66,7 +68,7 @@ Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 	var thetaStartRow = new UI.Row();
 	var thetaStartRow = new UI.Row();
 	var thetaStart = new UI.Number( parameters.thetaStart * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 	var thetaStart = new UI.Number( parameters.thetaStart * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 
 
-	thetaStartRow.add( new UI.Text( 'Theta start' ).setWidth( '90px' ) );
+	thetaStartRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/sphere_geometry/thetastart' ) ).setWidth( '90px' ) );
 	thetaStartRow.add( thetaStart );
 	thetaStartRow.add( thetaStart );
 
 
 	container.add( thetaStartRow );
 	container.add( thetaStartRow );
@@ -76,7 +78,7 @@ Sidebar.Geometry.SphereGeometry = function ( editor, object ) {
 	var thetaLengthRow = new UI.Row();
 	var thetaLengthRow = new UI.Row();
 	var thetaLength = new UI.Number( parameters.thetaLength * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 	var thetaLength = new UI.Number( parameters.thetaLength * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 
 
-	thetaLengthRow.add( new UI.Text( 'Theta length' ).setWidth( '90px' ) );
+	thetaLengthRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/sphere_geometry/thetalength' ) ).setWidth( '90px' ) );
 	thetaLengthRow.add( thetaLength );
 	thetaLengthRow.add( thetaLength );
 
 
 	container.add( thetaLengthRow );
 	container.add( thetaLengthRow );

+ 7 - 5
editor/js/Sidebar.Geometry.TorusGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.TorusGeometry = function ( editor, object ) {
 Sidebar.Geometry.TorusGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.TorusGeometry = function ( editor, object ) {
 	var radiusRow = new UI.Row();
 	var radiusRow = new UI.Row();
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 
 
-	radiusRow.add( new UI.Text( 'Radius' ).setWidth( '90px' ) );
+	radiusRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torus_geometry/radius' ) ).setWidth( '90px' ) );
 	radiusRow.add( radius );
 	radiusRow.add( radius );
 
 
 	container.add( radiusRow );
 	container.add( radiusRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.TorusGeometry = function ( editor, object ) {
 	var tubeRow = new UI.Row();
 	var tubeRow = new UI.Row();
 	var tube = new UI.Number( parameters.tube ).onChange( update );
 	var tube = new UI.Number( parameters.tube ).onChange( update );
 
 
-	tubeRow.add( new UI.Text( 'Tube' ).setWidth( '90px' ) );
+	tubeRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torus_geometry/tube' ) ).setWidth( '90px' ) );
 	tubeRow.add( tube );
 	tubeRow.add( tube );
 
 
 	container.add( tubeRow );
 	container.add( tubeRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.TorusGeometry = function ( editor, object ) {
 	var radialSegmentsRow = new UI.Row();
 	var radialSegmentsRow = new UI.Row();
 	var radialSegments = new UI.Integer( parameters.radialSegments ).setRange( 1, Infinity ).onChange( update );
 	var radialSegments = new UI.Integer( parameters.radialSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	radialSegmentsRow.add( new UI.Text( 'Radial segments' ).setWidth( '90px' ) );
+	radialSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torus_geometry/radialsegments' ) ).setWidth( '90px' ) );
 	radialSegmentsRow.add( radialSegments );
 	radialSegmentsRow.add( radialSegments );
 
 
 	container.add( radialSegmentsRow );
 	container.add( radialSegmentsRow );
@@ -46,7 +48,7 @@ Sidebar.Geometry.TorusGeometry = function ( editor, object ) {
 	var tubularSegmentsRow = new UI.Row();
 	var tubularSegmentsRow = new UI.Row();
 	var tubularSegments = new UI.Integer( parameters.tubularSegments ).setRange( 1, Infinity ).onChange( update );
 	var tubularSegments = new UI.Integer( parameters.tubularSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	tubularSegmentsRow.add( new UI.Text( 'Tubular segments' ).setWidth( '90px' ) );
+	tubularSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torus_geometry/tubularsegments' ) ).setWidth( '90px' ) );
 	tubularSegmentsRow.add( tubularSegments );
 	tubularSegmentsRow.add( tubularSegments );
 
 
 	container.add( tubularSegmentsRow );
 	container.add( tubularSegmentsRow );
@@ -56,7 +58,7 @@ Sidebar.Geometry.TorusGeometry = function ( editor, object ) {
 	var arcRow = new UI.Row();
 	var arcRow = new UI.Row();
 	var arc = new UI.Number( parameters.arc * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 	var arc = new UI.Number( parameters.arc * THREE.Math.RAD2DEG ).setStep( 10 ).onChange( update );
 
 
-	arcRow.add( new UI.Text( 'Arc' ).setWidth( '90px' ) );
+	arcRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torus_geometry/arc' ) ).setWidth( '90px' ) );
 	arcRow.add( arc );
 	arcRow.add( arc );
 
 
 	container.add( arcRow );
 	container.add( arcRow );

+ 8 - 6
editor/js/Sidebar.Geometry.TorusKnotGeometry.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Row();
 	var container = new UI.Row();
@@ -16,7 +18,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 	var radiusRow = new UI.Row();
 	var radiusRow = new UI.Row();
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 	var radius = new UI.Number( parameters.radius ).onChange( update );
 
 
-	radiusRow.add( new UI.Text( 'Radius' ).setWidth( '90px' ) );
+	radiusRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torusKnot_geometry/radius' ) ).setWidth( '90px' ) );
 	radiusRow.add( radius );
 	radiusRow.add( radius );
 
 
 	container.add( radiusRow );
 	container.add( radiusRow );
@@ -26,7 +28,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 	var tubeRow = new UI.Row();
 	var tubeRow = new UI.Row();
 	var tube = new UI.Number( parameters.tube ).onChange( update );
 	var tube = new UI.Number( parameters.tube ).onChange( update );
 
 
-	tubeRow.add( new UI.Text( 'Tube' ).setWidth( '90px' ) );
+	tubeRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torusKnot_geometry/tube' ) ).setWidth( '90px' ) );
 	tubeRow.add( tube );
 	tubeRow.add( tube );
 
 
 	container.add( tubeRow );
 	container.add( tubeRow );
@@ -36,7 +38,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 	var tubularSegmentsRow = new UI.Row();
 	var tubularSegmentsRow = new UI.Row();
 	var tubularSegments = new UI.Integer( parameters.tubularSegments ).setRange( 1, Infinity ).onChange( update );
 	var tubularSegments = new UI.Integer( parameters.tubularSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	tubularSegmentsRow.add( new UI.Text( 'Tubular segments' ).setWidth( '90px' ) );
+	tubularSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torusKnot_geometry/tubularsegments' ) ).setWidth( '90px' ) );
 	tubularSegmentsRow.add( tubularSegments );
 	tubularSegmentsRow.add( tubularSegments );
 
 
 	container.add( tubularSegmentsRow );
 	container.add( tubularSegmentsRow );
@@ -46,7 +48,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 	var radialSegmentsRow = new UI.Row();
 	var radialSegmentsRow = new UI.Row();
 	var radialSegments = new UI.Integer( parameters.radialSegments ).setRange( 1, Infinity ).onChange( update );
 	var radialSegments = new UI.Integer( parameters.radialSegments ).setRange( 1, Infinity ).onChange( update );
 
 
-	radialSegmentsRow.add( new UI.Text( 'Radial segments' ).setWidth( '90px' ) );
+	radialSegmentsRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torusKnot_geometry/radialsegments' ) ).setWidth( '90px' ) );
 	radialSegmentsRow.add( radialSegments );
 	radialSegmentsRow.add( radialSegments );
 
 
 	container.add( radialSegmentsRow );
 	container.add( radialSegmentsRow );
@@ -56,7 +58,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 	var pRow = new UI.Row();
 	var pRow = new UI.Row();
 	var p = new UI.Number( parameters.p ).onChange( update );
 	var p = new UI.Number( parameters.p ).onChange( update );
 
 
-	pRow.add( new UI.Text( 'P' ).setWidth( '90px' ) );
+	pRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torusKnot_geometry/p' ) ).setWidth( '90px' ) );
 	pRow.add( p );
 	pRow.add( p );
 
 
 	container.add( pRow );
 	container.add( pRow );
@@ -66,7 +68,7 @@ Sidebar.Geometry.TorusKnotGeometry = function ( editor, object ) {
 	var qRow = new UI.Row();
 	var qRow = new UI.Row();
 	var q = new UI.Number( parameters.q ).onChange( update );
 	var q = new UI.Number( parameters.q ).onChange( update );
 
 
-	qRow.add( new UI.Text( 'Q' ).setWidth( '90px' ) );
+	qRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/torusKnot_geometry/q' ) ).setWidth( '90px' ) );
 	qRow.add( q );
 	qRow.add( q );
 
 
 	container.add( qRow );
 	container.add( qRow );

+ 8 - 5
editor/js/Sidebar.Geometry.js

@@ -4,10 +4,13 @@
 
 
 Sidebar.Geometry = function ( editor ) {
 Sidebar.Geometry = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Panel();
 	var container = new UI.Panel();
 	container.setBorderTop( '0' );
 	container.setBorderTop( '0' );
+	container.setDisplay( 'none' );
 	container.setPaddingTop( '20px' );
 	container.setPaddingTop( '20px' );
 
 
 	// Actions
 	// Actions
@@ -88,7 +91,7 @@ Sidebar.Geometry = function ( editor ) {
 	var geometryTypeRow = new UI.Row();
 	var geometryTypeRow = new UI.Row();
 	var geometryType = new UI.Text();
 	var geometryType = new UI.Text();
 
 
-	geometryTypeRow.add( new UI.Text( 'Type' ).setWidth( '90px' ) );
+	geometryTypeRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/type' ) ).setWidth( '90px' ) );
 	geometryTypeRow.add( geometryType );
 	geometryTypeRow.add( geometryType );
 
 
 	container.add( geometryTypeRow );
 	container.add( geometryTypeRow );
@@ -97,7 +100,7 @@ Sidebar.Geometry = function ( editor ) {
 
 
 	var geometryUUIDRow = new UI.Row();
 	var geometryUUIDRow = new UI.Row();
 	var geometryUUID = new UI.Input().setWidth( '102px' ).setFontSize( '12px' ).setDisabled( true );
 	var geometryUUID = new UI.Input().setWidth( '102px' ).setFontSize( '12px' ).setDisabled( true );
-	var geometryUUIDRenew = new UI.Button( 'New' ).setMarginLeft( '7px' ).onClick( function () {
+	var geometryUUIDRenew = new UI.Button( strings.getKey( 'sidebar/geometry/new' ) ).setMarginLeft( '7px' ).onClick( function () {
 
 
 		geometryUUID.setValue( THREE.Math.generateUUID() );
 		geometryUUID.setValue( THREE.Math.generateUUID() );
 
 
@@ -105,7 +108,7 @@ Sidebar.Geometry = function ( editor ) {
 
 
 	} );
 	} );
 
 
-	geometryUUIDRow.add( new UI.Text( 'UUID' ).setWidth( '90px' ) );
+	geometryUUIDRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/uuid' ) ).setWidth( '90px' ) );
 	geometryUUIDRow.add( geometryUUID );
 	geometryUUIDRow.add( geometryUUID );
 	geometryUUIDRow.add( geometryUUIDRenew );
 	geometryUUIDRow.add( geometryUUIDRenew );
 
 
@@ -120,7 +123,7 @@ Sidebar.Geometry = function ( editor ) {
 
 
 	} );
 	} );
 
 
-	geometryNameRow.add( new UI.Text( 'Name' ).setWidth( '90px' ) );
+	geometryNameRow.add( new UI.Text( strings.getKey( 'sidebar/geometry/name' ) ).setWidth( '90px' ) );
 	geometryNameRow.add( geometryName );
 	geometryNameRow.add( geometryName );
 
 
 	container.add( geometryNameRow );
 	container.add( geometryNameRow );
@@ -142,7 +145,7 @@ Sidebar.Geometry = function ( editor ) {
 
 
 	var geometryBoundingSphere = new UI.Text();
 	var geometryBoundingSphere = new UI.Text();
 
 
-	container.add( new UI.Text( 'Bounds' ).setWidth( '90px' ) );
+	container.add( new UI.Text( strings.getKey( 'sidebar/geometry/bounds' ) ).setWidth( '90px' ) );
 	container.add( geometryBoundingSphere );
 	container.add( geometryBoundingSphere );
 
 
 	//
 	//

+ 4 - 2
editor/js/Sidebar.History.js

@@ -5,6 +5,8 @@
 
 
 Sidebar.History = function ( editor ) {
 Sidebar.History = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var config = editor.config;
 	var config = editor.config;
@@ -13,11 +15,11 @@ Sidebar.History = function ( editor ) {
 
 
 	var container = new UI.Panel();
 	var container = new UI.Panel();
 
 
-	container.add( new UI.Text( 'HISTORY' ) );
+	container.add( new UI.Text( strings.getKey( 'sidebar/history/history' ) ) );
 
 
 	//
 	//
 
 
-	var persistent = new UI.THREE.Boolean( config.getKey( 'settings/history' ), 'persistent' );
+	var persistent = new UI.THREE.Boolean( config.getKey( 'settings/history' ), strings.getKey( 'sidebar/history/persistent' ) );
 	persistent.setPosition( 'absolute' ).setRight( '8px' );
 	persistent.setPosition( 'absolute' ).setRight( '8px' );
 	persistent.onChange( function () {
 	persistent.onChange( function () {
 
 

+ 55 - 52
editor/js/Sidebar.Material.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Material = function ( editor ) {
 Sidebar.Material = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var currentObject;
 	var currentObject;
@@ -12,6 +14,7 @@ Sidebar.Material = function ( editor ) {
 
 
 	var container = new UI.Panel();
 	var container = new UI.Panel();
 	container.setBorderTop( '0' );
 	container.setBorderTop( '0' );
+	container.setDisplay( 'none' );
 	container.setPaddingTop( '20px' );
 	container.setPaddingTop( '20px' );
 
 
 	// New / Copy / Paste
 	// New / Copy / Paste
@@ -34,7 +37,7 @@ Sidebar.Material = function ( editor ) {
 
 
 	managerRow.add( new UI.Text( '' ).setWidth( '90px' ) );
 	managerRow.add( new UI.Text( '' ).setWidth( '90px' ) );
 
 
-	managerRow.add( new UI.Button( 'New' ).onClick( function () {
+	managerRow.add( new UI.Button( strings.getKey( 'sidebar/material/new' ) ).onClick( function () {
 
 
 		var material = new THREE[ materialClass.getValue() ]();
 		var material = new THREE[ materialClass.getValue() ]();
 		editor.execute( new SetMaterialCommand( currentObject, material, currentMaterialSlot ), 'New Material: ' + materialClass.getValue() );
 		editor.execute( new SetMaterialCommand( currentObject, material, currentMaterialSlot ), 'New Material: ' + materialClass.getValue() );
@@ -42,7 +45,7 @@ Sidebar.Material = function ( editor ) {
 
 
 	} ) );
 	} ) );
 
 
-	managerRow.add( new UI.Button( 'Copy' ).setMarginLeft( '4px' ).onClick( function () {
+	managerRow.add( new UI.Button( strings.getKey( 'sidebar/material/copy' ) ).setMarginLeft( '4px' ).onClick( function () {
 
 
 		copiedMaterial = currentObject.material;
 		copiedMaterial = currentObject.material;
 
 
@@ -56,7 +59,7 @@ Sidebar.Material = function ( editor ) {
 
 
 	} ) );
 	} ) );
 
 
-	managerRow.add( new UI.Button( 'Paste' ).setMarginLeft( '4px' ).onClick( function () {
+	managerRow.add( new UI.Button( strings.getKey( 'sidebar/material/paste' ) ).setMarginLeft( '4px' ).onClick( function () {
 
 
 		if ( copiedMaterial === undefined ) return;
 		if ( copiedMaterial === undefined ) return;
 
 
@@ -88,7 +91,7 @@ Sidebar.Material = function ( editor ) {
 
 
 	} ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
 	} ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
 
 
-	materialClassRow.add( new UI.Text( 'Type' ).setWidth( '90px' ) );
+	materialClassRow.add( new UI.Text( strings.getKey( 'sidebar/material/type' ) ).setWidth( '90px' ) );
 	materialClassRow.add( materialClass );
 	materialClassRow.add( materialClass );
 
 
 	container.add( materialClassRow );
 	container.add( materialClassRow );
@@ -97,14 +100,14 @@ Sidebar.Material = function ( editor ) {
 
 
 	var materialUUIDRow = new UI.Row();
 	var materialUUIDRow = new UI.Row();
 	var materialUUID = new UI.Input().setWidth( '102px' ).setFontSize( '12px' ).setDisabled( true );
 	var materialUUID = new UI.Input().setWidth( '102px' ).setFontSize( '12px' ).setDisabled( true );
-	var materialUUIDRenew = new UI.Button( 'New' ).setMarginLeft( '7px' ).onClick( function () {
+	var materialUUIDRenew = new UI.Button( strings.getKey( 'sidebar/material/new' ) ).setMarginLeft( '7px' ).onClick( function () {
 
 
 		materialUUID.setValue( THREE.Math.generateUUID() );
 		materialUUID.setValue( THREE.Math.generateUUID() );
 		update();
 		update();
 
 
 	} );
 	} );
 
 
-	materialUUIDRow.add( new UI.Text( 'UUID' ).setWidth( '90px' ) );
+	materialUUIDRow.add( new UI.Text( strings.getKey( 'sidebar/material/uuid' ) ).setWidth( '90px' ) );
 	materialUUIDRow.add( materialUUID );
 	materialUUIDRow.add( materialUUID );
 	materialUUIDRow.add( materialUUIDRenew );
 	materialUUIDRow.add( materialUUIDRenew );
 
 
@@ -119,7 +122,7 @@ Sidebar.Material = function ( editor ) {
 
 
 	} );
 	} );
 
 
-	materialNameRow.add( new UI.Text( 'Name' ).setWidth( '90px' ) );
+	materialNameRow.add( new UI.Text( strings.getKey( 'sidebar/material/name' ) ).setWidth( '90px' ) );
 	materialNameRow.add( materialName );
 	materialNameRow.add( materialName );
 
 
 	container.add( materialNameRow );
 	container.add( materialNameRow );
@@ -127,9 +130,9 @@ Sidebar.Material = function ( editor ) {
 	// program
 	// program
 
 
 	var materialProgramRow = new UI.Row();
 	var materialProgramRow = new UI.Row();
-	materialProgramRow.add( new UI.Text( 'Program' ).setWidth( '90px' ) );
+	materialProgramRow.add( new UI.Text( strings.getKey( 'sidebar/material/program' ) ).setWidth( '90px' ) );
 
 
-	var materialProgramInfo = new UI.Button( 'Info' );
+	var materialProgramInfo = new UI.Button( strings.getKey( 'sidebar/material/info' ) );
 	materialProgramInfo.setMarginLeft( '4px' );
 	materialProgramInfo.setMarginLeft( '4px' );
 	materialProgramInfo.onClick( function () {
 	materialProgramInfo.onClick( function () {
 
 
@@ -138,7 +141,7 @@ Sidebar.Material = function ( editor ) {
 	} );
 	} );
 	materialProgramRow.add( materialProgramInfo );
 	materialProgramRow.add( materialProgramInfo );
 
 
-	var materialProgramVertex = new UI.Button( 'Vertex' );
+	var materialProgramVertex = new UI.Button( strings.getKey( 'sidebar/material/vertex' ) );
 	materialProgramVertex.setMarginLeft( '4px' );
 	materialProgramVertex.setMarginLeft( '4px' );
 	materialProgramVertex.onClick( function () {
 	materialProgramVertex.onClick( function () {
 
 
@@ -147,7 +150,7 @@ Sidebar.Material = function ( editor ) {
 	} );
 	} );
 	materialProgramRow.add( materialProgramVertex );
 	materialProgramRow.add( materialProgramVertex );
 
 
-	var materialProgramFragment = new UI.Button( 'Fragment' );
+	var materialProgramFragment = new UI.Button( strings.getKey( 'sidebar/material/fragment' ) );
 	materialProgramFragment.setMarginLeft( '4px' );
 	materialProgramFragment.setMarginLeft( '4px' );
 	materialProgramFragment.onClick( function () {
 	materialProgramFragment.onClick( function () {
 
 
@@ -163,7 +166,7 @@ Sidebar.Material = function ( editor ) {
 	var materialColorRow = new UI.Row();
 	var materialColorRow = new UI.Row();
 	var materialColor = new UI.Color().onChange( update );
 	var materialColor = new UI.Color().onChange( update );
 
 
-	materialColorRow.add( new UI.Text( 'Color' ).setWidth( '90px' ) );
+	materialColorRow.add( new UI.Text( strings.getKey( 'sidebar/material/color' ) ).setWidth( '90px' ) );
 	materialColorRow.add( materialColor );
 	materialColorRow.add( materialColor );
 
 
 	container.add( materialColorRow );
 	container.add( materialColorRow );
@@ -173,7 +176,7 @@ Sidebar.Material = function ( editor ) {
 	var materialRoughnessRow = new UI.Row();
 	var materialRoughnessRow = new UI.Row();
 	var materialRoughness = new UI.Number( 0.5 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 	var materialRoughness = new UI.Number( 0.5 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 
 
-	materialRoughnessRow.add( new UI.Text( 'Roughness' ).setWidth( '90px' ) );
+	materialRoughnessRow.add( new UI.Text( strings.getKey( 'sidebar/material/roughness' ) ).setWidth( '90px' ) );
 	materialRoughnessRow.add( materialRoughness );
 	materialRoughnessRow.add( materialRoughness );
 
 
 	container.add( materialRoughnessRow );
 	container.add( materialRoughnessRow );
@@ -183,7 +186,7 @@ Sidebar.Material = function ( editor ) {
 	var materialMetalnessRow = new UI.Row();
 	var materialMetalnessRow = new UI.Row();
 	var materialMetalness = new UI.Number( 0.5 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 	var materialMetalness = new UI.Number( 0.5 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 
 
-	materialMetalnessRow.add( new UI.Text( 'Metalness' ).setWidth( '90px' ) );
+	materialMetalnessRow.add( new UI.Text( strings.getKey( 'sidebar/material/metalness' ) ).setWidth( '90px' ) );
 	materialMetalnessRow.add( materialMetalness );
 	materialMetalnessRow.add( materialMetalness );
 
 
 	container.add( materialMetalnessRow );
 	container.add( materialMetalnessRow );
@@ -193,7 +196,7 @@ Sidebar.Material = function ( editor ) {
 	var materialEmissiveRow = new UI.Row();
 	var materialEmissiveRow = new UI.Row();
 	var materialEmissive = new UI.Color().setHexValue( 0x000000 ).onChange( update );
 	var materialEmissive = new UI.Color().setHexValue( 0x000000 ).onChange( update );
 
 
-	materialEmissiveRow.add( new UI.Text( 'Emissive' ).setWidth( '90px' ) );
+	materialEmissiveRow.add( new UI.Text( strings.getKey( 'sidebar/material/emissive' ) ).setWidth( '90px' ) );
 	materialEmissiveRow.add( materialEmissive );
 	materialEmissiveRow.add( materialEmissive );
 
 
 	container.add( materialEmissiveRow );
 	container.add( materialEmissiveRow );
@@ -203,7 +206,7 @@ Sidebar.Material = function ( editor ) {
 	var materialSpecularRow = new UI.Row();
 	var materialSpecularRow = new UI.Row();
 	var materialSpecular = new UI.Color().setHexValue( 0x111111 ).onChange( update );
 	var materialSpecular = new UI.Color().setHexValue( 0x111111 ).onChange( update );
 
 
-	materialSpecularRow.add( new UI.Text( 'Specular' ).setWidth( '90px' ) );
+	materialSpecularRow.add( new UI.Text( strings.getKey( 'sidebar/material/specular' ) ).setWidth( '90px' ) );
 	materialSpecularRow.add( materialSpecular );
 	materialSpecularRow.add( materialSpecular );
 
 
 	container.add( materialSpecularRow );
 	container.add( materialSpecularRow );
@@ -213,7 +216,7 @@ Sidebar.Material = function ( editor ) {
 	var materialShininessRow = new UI.Row();
 	var materialShininessRow = new UI.Row();
 	var materialShininess = new UI.Number( 30 ).onChange( update );
 	var materialShininess = new UI.Number( 30 ).onChange( update );
 
 
-	materialShininessRow.add( new UI.Text( 'Shininess' ).setWidth( '90px' ) );
+	materialShininessRow.add( new UI.Text( strings.getKey( 'sidebar/material/shininess' ) ).setWidth( '90px' ) );
 	materialShininessRow.add( materialShininess );
 	materialShininessRow.add( materialShininess );
 
 
 	container.add( materialShininessRow );
 	container.add( materialShininessRow );
@@ -223,7 +226,7 @@ Sidebar.Material = function ( editor ) {
 	var materialClearCoatRow = new UI.Row();
 	var materialClearCoatRow = new UI.Row();
 	var materialClearCoat = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 	var materialClearCoat = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 
 
-	materialClearCoatRow.add( new UI.Text( 'ClearCoat' ).setWidth( '90px' ) );
+	materialClearCoatRow.add( new UI.Text( strings.getKey( 'sidebar/material/clearcoat' ) ).setWidth( '90px' ) );
 	materialClearCoatRow.add( materialClearCoat );
 	materialClearCoatRow.add( materialClearCoat );
 
 
 	container.add( materialClearCoatRow );
 	container.add( materialClearCoatRow );
@@ -233,7 +236,7 @@ Sidebar.Material = function ( editor ) {
 	var materialClearCoatRoughnessRow = new UI.Row();
 	var materialClearCoatRoughnessRow = new UI.Row();
 	var materialClearCoatRoughness = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 	var materialClearCoatRoughness = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 
 
-	materialClearCoatRoughnessRow.add( new UI.Text( 'ClearCoat Roughness' ).setWidth( '90px' ) );
+	materialClearCoatRoughnessRow.add( new UI.Text( strings.getKey( 'sidebar/material/clearcoatroughness' ) ).setWidth( '90px' ) );
 	materialClearCoatRoughnessRow.add( materialClearCoatRoughness );
 	materialClearCoatRoughnessRow.add( materialClearCoatRoughness );
 
 
 	container.add( materialClearCoatRoughnessRow );
 	container.add( materialClearCoatRoughnessRow );
@@ -243,13 +246,13 @@ Sidebar.Material = function ( editor ) {
 	var materialVertexColorsRow = new UI.Row();
 	var materialVertexColorsRow = new UI.Row();
 	var materialVertexColors = new UI.Select().setOptions( {
 	var materialVertexColors = new UI.Select().setOptions( {
 
 
-		0: 'No',
-		1: 'Face',
-		2: 'Vertex'
+		0: strings.getKey( 'sidebar/material/vertexcolors/no' ),
+		1: strings.getKey( 'sidebar/material/vertexcolors/face' ),
+		2: strings.getKey( 'sidebar/material/vertexcolors/vertex' )
 
 
 	} ).onChange( update );
 	} ).onChange( update );
 
 
-	materialVertexColorsRow.add( new UI.Text( 'Vertex Colors' ).setWidth( '90px' ) );
+	materialVertexColorsRow.add( new UI.Text( strings.getKey( 'sidebar/material/vertexcolors' ) ).setWidth( '90px' ) );
 	materialVertexColorsRow.add( materialVertexColors );
 	materialVertexColorsRow.add( materialVertexColors );
 
 
 	container.add( materialVertexColorsRow );
 	container.add( materialVertexColorsRow );
@@ -259,7 +262,7 @@ Sidebar.Material = function ( editor ) {
 	var materialSkinningRow = new UI.Row();
 	var materialSkinningRow = new UI.Row();
 	var materialSkinning = new UI.Checkbox( false ).onChange( update );
 	var materialSkinning = new UI.Checkbox( false ).onChange( update );
 
 
-	materialSkinningRow.add( new UI.Text( 'Skinning' ).setWidth( '90px' ) );
+	materialSkinningRow.add( new UI.Text( strings.getKey( 'sidebar/material/skinning' ) ).setWidth( '90px' ) );
 	materialSkinningRow.add( materialSkinning );
 	materialSkinningRow.add( materialSkinning );
 
 
 	container.add( materialSkinningRow );
 	container.add( materialSkinningRow );
@@ -270,7 +273,7 @@ Sidebar.Material = function ( editor ) {
 	var materialMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialMap = new UI.Texture().onChange( update );
 	var materialMap = new UI.Texture().onChange( update );
 
 
-	materialMapRow.add( new UI.Text( 'Map' ).setWidth( '90px' ) );
+	materialMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/map' ) ).setWidth( '90px' ) );
 	materialMapRow.add( materialMapEnabled );
 	materialMapRow.add( materialMapEnabled );
 	materialMapRow.add( materialMap );
 	materialMapRow.add( materialMap );
 
 
@@ -282,7 +285,7 @@ Sidebar.Material = function ( editor ) {
 	var materialAlphaMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialAlphaMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialAlphaMap = new UI.Texture().onChange( update );
 	var materialAlphaMap = new UI.Texture().onChange( update );
 
 
-	materialAlphaMapRow.add( new UI.Text( 'Alpha Map' ).setWidth( '90px' ) );
+	materialAlphaMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/alphamap' ) ).setWidth( '90px' ) );
 	materialAlphaMapRow.add( materialAlphaMapEnabled );
 	materialAlphaMapRow.add( materialAlphaMapEnabled );
 	materialAlphaMapRow.add( materialAlphaMap );
 	materialAlphaMapRow.add( materialAlphaMap );
 
 
@@ -295,7 +298,7 @@ Sidebar.Material = function ( editor ) {
 	var materialBumpMap = new UI.Texture().onChange( update );
 	var materialBumpMap = new UI.Texture().onChange( update );
 	var materialBumpScale = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
 	var materialBumpScale = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
 
 
-	materialBumpMapRow.add( new UI.Text( 'Bump Map' ).setWidth( '90px' ) );
+	materialBumpMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/bumpmap' ) ).setWidth( '90px' ) );
 	materialBumpMapRow.add( materialBumpMapEnabled );
 	materialBumpMapRow.add( materialBumpMapEnabled );
 	materialBumpMapRow.add( materialBumpMap );
 	materialBumpMapRow.add( materialBumpMap );
 	materialBumpMapRow.add( materialBumpScale );
 	materialBumpMapRow.add( materialBumpScale );
@@ -308,7 +311,7 @@ Sidebar.Material = function ( editor ) {
 	var materialNormalMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialNormalMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialNormalMap = new UI.Texture().onChange( update );
 	var materialNormalMap = new UI.Texture().onChange( update );
 
 
-	materialNormalMapRow.add( new UI.Text( 'Normal Map' ).setWidth( '90px' ) );
+	materialNormalMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/normalmap' ) ).setWidth( '90px' ) );
 	materialNormalMapRow.add( materialNormalMapEnabled );
 	materialNormalMapRow.add( materialNormalMapEnabled );
 	materialNormalMapRow.add( materialNormalMap );
 	materialNormalMapRow.add( materialNormalMap );
 
 
@@ -321,7 +324,7 @@ Sidebar.Material = function ( editor ) {
 	var materialDisplacementMap = new UI.Texture().onChange( update );
 	var materialDisplacementMap = new UI.Texture().onChange( update );
 	var materialDisplacementScale = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
 	var materialDisplacementScale = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
 
 
-	materialDisplacementMapRow.add( new UI.Text( 'Displace Map' ).setWidth( '90px' ) );
+	materialDisplacementMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/displacemap' ) ).setWidth( '90px' ) );
 	materialDisplacementMapRow.add( materialDisplacementMapEnabled );
 	materialDisplacementMapRow.add( materialDisplacementMapEnabled );
 	materialDisplacementMapRow.add( materialDisplacementMap );
 	materialDisplacementMapRow.add( materialDisplacementMap );
 	materialDisplacementMapRow.add( materialDisplacementScale );
 	materialDisplacementMapRow.add( materialDisplacementScale );
@@ -334,7 +337,7 @@ Sidebar.Material = function ( editor ) {
 	var materialRoughnessMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialRoughnessMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialRoughnessMap = new UI.Texture().onChange( update );
 	var materialRoughnessMap = new UI.Texture().onChange( update );
 
 
-	materialRoughnessMapRow.add( new UI.Text( 'Rough. Map' ).setWidth( '90px' ) );
+	materialRoughnessMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/roughmap' ) ).setWidth( '90px' ) );
 	materialRoughnessMapRow.add( materialRoughnessMapEnabled );
 	materialRoughnessMapRow.add( materialRoughnessMapEnabled );
 	materialRoughnessMapRow.add( materialRoughnessMap );
 	materialRoughnessMapRow.add( materialRoughnessMap );
 
 
@@ -346,7 +349,7 @@ Sidebar.Material = function ( editor ) {
 	var materialMetalnessMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialMetalnessMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialMetalnessMap = new UI.Texture().onChange( update );
 	var materialMetalnessMap = new UI.Texture().onChange( update );
 
 
-	materialMetalnessMapRow.add( new UI.Text( 'Metal. Map' ).setWidth( '90px' ) );
+	materialMetalnessMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/metalmap' ) ).setWidth( '90px' ) );
 	materialMetalnessMapRow.add( materialMetalnessMapEnabled );
 	materialMetalnessMapRow.add( materialMetalnessMapEnabled );
 	materialMetalnessMapRow.add( materialMetalnessMap );
 	materialMetalnessMapRow.add( materialMetalnessMap );
 
 
@@ -358,7 +361,7 @@ Sidebar.Material = function ( editor ) {
 	var materialSpecularMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialSpecularMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialSpecularMap = new UI.Texture().onChange( update );
 	var materialSpecularMap = new UI.Texture().onChange( update );
 
 
-	materialSpecularMapRow.add( new UI.Text( 'Specular Map' ).setWidth( '90px' ) );
+	materialSpecularMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/specularmap' ) ).setWidth( '90px' ) );
 	materialSpecularMapRow.add( materialSpecularMapEnabled );
 	materialSpecularMapRow.add( materialSpecularMapEnabled );
 	materialSpecularMapRow.add( materialSpecularMap );
 	materialSpecularMapRow.add( materialSpecularMap );
 
 
@@ -371,7 +374,7 @@ Sidebar.Material = function ( editor ) {
 	var materialEnvMap = new UI.Texture( THREE.SphericalReflectionMapping ).onChange( update );
 	var materialEnvMap = new UI.Texture( THREE.SphericalReflectionMapping ).onChange( update );
 	var materialReflectivity = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
 	var materialReflectivity = new UI.Number( 1 ).setWidth( '30px' ).onChange( update );
 
 
-	materialEnvMapRow.add( new UI.Text( 'Env Map' ).setWidth( '90px' ) );
+	materialEnvMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/envmap' ) ).setWidth( '90px' ) );
 	materialEnvMapRow.add( materialEnvMapEnabled );
 	materialEnvMapRow.add( materialEnvMapEnabled );
 	materialEnvMapRow.add( materialEnvMap );
 	materialEnvMapRow.add( materialEnvMap );
 	materialEnvMapRow.add( materialReflectivity );
 	materialEnvMapRow.add( materialReflectivity );
@@ -384,7 +387,7 @@ Sidebar.Material = function ( editor ) {
 	var materialLightMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialLightMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialLightMap = new UI.Texture().onChange( update );
 	var materialLightMap = new UI.Texture().onChange( update );
 
 
-	materialLightMapRow.add( new UI.Text( 'Light Map' ).setWidth( '90px' ) );
+	materialLightMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/lightmap' ) ).setWidth( '90px' ) );
 	materialLightMapRow.add( materialLightMapEnabled );
 	materialLightMapRow.add( materialLightMapEnabled );
 	materialLightMapRow.add( materialLightMap );
 	materialLightMapRow.add( materialLightMap );
 
 
@@ -397,7 +400,7 @@ Sidebar.Material = function ( editor ) {
 	var materialAOMap = new UI.Texture().onChange( update );
 	var materialAOMap = new UI.Texture().onChange( update );
 	var materialAOScale = new UI.Number( 1 ).setRange( 0, 1 ).setWidth( '30px' ).onChange( update );
 	var materialAOScale = new UI.Number( 1 ).setRange( 0, 1 ).setWidth( '30px' ).onChange( update );
 
 
-	materialAOMapRow.add( new UI.Text( 'AO Map' ).setWidth( '90px' ) );
+	materialAOMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/aomap' ) ).setWidth( '90px' ) );
 	materialAOMapRow.add( materialAOMapEnabled );
 	materialAOMapRow.add( materialAOMapEnabled );
 	materialAOMapRow.add( materialAOMap );
 	materialAOMapRow.add( materialAOMap );
 	materialAOMapRow.add( materialAOScale );
 	materialAOMapRow.add( materialAOScale );
@@ -410,7 +413,7 @@ Sidebar.Material = function ( editor ) {
 	var materialEmissiveMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialEmissiveMapEnabled = new UI.Checkbox( false ).onChange( update );
 	var materialEmissiveMap = new UI.Texture().onChange( update );
 	var materialEmissiveMap = new UI.Texture().onChange( update );
 
 
-	materialEmissiveMapRow.add( new UI.Text( 'Emissive Map' ).setWidth( '90px' ) );
+	materialEmissiveMapRow.add( new UI.Text( strings.getKey( 'sidebar/material/emissivemap' ) ).setWidth( '90px' ) );
 	materialEmissiveMapRow.add( materialEmissiveMapEnabled );
 	materialEmissiveMapRow.add( materialEmissiveMapEnabled );
 	materialEmissiveMapRow.add( materialEmissiveMap );
 	materialEmissiveMapRow.add( materialEmissiveMap );
 
 
@@ -421,13 +424,13 @@ Sidebar.Material = function ( editor ) {
 	var materialSideRow = new UI.Row();
 	var materialSideRow = new UI.Row();
 	var materialSide = new UI.Select().setOptions( {
 	var materialSide = new UI.Select().setOptions( {
 
 
-		0: 'Front',
-		1: 'Back',
-		2: 'Double'
+		0: strings.getKey( 'sidebar/material/side/front' ),
+		1: strings.getKey( 'sidebar/material/side/back' ),
+		2: strings.getKey( 'sidebar/material/side/double' )
 
 
 	} ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
 	} ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
 
 
-	materialSideRow.add( new UI.Text( 'Side' ).setWidth( '90px' ) );
+	materialSideRow.add( new UI.Text( strings.getKey( 'sidebar/material/side' ) ).setWidth( '90px' ) );
 	materialSideRow.add( materialSide );
 	materialSideRow.add( materialSide );
 
 
 	container.add( materialSideRow );
 	container.add( materialSideRow );
@@ -437,7 +440,7 @@ Sidebar.Material = function ( editor ) {
 	var materialShadingRow = new UI.Row();
 	var materialShadingRow = new UI.Row();
 	var materialShading = new UI.Checkbox(false).setLeft( '100px' ).onChange( update );
 	var materialShading = new UI.Checkbox(false).setLeft( '100px' ).onChange( update );
 
 
-	materialShadingRow.add( new UI.Text( 'Flat Shaded' ).setWidth( '90px' ) );
+	materialShadingRow.add( new UI.Text( strings.getKey( 'sidebar/material/flatshaded' ) ).setWidth( '90px' ) );
 	materialShadingRow.add( materialShading );
 	materialShadingRow.add( materialShading );
 
 
 	container.add( materialShadingRow );
 	container.add( materialShadingRow );
@@ -447,16 +450,16 @@ Sidebar.Material = function ( editor ) {
 	var materialBlendingRow = new UI.Row();
 	var materialBlendingRow = new UI.Row();
 	var materialBlending = new UI.Select().setOptions( {
 	var materialBlending = new UI.Select().setOptions( {
 
 
-		0: 'No',
-		1: 'Normal',
-		2: 'Additive',
-		3: 'Subtractive',
-		4: 'Multiply',
-		5: 'Custom'
+		0: strings.getKey( 'sidebar/material/blending/no' ),
+		1: strings.getKey( 'sidebar/material/blending/normal' ),
+		2: strings.getKey( 'sidebar/material/blending/additive' ),
+		3: strings.getKey( 'sidebar/material/blending/subtractive' ),
+		4: strings.getKey( 'sidebar/material/blending/multiply' ),
+		5: strings.getKey( 'sidebar/material/blending/custom' )
 
 
 	} ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
 	} ).setWidth( '150px' ).setFontSize( '12px' ).onChange( update );
 
 
-	materialBlendingRow.add( new UI.Text( 'Blending' ).setWidth( '90px' ) );
+	materialBlendingRow.add( new UI.Text( strings.getKey( 'sidebar/material/blending' ) ).setWidth( '90px' ) );
 	materialBlendingRow.add( materialBlending );
 	materialBlendingRow.add( materialBlending );
 
 
 	container.add( materialBlendingRow );
 	container.add( materialBlendingRow );
@@ -466,7 +469,7 @@ Sidebar.Material = function ( editor ) {
 	var materialOpacityRow = new UI.Row();
 	var materialOpacityRow = new UI.Row();
 	var materialOpacity = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 	var materialOpacity = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 
 
-	materialOpacityRow.add( new UI.Text( 'Opacity' ).setWidth( '90px' ) );
+	materialOpacityRow.add( new UI.Text( strings.getKey( 'sidebar/material/opacity' ) ).setWidth( '90px' ) );
 	materialOpacityRow.add( materialOpacity );
 	materialOpacityRow.add( materialOpacity );
 
 
 	container.add( materialOpacityRow );
 	container.add( materialOpacityRow );
@@ -476,7 +479,7 @@ Sidebar.Material = function ( editor ) {
 	var materialTransparentRow = new UI.Row();
 	var materialTransparentRow = new UI.Row();
 	var materialTransparent = new UI.Checkbox().setLeft( '100px' ).onChange( update );
 	var materialTransparent = new UI.Checkbox().setLeft( '100px' ).onChange( update );
 
 
-	materialTransparentRow.add( new UI.Text( 'Transparent' ).setWidth( '90px' ) );
+	materialTransparentRow.add( new UI.Text( strings.getKey( 'sidebar/material/transparent' ) ).setWidth( '90px' ) );
 	materialTransparentRow.add( materialTransparent );
 	materialTransparentRow.add( materialTransparent );
 
 
 	container.add( materialTransparentRow );
 	container.add( materialTransparentRow );
@@ -486,7 +489,7 @@ Sidebar.Material = function ( editor ) {
 	var materialAlphaTestRow = new UI.Row();
 	var materialAlphaTestRow = new UI.Row();
 	var materialAlphaTest = new UI.Number().setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 	var materialAlphaTest = new UI.Number().setWidth( '60px' ).setRange( 0, 1 ).onChange( update );
 
 
-	materialAlphaTestRow.add( new UI.Text( 'Alpha Test' ).setWidth( '90px' ) );
+	materialAlphaTestRow.add( new UI.Text( strings.getKey( 'sidebar/material/alphatest' ) ).setWidth( '90px' ) );
 	materialAlphaTestRow.add( materialAlphaTest );
 	materialAlphaTestRow.add( materialAlphaTest );
 
 
 	container.add( materialAlphaTestRow );
 	container.add( materialAlphaTestRow );
@@ -497,7 +500,7 @@ Sidebar.Material = function ( editor ) {
 	var materialWireframe = new UI.Checkbox( false ).onChange( update );
 	var materialWireframe = new UI.Checkbox( false ).onChange( update );
 	var materialWireframeLinewidth = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 100 ).onChange( update );
 	var materialWireframeLinewidth = new UI.Number( 1 ).setWidth( '60px' ).setRange( 0, 100 ).onChange( update );
 
 
-	materialWireframeRow.add( new UI.Text( 'Wireframe' ).setWidth( '90px' ) );
+	materialWireframeRow.add( new UI.Text( strings.getKey( 'sidebar/material/wireframe' ) ).setWidth( '90px' ) );
 	materialWireframeRow.add( materialWireframe );
 	materialWireframeRow.add( materialWireframe );
 	materialWireframeRow.add( materialWireframeLinewidth );
 	materialWireframeRow.add( materialWireframeLinewidth );
 
 

+ 26 - 24
editor/js/Sidebar.Object.js

@@ -4,6 +4,8 @@
 
 
 Sidebar.Object = function ( editor ) {
 Sidebar.Object = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Panel();
 	var container = new UI.Panel();
@@ -59,7 +61,7 @@ Sidebar.Object = function ( editor ) {
 	var objectTypeRow = new UI.Row();
 	var objectTypeRow = new UI.Row();
 	var objectType = new UI.Text();
 	var objectType = new UI.Text();
 
 
-	objectTypeRow.add( new UI.Text( 'Type' ).setWidth( '90px' ) );
+	objectTypeRow.add( new UI.Text( strings.getKey( 'sidebar/object/type' ) ).setWidth( '90px' ) );
 	objectTypeRow.add( objectType );
 	objectTypeRow.add( objectType );
 
 
 	container.add( objectTypeRow );
 	container.add( objectTypeRow );
@@ -68,7 +70,7 @@ Sidebar.Object = function ( editor ) {
 
 
 	var objectUUIDRow = new UI.Row();
 	var objectUUIDRow = new UI.Row();
 	var objectUUID = new UI.Input().setWidth( '102px' ).setFontSize( '12px' ).setDisabled( true );
 	var objectUUID = new UI.Input().setWidth( '102px' ).setFontSize( '12px' ).setDisabled( true );
-	var objectUUIDRenew = new UI.Button( 'New' ).setMarginLeft( '7px' ).onClick( function () {
+	var objectUUIDRenew = new UI.Button( strings.getKey( 'sidebar/object/new' ) ).setMarginLeft( '7px' ).onClick( function () {
 
 
 		objectUUID.setValue( THREE.Math.generateUUID() );
 		objectUUID.setValue( THREE.Math.generateUUID() );
 
 
@@ -76,7 +78,7 @@ Sidebar.Object = function ( editor ) {
 
 
 	} );
 	} );
 
 
-	objectUUIDRow.add( new UI.Text( 'UUID' ).setWidth( '90px' ) );
+	objectUUIDRow.add( new UI.Text( strings.getKey( 'sidebar/object/uuid' ) ).setWidth( '90px' ) );
 	objectUUIDRow.add( objectUUID );
 	objectUUIDRow.add( objectUUID );
 	objectUUIDRow.add( objectUUIDRenew );
 	objectUUIDRow.add( objectUUIDRenew );
 
 
@@ -91,7 +93,7 @@ Sidebar.Object = function ( editor ) {
 
 
 	} );
 	} );
 
 
-	objectNameRow.add( new UI.Text( 'Name' ).setWidth( '90px' ) );
+	objectNameRow.add( new UI.Text( strings.getKey( 'sidebar/object/name' ) ).setWidth( '90px' ) );
 	objectNameRow.add( objectName );
 	objectNameRow.add( objectName );
 
 
 	container.add( objectNameRow );
 	container.add( objectNameRow );
@@ -103,7 +105,7 @@ Sidebar.Object = function ( editor ) {
 	var objectPositionY = new UI.Number().setPrecision( 3 ).setWidth( '50px' ).onChange( update );
 	var objectPositionY = new UI.Number().setPrecision( 3 ).setWidth( '50px' ).onChange( update );
 	var objectPositionZ = new UI.Number().setPrecision( 3 ).setWidth( '50px' ).onChange( update );
 	var objectPositionZ = new UI.Number().setPrecision( 3 ).setWidth( '50px' ).onChange( update );
 
 
-	objectPositionRow.add( new UI.Text( 'Position' ).setWidth( '90px' ) );
+	objectPositionRow.add( new UI.Text( strings.getKey( 'sidebar/object/position' ) ).setWidth( '90px' ) );
 	objectPositionRow.add( objectPositionX, objectPositionY, objectPositionZ );
 	objectPositionRow.add( objectPositionX, objectPositionY, objectPositionZ );
 
 
 	container.add( objectPositionRow );
 	container.add( objectPositionRow );
@@ -115,7 +117,7 @@ Sidebar.Object = function ( editor ) {
 	var objectRotationY = new UI.Number().setStep( 10 ).setUnit( '°' ).setWidth( '50px' ).onChange( update );
 	var objectRotationY = new UI.Number().setStep( 10 ).setUnit( '°' ).setWidth( '50px' ).onChange( update );
 	var objectRotationZ = new UI.Number().setStep( 10 ).setUnit( '°' ).setWidth( '50px' ).onChange( update );
 	var objectRotationZ = new UI.Number().setStep( 10 ).setUnit( '°' ).setWidth( '50px' ).onChange( update );
 
 
-	objectRotationRow.add( new UI.Text( 'Rotation' ).setWidth( '90px' ) );
+	objectRotationRow.add( new UI.Text( strings.getKey( 'sidebar/object/rotation' ) ).setWidth( '90px' ) );
 	objectRotationRow.add( objectRotationX, objectRotationY, objectRotationZ );
 	objectRotationRow.add( objectRotationX, objectRotationY, objectRotationZ );
 
 
 	container.add( objectRotationRow );
 	container.add( objectRotationRow );
@@ -128,7 +130,7 @@ Sidebar.Object = function ( editor ) {
 	var objectScaleY = new UI.Number( 1 ).setPrecision( 3 ).setRange( 0.001, Infinity ).setWidth( '50px' ).onChange( updateScaleY );
 	var objectScaleY = new UI.Number( 1 ).setPrecision( 3 ).setRange( 0.001, Infinity ).setWidth( '50px' ).onChange( updateScaleY );
 	var objectScaleZ = new UI.Number( 1 ).setPrecision( 3 ).setRange( 0.001, Infinity ).setWidth( '50px' ).onChange( updateScaleZ );
 	var objectScaleZ = new UI.Number( 1 ).setPrecision( 3 ).setRange( 0.001, Infinity ).setWidth( '50px' ).onChange( updateScaleZ );
 
 
-	objectScaleRow.add( new UI.Text( 'Scale' ).setWidth( '90px' ) );
+	objectScaleRow.add( new UI.Text( strings.getKey( 'sidebar/object/scale' ) ).setWidth( '90px' ) );
 	objectScaleRow.add( objectScaleLock );
 	objectScaleRow.add( objectScaleLock );
 	objectScaleRow.add( objectScaleX, objectScaleY, objectScaleZ );
 	objectScaleRow.add( objectScaleX, objectScaleY, objectScaleZ );
 
 
@@ -139,7 +141,7 @@ Sidebar.Object = function ( editor ) {
 	var objectFovRow = new UI.Row();
 	var objectFovRow = new UI.Row();
 	var objectFov = new UI.Number().onChange( update );
 	var objectFov = new UI.Number().onChange( update );
 
 
-	objectFovRow.add( new UI.Text( 'Fov' ).setWidth( '90px' ) );
+	objectFovRow.add( new UI.Text( strings.getKey( 'sidebar/object/fov' ) ).setWidth( '90px' ) );
 	objectFovRow.add( objectFov );
 	objectFovRow.add( objectFov );
 
 
 	container.add( objectFovRow );
 	container.add( objectFovRow );
@@ -149,7 +151,7 @@ Sidebar.Object = function ( editor ) {
 	var objectNearRow = new UI.Row();
 	var objectNearRow = new UI.Row();
 	var objectNear = new UI.Number().onChange( update );
 	var objectNear = new UI.Number().onChange( update );
 
 
-	objectNearRow.add( new UI.Text( 'Near' ).setWidth( '90px' ) );
+	objectNearRow.add( new UI.Text( strings.getKey( 'sidebar/object/near' ) ).setWidth( '90px' ) );
 	objectNearRow.add( objectNear );
 	objectNearRow.add( objectNear );
 
 
 	container.add( objectNearRow );
 	container.add( objectNearRow );
@@ -159,7 +161,7 @@ Sidebar.Object = function ( editor ) {
 	var objectFarRow = new UI.Row();
 	var objectFarRow = new UI.Row();
 	var objectFar = new UI.Number().onChange( update );
 	var objectFar = new UI.Number().onChange( update );
 
 
-	objectFarRow.add( new UI.Text( 'Far' ).setWidth( '90px' ) );
+	objectFarRow.add( new UI.Text( strings.getKey( 'sidebar/object/far' ) ).setWidth( '90px' ) );
 	objectFarRow.add( objectFar );
 	objectFarRow.add( objectFar );
 
 
 	container.add( objectFarRow );
 	container.add( objectFarRow );
@@ -169,7 +171,7 @@ Sidebar.Object = function ( editor ) {
 	var objectIntensityRow = new UI.Row();
 	var objectIntensityRow = new UI.Row();
 	var objectIntensity = new UI.Number().setRange( 0, Infinity ).onChange( update );
 	var objectIntensity = new UI.Number().setRange( 0, Infinity ).onChange( update );
 
 
-	objectIntensityRow.add( new UI.Text( 'Intensity' ).setWidth( '90px' ) );
+	objectIntensityRow.add( new UI.Text( strings.getKey( 'sidebar/object/intensity' ) ).setWidth( '90px' ) );
 	objectIntensityRow.add( objectIntensity );
 	objectIntensityRow.add( objectIntensity );
 
 
 	container.add( objectIntensityRow );
 	container.add( objectIntensityRow );
@@ -179,7 +181,7 @@ Sidebar.Object = function ( editor ) {
 	var objectColorRow = new UI.Row();
 	var objectColorRow = new UI.Row();
 	var objectColor = new UI.Color().onChange( update );
 	var objectColor = new UI.Color().onChange( update );
 
 
-	objectColorRow.add( new UI.Text( 'Color' ).setWidth( '90px' ) );
+	objectColorRow.add( new UI.Text( strings.getKey( 'sidebar/object/color' ) ).setWidth( '90px' ) );
 	objectColorRow.add( objectColor );
 	objectColorRow.add( objectColor );
 
 
 	container.add( objectColorRow );
 	container.add( objectColorRow );
@@ -189,7 +191,7 @@ Sidebar.Object = function ( editor ) {
 	var objectGroundColorRow = new UI.Row();
 	var objectGroundColorRow = new UI.Row();
 	var objectGroundColor = new UI.Color().onChange( update );
 	var objectGroundColor = new UI.Color().onChange( update );
 
 
-	objectGroundColorRow.add( new UI.Text( 'Ground color' ).setWidth( '90px' ) );
+	objectGroundColorRow.add( new UI.Text( strings.getKey( 'sidebar/object/groundcolor' ) ).setWidth( '90px' ) );
 	objectGroundColorRow.add( objectGroundColor );
 	objectGroundColorRow.add( objectGroundColor );
 
 
 	container.add( objectGroundColorRow );
 	container.add( objectGroundColorRow );
@@ -199,7 +201,7 @@ Sidebar.Object = function ( editor ) {
 	var objectDistanceRow = new UI.Row();
 	var objectDistanceRow = new UI.Row();
 	var objectDistance = new UI.Number().setRange( 0, Infinity ).onChange( update );
 	var objectDistance = new UI.Number().setRange( 0, Infinity ).onChange( update );
 
 
-	objectDistanceRow.add( new UI.Text( 'Distance' ).setWidth( '90px' ) );
+	objectDistanceRow.add( new UI.Text( strings.getKey( 'sidebar/object/distance' ) ).setWidth( '90px' ) );
 	objectDistanceRow.add( objectDistance );
 	objectDistanceRow.add( objectDistance );
 
 
 	container.add( objectDistanceRow );
 	container.add( objectDistanceRow );
@@ -209,7 +211,7 @@ Sidebar.Object = function ( editor ) {
 	var objectAngleRow = new UI.Row();
 	var objectAngleRow = new UI.Row();
 	var objectAngle = new UI.Number().setPrecision( 3 ).setRange( 0, Math.PI / 2 ).onChange( update );
 	var objectAngle = new UI.Number().setPrecision( 3 ).setRange( 0, Math.PI / 2 ).onChange( update );
 
 
-	objectAngleRow.add( new UI.Text( 'Angle' ).setWidth( '90px' ) );
+	objectAngleRow.add( new UI.Text( strings.getKey( 'sidebar/object/angle' ) ).setWidth( '90px' ) );
 	objectAngleRow.add( objectAngle );
 	objectAngleRow.add( objectAngle );
 
 
 	container.add( objectAngleRow );
 	container.add( objectAngleRow );
@@ -219,7 +221,7 @@ Sidebar.Object = function ( editor ) {
 	var objectPenumbraRow = new UI.Row();
 	var objectPenumbraRow = new UI.Row();
 	var objectPenumbra = new UI.Number().setRange( 0, 1 ).onChange( update );
 	var objectPenumbra = new UI.Number().setRange( 0, 1 ).onChange( update );
 
 
-	objectPenumbraRow.add( new UI.Text( 'Penumbra' ).setWidth( '90px' ) );
+	objectPenumbraRow.add( new UI.Text( strings.getKey( 'sidebar/object/penumbra' ) ).setWidth( '90px' ) );
 	objectPenumbraRow.add( objectPenumbra );
 	objectPenumbraRow.add( objectPenumbra );
 
 
 	container.add( objectPenumbraRow );
 	container.add( objectPenumbraRow );
@@ -229,7 +231,7 @@ Sidebar.Object = function ( editor ) {
 	var objectDecayRow = new UI.Row();
 	var objectDecayRow = new UI.Row();
 	var objectDecay = new UI.Number().setRange( 0, Infinity ).onChange( update );
 	var objectDecay = new UI.Number().setRange( 0, Infinity ).onChange( update );
 
 
-	objectDecayRow.add( new UI.Text( 'Decay' ).setWidth( '90px' ) );
+	objectDecayRow.add( new UI.Text( strings.getKey( 'sidebar/object/decay' ) ).setWidth( '90px' ) );
 	objectDecayRow.add( objectDecay );
 	objectDecayRow.add( objectDecay );
 
 
 	container.add( objectDecayRow );
 	container.add( objectDecayRow );
@@ -238,12 +240,12 @@ Sidebar.Object = function ( editor ) {
 
 
 	var objectShadowRow = new UI.Row();
 	var objectShadowRow = new UI.Row();
 
 
-	objectShadowRow.add( new UI.Text( 'Shadow' ).setWidth( '90px' ) );
+	objectShadowRow.add( new UI.Text( strings.getKey( 'sidebar/object/shadow' ) ).setWidth( '90px' ) );
 
 
-	var objectCastShadow = new UI.THREE.Boolean( false, 'cast' ).onChange( update );
+	var objectCastShadow = new UI.THREE.Boolean( false, strings.getKey( 'sidebar/object/cast' ) ).onChange( update );
 	objectShadowRow.add( objectCastShadow );
 	objectShadowRow.add( objectCastShadow );
 
 
-	var objectReceiveShadow = new UI.THREE.Boolean( false, 'receive' ).onChange( update );
+	var objectReceiveShadow = new UI.THREE.Boolean( false, strings.getKey( 'sidebar/object/receive' ) ).onChange( update );
 	objectShadowRow.add( objectReceiveShadow );
 	objectShadowRow.add( objectReceiveShadow );
 
 
 	var objectShadowRadius = new UI.Number( 1 ).onChange( update );
 	var objectShadowRadius = new UI.Number( 1 ).onChange( update );
@@ -256,7 +258,7 @@ Sidebar.Object = function ( editor ) {
 	var objectVisibleRow = new UI.Row();
 	var objectVisibleRow = new UI.Row();
 	var objectVisible = new UI.Checkbox().onChange( update );
 	var objectVisible = new UI.Checkbox().onChange( update );
 
 
-	objectVisibleRow.add( new UI.Text( 'Visible' ).setWidth( '90px' ) );
+	objectVisibleRow.add( new UI.Text( strings.getKey( 'sidebar/object/visible' ) ).setWidth( '90px' ) );
 	objectVisibleRow.add( objectVisible );
 	objectVisibleRow.add( objectVisible );
 
 
 	container.add( objectVisibleRow );
 	container.add( objectVisibleRow );
@@ -266,7 +268,7 @@ Sidebar.Object = function ( editor ) {
 	var objectFrustumCulledRow = new UI.Row();
 	var objectFrustumCulledRow = new UI.Row();
 	var objectFrustumCulled = new UI.Checkbox().onChange( update );
 	var objectFrustumCulled = new UI.Checkbox().onChange( update );
 
 
-	objectFrustumCulledRow.add( new UI.Text( 'Frustum Cull' ).setWidth( '90px' ) );
+	objectFrustumCulledRow.add( new UI.Text( strings.getKey( 'sidebar/object/frustumcull' ) ).setWidth( '90px' ) );
 	objectFrustumCulledRow.add( objectFrustumCulled );
 	objectFrustumCulledRow.add( objectFrustumCulled );
 
 
 	container.add( objectFrustumCulledRow );
 	container.add( objectFrustumCulledRow );
@@ -276,7 +278,7 @@ Sidebar.Object = function ( editor ) {
 	var objectRenderOrderRow = new UI.Row();
 	var objectRenderOrderRow = new UI.Row();
 	var objectRenderOrder = new UI.Integer().setWidth( '50px' ).onChange( update );
 	var objectRenderOrder = new UI.Integer().setWidth( '50px' ).onChange( update );
 
 
-	objectRenderOrderRow.add( new UI.Text( 'Render Order' ).setWidth( '90px' ) );
+	objectRenderOrderRow.add( new UI.Text( strings.getKey( 'sidebar/object/renderorder' ) ).setWidth( '90px' ) );
 	objectRenderOrderRow.add( objectRenderOrder );
 	objectRenderOrderRow.add( objectRenderOrder );
 
 
 	container.add( objectRenderOrderRow );
 	container.add( objectRenderOrderRow );
@@ -305,7 +307,7 @@ Sidebar.Object = function ( editor ) {
 
 
 	} );
 	} );
 
 
-	objectUserDataRow.add( new UI.Text( 'User data' ).setWidth( '90px' ) );
+	objectUserDataRow.add( new UI.Text( strings.getKey( 'sidebar/object/userdata' ) ).setWidth( '90px' ) );
 	objectUserDataRow.add( objectUserData );
 	objectUserDataRow.add( objectUserData );
 
 
 	container.add( objectUserDataRow );
 	container.add( objectUserDataRow );

+ 4 - 4
editor/js/Sidebar.Project.js

@@ -101,7 +101,7 @@ Sidebar.Project = function ( editor ) {
 
 
 	var rendererPropertiesRow = new UI.Row().setMarginLeft( '90px' );
 	var rendererPropertiesRow = new UI.Row().setMarginLeft( '90px' );
 
 
-	var rendererAntialias = new UI.THREE.Boolean( config.getKey( 'project/renderer/antialias' ), 'antialias' ).onChange( function () {
+	var rendererAntialias = new UI.THREE.Boolean( config.getKey( 'project/renderer/antialias' ), strings.getKey( 'sidebar/project/antialias' ) ).onChange( function () {
 
 
 		config.setKey( 'project/renderer/antialias', this.getValue() );
 		config.setKey( 'project/renderer/antialias', this.getValue() );
 		updateRenderer();
 		updateRenderer();
@@ -111,7 +111,7 @@ Sidebar.Project = function ( editor ) {
 
 
 	// Renderer / Shadows
 	// Renderer / Shadows
 
 
-	var rendererShadows = new UI.THREE.Boolean( config.getKey( 'project/renderer/shadows' ), 'shadows' ).onChange( function () {
+	var rendererShadows = new UI.THREE.Boolean( config.getKey( 'project/renderer/shadows' ), strings.getKey( 'sidebar/project/shadows' ) ).onChange( function () {
 
 
 		config.setKey( 'project/renderer/shadows', this.getValue() );
 		config.setKey( 'project/renderer/shadows', this.getValue() );
 		updateRenderer();
 		updateRenderer();
@@ -123,7 +123,7 @@ Sidebar.Project = function ( editor ) {
 
 
 	// Renderer / Gamma input
 	// Renderer / Gamma input
 
 
-	var rendererGammaInput = new UI.THREE.Boolean( config.getKey( 'project/renderer/gammaInput' ), 'γ input' ).onChange( function () {
+	var rendererGammaInput = new UI.THREE.Boolean( config.getKey( 'project/renderer/gammaInput' ), strings.getKey( 'sidebar/project/gammainput' ) ).onChange( function () {
 
 
 		config.setKey( 'project/renderer/gammaInput', this.getValue() );
 		config.setKey( 'project/renderer/gammaInput', this.getValue() );
 		updateRenderer();
 		updateRenderer();
@@ -133,7 +133,7 @@ Sidebar.Project = function ( editor ) {
 
 
 	// Renderer / Gamma output
 	// Renderer / Gamma output
 
 
-	var rendererGammaOutput = new UI.THREE.Boolean( config.getKey( 'project/renderer/gammaOutput' ), 'γ output' ).onChange( function () {
+	var rendererGammaOutput = new UI.THREE.Boolean( config.getKey( 'project/renderer/gammaOutput' ), strings.getKey( 'sidebar/project/gammaoutput' ) ).onChange( function () {
 
 
 		config.setKey( 'project/renderer/gammaOutput', this.getValue() );
 		config.setKey( 'project/renderer/gammaOutput', this.getValue() );
 		updateRenderer();
 		updateRenderer();

+ 7 - 5
editor/js/Sidebar.Script.js

@@ -4,12 +4,14 @@
 
 
 Sidebar.Script = function ( editor ) {
 Sidebar.Script = function ( editor ) {
 
 
+	var strings = editor.strings;
+
 	var signals = editor.signals;
 	var signals = editor.signals;
 
 
 	var container = new UI.Panel();
 	var container = new UI.Panel();
 	container.setDisplay( 'none' );
 	container.setDisplay( 'none' );
 
 
-	container.add( new UI.Text( 'Script' ).setTextTransform( 'uppercase' ) );
+	container.add( new UI.Text( strings.getKey( 'sidebar/script' ) ).setTextTransform( 'uppercase' ) );
 	container.add( new UI.Break() );
 	container.add( new UI.Break() );
 	container.add( new UI.Break() );
 	container.add( new UI.Break() );
 
 
@@ -18,7 +20,7 @@ Sidebar.Script = function ( editor ) {
 	var scriptsContainer = new UI.Row();
 	var scriptsContainer = new UI.Row();
 	container.add( scriptsContainer );
 	container.add( scriptsContainer );
 
 
-	var newScript = new UI.Button( 'New' );
+	var newScript = new UI.Button( strings.getKey( 'sidebar/script/new' ) );
 	newScript.onClick( function () {
 	newScript.onClick( function () {
 
 
 		var script = { name: '', source: 'function update( event ) {}' };
 		var script = { name: '', source: 'function update( event ) {}' };
@@ -50,7 +52,7 @@ Sidebar.Script = function ( editor ) {
 
 
 		var scripts = editor.scripts[ object.uuid ];
 		var scripts = editor.scripts[ object.uuid ];
 
 
-		if ( scripts !== undefined ) {
+		if ( scripts !== undefined && scripts.length > 0 ) {
 
 
 			scriptsContainer.setDisplay( 'block' );
 			scriptsContainer.setDisplay( 'block' );
 
 
@@ -66,7 +68,7 @@ Sidebar.Script = function ( editor ) {
 					} );
 					} );
 					scriptsContainer.add( name );
 					scriptsContainer.add( name );
 
 
-					var edit = new UI.Button( 'Edit' );
+					var edit = new UI.Button( strings.getKey( 'sidebar/script/edit' ) );
 					edit.setMarginLeft( '4px' );
 					edit.setMarginLeft( '4px' );
 					edit.onClick( function () {
 					edit.onClick( function () {
 
 
@@ -75,7 +77,7 @@ Sidebar.Script = function ( editor ) {
 					} );
 					} );
 					scriptsContainer.add( edit );
 					scriptsContainer.add( edit );
 
 
-					var remove = new UI.Button( 'Remove' );
+					var remove = new UI.Button( strings.getKey( 'sidebar/script/remove' ) );
 					remove.setMarginLeft( '4px' );
 					remove.setMarginLeft( '4px' );
 					remove.onClick( function () {
 					remove.onClick( function () {
 
 

+ 2 - 2
editor/js/Sidebar.Settings.js

@@ -46,8 +46,8 @@ Sidebar.Settings = function ( editor ) {
 	// theme
 	// theme
 
 
 	var options = {
 	var options = {
-		'css/light.css': 'light',
-		'css/dark.css': 'dark'
+		'css/light.css': strings.getKey( 'sidebar/settings/theme/light' ),
+		'css/dark.css': strings.getKey( 'sidebar/settings/theme/dark' )
 	};
 	};
 
 
 	var themeRow = new UI.Row();
 	var themeRow = new UI.Row();

+ 322 - 0
editor/js/Strings.js

@@ -51,7 +51,11 @@ var Strings = function ( config ) {
 			'menubar/add/ambientlight': 'AmbientLight',
 			'menubar/add/ambientlight': 'AmbientLight',
 			'menubar/add/perspectivecamera': 'PerspectiveCamera',
 			'menubar/add/perspectivecamera': 'PerspectiveCamera',
 
 
+			'menubar/status/autosave': 'autosave',
+
 			'menubar/play': 'Play',
 			'menubar/play': 'Play',
+			'menubar/play/stop': 'Stop',
+			'menubar/play/play': 'Play',
 
 
 			'menubar/examples': 'Examples',
 			'menubar/examples': 'Examples',
 
 
@@ -68,15 +72,168 @@ var Strings = function ( config ) {
 			'sidebar/properties/material': 'Material',
 			'sidebar/properties/material': 'Material',
 			'sidebar/properties/script': 'Script',
 			'sidebar/properties/script': 'Script',
 
 
+			'sidebar/object/type': 'Type',
+			'sidebar/object/new': 'New',
+			'sidebar/object/uuid': 'UUID',
+			'sidebar/object/name': 'Name',
+			'sidebar/object/position': 'Position',
+			'sidebar/object/rotation': 'Rotation',
+			'sidebar/object/scale': 'Scale',
+			'sidebar/object/fov': 'Fov',
+			'sidebar/object/near': 'Near',
+			'sidebar/object/far': 'Far',
+			'sidebar/object/intensity': 'Intensity',
+			'sidebar/object/color': 'Color',
+			'sidebar/object/groundcolor': 'Ground Color',
+			'sidebar/object/distance': 'Distance',
+			'sidebar/object/angle': 'Angle',
+			'sidebar/object/penumbra': 'Penumbra',
+			'sidebar/object/decay': 'Decay',
+			'sidebar/object/shadow': 'Shadow',
+			'sidebar/object/cast': 'cast',
+			'sidebar/object/receive': 'receive',
+			'sidebar/object/visible': 'Visible',
+			'sidebar/object/frustumcull': 'Frustum Cull',
+			'sidebar/object/renderorder': 'Render Order',
+			'sidebar/object/userdata': 'User data',
+
+			'sidebar/geometry/type': 'Type',
+			'sidebar/geometry/new': 'New',
+			'sidebar/geometry/uuid': 'UUID',
+			'sidebar/geometry/name': 'Name',
+			'sidebar/geometry/bounds': 'Bounds',
+
+			'sidebar/geometry/box_geometry/width': 'Width',
+			'sidebar/geometry/box_geometry/height': 'Height',
+			'sidebar/geometry/box_geometry/depth': 'Depth',
+			'sidebar/geometry/box_geometry/widthseg': 'Width Seg',
+			'sidebar/geometry/box_geometry/heightseg': 'Height Seg',
+			'sidebar/geometry/box_geometry/depthseg': 'Depth Seg',
+
+			'sidebar/geometry/buffer_geometry/attributes': 'Attributes',
+			'sidebar/geometry/buffer_geometry/index': 'index',
+
+			'sidebar/geometry/circle_geometry/radius': 'Radius',
+			'sidebar/geometry/circle_geometry/segments': 'Segments',
+			'sidebar/geometry/circle_geometry/thetastart': 'Theta start',
+			'sidebar/geometry/circle_geometry/thetalength': 'Theta length',
+
+			'sidebar/geometry/cylinder_geometry/radiustop': 'Radius top',
+			'sidebar/geometry/cylinder_geometry/radiusbottom': 'Radius bottom',
+			'sidebar/geometry/cylinder_geometry/height': 'Height',
+			'sidebar/geometry/cylinder_geometry/radialsegments': 'Radial segments',
+			'sidebar/geometry/cylinder_geometry/heightsegments': 'Height segments',
+			'sidebar/geometry/cylinder_geometry/openended': 'Open ended',
+
+			'sidebar/geometry/geometry/vertices': 'Vertices',
+			'sidebar/geometry/geometry/faces': 'Faces',
+
+			'sidebar/geometry/icosahedron_geometry/radius': 'Radius',
+			'sidebar/geometry/icosahedron_geometry/detail': 'Detail',
+
+			'sidebar/geometry/lathe_geometry/segments': 'Segments',
+			'sidebar/geometry/lathe_geometry/phistart': 'Phi start (°)',
+			'sidebar/geometry/lathe_geometry/philength': 'Phi length (°)',
+			'sidebar/geometry/lathe_geometry/points': 'Points',
+
+			'sidebar/geometry/plane_geometry/width': 'Width',
+			'sidebar/geometry/plane_geometry/height': 'Height',
+			'sidebar/geometry/plane_geometry/widthsegments': 'Width segments',
+			'sidebar/geometry/plane_geometry/heightsegments': 'Height segments',
+
+			'sidebar/geometry/sphere_geometry/radius': 'Radius',
+			'sidebar/geometry/sphere_geometry/widthsegments': 'Width segments',
+			'sidebar/geometry/sphere_geometry/heightsegments': 'Height segments',
+			'sidebar/geometry/sphere_geometry/phistart': 'Phi start',
+			'sidebar/geometry/sphere_geometry/philength': 'Phi length',
+			'sidebar/geometry/sphere_geometry/thetastart': 'Theta start',
+			'sidebar/geometry/sphere_geometry/thetalength': 'Theta length',
+
+			'sidebar/geometry/torus_geometry/radius': 'Radius',
+			'sidebar/geometry/torus_geometry/tube': 'Tube',
+			'sidebar/geometry/torus_geometry/radialsegments': 'Radial segments',
+			'sidebar/geometry/torus_geometry/tubularsegments': 'Tubular segments',
+			'sidebar/geometry/torus_geometry/arc': 'Arc',
+
+			'sidebar/geometry/torusKnot_geometry/radius': 'Radius',
+			'sidebar/geometry/torusKnot_geometry/tube': 'Tube',
+			'sidebar/geometry/torusKnot_geometry/tubularsegments': 'Tubular segments',
+			'sidebar/geometry/torusKnot_geometry/radialsegments': 'Radial segments',
+			'sidebar/geometry/torusKnot_geometry/p': 'P',
+			'sidebar/geometry/torusKnot_geometry/q': 'Q',
+
+			'sidebar/material/new': 'New',
+			'sidebar/material/copy': 'Copy',
+			'sidebar/material/paste': 'Paste',
+			'sidebar/material/type': 'Type',
+			'sidebar/material/uuid': 'UUID',
+			'sidebar/material/name': 'Name',
+			'sidebar/material/program': 'Program',
+			'sidebar/material/info': 'Info',
+			'sidebar/material/vertex': 'Vertex',
+			'sidebar/material/fragment': 'fragment',
+			'sidebar/material/color': 'Color',
+			'sidebar/material/roughness': 'Roughness',
+			'sidebar/material/metalness': 'Metalness',
+			'sidebar/material/emissive': 'Emissive',
+			'sidebar/material/specular': 'Specular',
+			'sidebar/material/shininess': 'Shininess',
+			'sidebar/material/clearcoat': 'ClearCoat',
+			'sidebar/material/clearcoatroughness': 'ClearCoat Roughness',
+			'sidebar/material/vertexcolors': 'Vertex Colors',
+			'sidebar/material/vertexcolors/no': 'No',
+			'sidebar/material/vertexcolors/face': 'Face',
+			'sidebar/material/vertexcolors/vertex': 'Vertex',
+			'sidebar/material/skinning': 'Skinning',
+			'sidebar/material/map': 'Map',
+			'sidebar/material/alphamap': 'Alpha Map',
+			'sidebar/material/bumpmap': 'Bump Map',
+			'sidebar/material/normalmap': 'Normal Map',
+			'sidebar/material/displacemap': 'Displace Map',
+			'sidebar/material/roughmap': 'Rough. Map',
+			'sidebar/material/metalmap': 'Metal. Map',
+			'sidebar/material/specularmap': 'Specular Map',
+			'sidebar/material/envmap': 'Env Map',
+			'sidebar/material/lightmap': 'Light Map',
+			'sidebar/material/aomap': 'AO Map',
+			'sidebar/material/emissivemap': 'Emissive Map',
+			'sidebar/material/side': 'Side',
+			'sidebar/material/side/front': 'Front',
+			'sidebar/material/side/back': 'Back',
+			'sidebar/material/side/double': 'Double',
+			'sidebar/material/flatshaded': 'Flat Shaded',
+			'sidebar/material/blending': 'Blending',
+			'sidebar/material/blending/no': 'No',
+			'sidebar/material/blending/normal': 'Normal',
+			'sidebar/material/blending/additive': 'Additive',
+			'sidebar/material/blending/subtractive': 'Subtractive',
+			'sidebar/material/blending/multiply': 'Multiply',
+			'sidebar/material/blending/custom': 'Custom',
+			'sidebar/material/opacity': 'Opacity',
+			'sidebar/material/transparent': 'Transparent',
+			'sidebar/material/alphatest': 'Alpha Test',
+			'sidebar/material/wireframe': 'Wireframe',
+
+			'sidebar/script': 'Script',
+			'sidebar/script/new': 'New',
+			'sidebar/script/edit': 'Edit',
+			'sidebar/script/remove': 'Remove',
+
 			'sidebar/project': 'Project',
 			'sidebar/project': 'Project',
 			'sidebar/project/title': 'Title',
 			'sidebar/project/title': 'Title',
 			'sidebar/project/editable': 'Editable',
 			'sidebar/project/editable': 'Editable',
 			'sidebar/project/vr': 'VR',
 			'sidebar/project/vr': 'VR',
 			'sidebar/project/renderer': 'Renderer',
 			'sidebar/project/renderer': 'Renderer',
+			'sidebar/project/antialias': 'antialias',
+			'sidebar/project/shadows': 'shadows',
+			'sidebar/project/gammainput': 'γ input',
+			'sidebar/project/gammaoutput': 'γ output',
 
 
 			'sidebar/settings': 'Settings',
 			'sidebar/settings': 'Settings',
 			'sidebar/settings/language': 'Language',
 			'sidebar/settings/language': 'Language',
 			'sidebar/settings/theme': 'Theme',
 			'sidebar/settings/theme': 'Theme',
+			'sidebar/settings/theme/light': 'light',
+			'sidebar/settings/theme/dark': 'dark',
 
 
 			'sidebar/settings/shortcuts/translate': 'Translate',
 			'sidebar/settings/shortcuts/translate': 'Translate',
 			'sidebar/settings/shortcuts/rotate': 'Rotate',
 			'sidebar/settings/shortcuts/rotate': 'Rotate',
@@ -86,6 +243,9 @@ var Strings = function ( config ) {
 
 
 			'sidebar/settings/viewport/grid': 'Grid',
 			'sidebar/settings/viewport/grid': 'Grid',
 
 
+			'sidebar/history/history': 'HISTORY',
+			'sidebar/history/persistent': 'persistent',
+
 			'toolbar/translate': 'Translate',
 			'toolbar/translate': 'Translate',
 			'toolbar/rotate': 'Rotate',
 			'toolbar/rotate': 'Rotate',
 			'toolbar/scale': 'Scale',
 			'toolbar/scale': 'Scale',
@@ -140,7 +300,11 @@ var Strings = function ( config ) {
 			'menubar/add/ambientlight': '环境光',
 			'menubar/add/ambientlight': '环境光',
 			'menubar/add/perspectivecamera': '透视相机',
 			'menubar/add/perspectivecamera': '透视相机',
 
 
+			'menubar/status/autosave': '自动保存',
+
 			'menubar/play': '启动',
 			'menubar/play': '启动',
+			'menubar/play/stop': '暂停',
+			'menubar/play/play': '启动',
 
 
 			'menubar/examples': '示例',
 			'menubar/examples': '示例',
 
 
@@ -157,22 +321,180 @@ var Strings = function ( config ) {
 			'sidebar/properties/material': '材质组件',
 			'sidebar/properties/material': '材质组件',
 			'sidebar/properties/script': '脚本',
 			'sidebar/properties/script': '脚本',
 
 
+			'sidebar/object/type': '类型',
+			'sidebar/object/new': '更新',
+			'sidebar/object/uuid': '识别码',
+			'sidebar/object/name': '名称',
+			'sidebar/object/position': '位置',
+			'sidebar/object/rotation': '旋转',
+			'sidebar/object/scale': '缩放',
+			'sidebar/object/fov': '视角',
+			'sidebar/object/near': '近点',
+			'sidebar/object/far': '远点',
+			'sidebar/object/intensity': '强度',
+			'sidebar/object/color': '颜色',
+			'sidebar/object/groundcolor': '基色',
+			'sidebar/object/distance': '距离',
+			'sidebar/object/angle': '角度',
+			'sidebar/object/penumbra': '边缘',
+			'sidebar/object/decay': '衰减',
+			'sidebar/object/shadow': '阴影',
+			'sidebar/object/cast': '产生',
+			'sidebar/object/receive': '接受',
+			'sidebar/object/visible': '可见性',
+			'sidebar/object/frustumcull': '视锥体裁剪',
+			'sidebar/object/renderorder': '渲染次序',
+			'sidebar/object/userdata': '自定义数据',
+
+			'sidebar/geometry/type': '类型',
+			'sidebar/geometry/new': '更新',
+			'sidebar/geometry/uuid': '识别码',
+			'sidebar/geometry/name': '名称',
+			'sidebar/geometry/bounds': '界限',
+
+			'sidebar/geometry/box_geometry/width': '宽度',
+			'sidebar/geometry/box_geometry/height': '高度',
+			'sidebar/geometry/box_geometry/depth': '深度',
+			'sidebar/geometry/box_geometry/widthseg': '宽度分段',
+			'sidebar/geometry/box_geometry/heightseg': '高度分段',
+			'sidebar/geometry/box_geometry/depthseg': '深度分段',
+
+			'sidebar/geometry/buffer_geometry/attributes': '属性',
+			'sidebar/geometry/buffer_geometry/index': '索引',
+
+			'sidebar/geometry/circle_geometry/radius': '半径',
+			'sidebar/geometry/circle_geometry/segments': '分段',
+			'sidebar/geometry/circle_geometry/thetastart': '弧度起点',
+			'sidebar/geometry/circle_geometry/thetalength': '弧度长度',
+
+			'sidebar/geometry/cylinder_geometry/radiustop': '顶部半径',
+			'sidebar/geometry/cylinder_geometry/radiusbottom': '底部半径',
+			'sidebar/geometry/cylinder_geometry/height': '高度',
+			'sidebar/geometry/cylinder_geometry/radialsegments': '径向分段',
+			'sidebar/geometry/cylinder_geometry/heightsegments': '高度分段',
+			'sidebar/geometry/cylinder_geometry/openended': '开端',
+
+			'sidebar/geometry/geometry/vertices': '顶点',
+			'sidebar/geometry/geometry/faces': '面',
+
+			'sidebar/geometry/icosahedron_geometry/radius': '半径',
+			'sidebar/geometry/icosahedron_geometry/detail': '面片分段',
+
+			'sidebar/geometry/lathe_geometry/segments': '分段',
+			'sidebar/geometry/lathe_geometry/phistart': '经度起点',
+			'sidebar/geometry/lathe_geometry/philength': '经度长度',
+			'sidebar/geometry/lathe_geometry/points': '点',
+
+			'sidebar/geometry/plane_geometry/width': '宽度',
+			'sidebar/geometry/plane_geometry/height': '长度',
+			'sidebar/geometry/plane_geometry/widthsegments': '宽度分段',
+			'sidebar/geometry/plane_geometry/heightsegments': '长度分段',
+
+			'sidebar/geometry/sphere_geometry/radius': '半径',
+			'sidebar/geometry/sphere_geometry/widthsegments': '宽度分段',
+			'sidebar/geometry/sphere_geometry/heightsegments': '长度分段',
+			'sidebar/geometry/sphere_geometry/phistart': '经度起点',
+			'sidebar/geometry/sphere_geometry/philength': '经度长度',
+			'sidebar/geometry/sphere_geometry/thetastart': '纬度起点',
+			'sidebar/geometry/sphere_geometry/thetalength': '纬度长度',
+
+			'sidebar/geometry/torus_geometry/radius': '半径',
+			'sidebar/geometry/torus_geometry/tube': '管厚',
+			'sidebar/geometry/torus_geometry/radialsegments': '半径分段',
+			'sidebar/geometry/torus_geometry/tubularsegments': '管厚分段',
+			'sidebar/geometry/torus_geometry/arc': '弧度',
+
+			'sidebar/geometry/torusKnot_geometry/radius': '半径',
+			'sidebar/geometry/torusKnot_geometry/tube': '管厚',
+			'sidebar/geometry/torusKnot_geometry/tubularsegments': '管厚分段',
+			'sidebar/geometry/torusKnot_geometry/radialsegments': '半径分段',
+			'sidebar/geometry/torusKnot_geometry/p': '管长弧度',
+			'sidebar/geometry/torusKnot_geometry/q': '扭曲弧度',
+
+			'sidebar/material/new': '更新',
+			'sidebar/material/copy': '复制',
+			'sidebar/material/paste': '粘贴',
+			'sidebar/material/type': '类型',
+			'sidebar/material/uuid': '识别码',
+			'sidebar/material/name': '名称',
+			'sidebar/material/program': '程序',
+			'sidebar/material/info': '信息',
+			'sidebar/material/vertex': '顶点',
+			'sidebar/material/fragment': '片元',
+			'sidebar/material/color': '颜色',
+			'sidebar/material/roughness': '粗糙度',
+			'sidebar/material/metalness': '金属度',
+			'sidebar/material/emissive': '自发光',
+			'sidebar/material/specular': '高光',
+			'sidebar/material/shininess': '高光大小',
+			'sidebar/material/clearcoat': '透明贴图',
+			'sidebar/material/clearcoatroughness': '透明贴图粗糙度',
+			'sidebar/material/vertexcolors': '顶点颜色',
+			'sidebar/material/vertexcolors/no': '无',
+			'sidebar/material/vertexcolors/face': '面',
+			'sidebar/material/vertexcolors/vertex': '顶点',
+			'sidebar/material/skinning': '皮肤',
+			'sidebar/material/map': '贴图',
+			'sidebar/material/alphamap': '透明贴图',
+			'sidebar/material/bumpmap': '凹凸贴图',
+			'sidebar/material/normalmap': '法线贴图',
+			'sidebar/material/displacemap': '置换贴图',
+			'sidebar/material/roughmap': '粗糙贴图',
+			'sidebar/material/metalmap': '金属贴图',
+			'sidebar/material/specularmap': '高光贴图',
+			'sidebar/material/envmap': '环境贴图',
+			'sidebar/material/lightmap': '光照贴图',
+			'sidebar/material/aomap': '环境光遮蔽贴图',
+			'sidebar/material/emissivemap': '自发光贴图',
+			'sidebar/material/side': '面',
+			'sidebar/material/side/front': '正面',
+			'sidebar/material/side/back': '背面',
+			'sidebar/material/side/double': '双面',
+			'sidebar/material/flatshaded': '平面着色',
+			'sidebar/material/blending': '混合',
+			'sidebar/material/blending/no': '无',
+			'sidebar/material/blending/normal': '正常混合',
+			'sidebar/material/blending/additive': '和混合',
+			'sidebar/material/blending/subtractive': '差混合',
+			'sidebar/material/blending/multiply': '积混合',
+			'sidebar/material/blending/custom': '自定义混合',
+			'sidebar/material/opacity': '透明度',
+			'sidebar/material/transparent': '透明性',
+			'sidebar/material/alphatest': 'α测试',
+			'sidebar/material/wireframe': '线框',
+
+			'sidebar/script': '脚本',
+			'sidebar/script/new': '新建',
+			'sidebar/script/edit': '编辑',
+			'sidebar/script/remove': '删除',
+
 			'sidebar/project': '项目',
 			'sidebar/project': '项目',
 			'sidebar/project/title': '标题',
 			'sidebar/project/title': '标题',
 			'sidebar/project/editable': '编辑性',
 			'sidebar/project/editable': '编辑性',
 			'sidebar/project/vr': '虚拟现实',
 			'sidebar/project/vr': '虚拟现实',
 			'sidebar/project/renderer': '渲染器',
 			'sidebar/project/renderer': '渲染器',
+			'sidebar/project/antialias': '抗锯齿',
+			'sidebar/project/shadows': '阴影',
+			'sidebar/project/gammainput': 'γ输入',
+			'sidebar/project/gammaoutput': 'γ输出',
 
 
 			'sidebar/settings': '设置',
 			'sidebar/settings': '设置',
 			'sidebar/settings/language': '语言',
 			'sidebar/settings/language': '语言',
 			'sidebar/settings/theme': '主题',
 			'sidebar/settings/theme': '主题',
+			'sidebar/settings/theme/light': '浅色',
+			'sidebar/settings/theme/dark': '深色',
+
 			'sidebar/settings/shortcuts/translate': '移动',
 			'sidebar/settings/shortcuts/translate': '移动',
 			'sidebar/settings/shortcuts/rotate': '旋转',
 			'sidebar/settings/shortcuts/rotate': '旋转',
 			'sidebar/settings/shortcuts/scale': '缩放',
 			'sidebar/settings/shortcuts/scale': '缩放',
 			'sidebar/settings/shortcuts/undo': '撤销',
 			'sidebar/settings/shortcuts/undo': '撤销',
 			'sidebar/settings/shortcuts/focus': '聚焦',
 			'sidebar/settings/shortcuts/focus': '聚焦',
+
 			'sidebar/settings/viewport/grid': '网格',
 			'sidebar/settings/viewport/grid': '网格',
 
 
+			'sidebar/history/history': '历史记录',
+			'sidebar/history/persistent': '本地存储',
+
 			'toolbar/translate': '移动',
 			'toolbar/translate': '移动',
 			'toolbar/rotate': '旋转',
 			'toolbar/rotate': '旋转',
 			'toolbar/scale': '缩放',
 			'toolbar/scale': '缩放',

+ 1 - 3
examples/files.js

@@ -189,7 +189,6 @@ var files = {
 		"webgl_modifier_tessellation",
 		"webgl_modifier_tessellation",
 		"webgl_morphtargets",
 		"webgl_morphtargets",
 		"webgl_morphtargets_horse",
 		"webgl_morphtargets_horse",
-		"webgl_morphtargets_human",
 		"webgl_morphtargets_sphere",
 		"webgl_morphtargets_sphere",
 		"webgl_multiple_canvases_circle",
 		"webgl_multiple_canvases_circle",
 		"webgl_multiple_canvases_complex",
 		"webgl_multiple_canvases_complex",
@@ -289,6 +288,7 @@ var files = {
 		"webgl_buffergeometry_instancing_lambert",
 		"webgl_buffergeometry_instancing_lambert",
 		"webgl_buffergeometry_lines",
 		"webgl_buffergeometry_lines",
 		"webgl_buffergeometry_lines_indexed",
 		"webgl_buffergeometry_lines_indexed",
+		"webgl_buffergeometry_morphtargets",
 		"webgl_buffergeometry_points",
 		"webgl_buffergeometry_points",
 		"webgl_buffergeometry_points_interleaved",
 		"webgl_buffergeometry_points_interleaved",
 		"webgl_buffergeometry_rawshader",
 		"webgl_buffergeometry_rawshader",
@@ -354,9 +354,7 @@ var files = {
 		"misc_exporter_obj",
 		"misc_exporter_obj",
 		"misc_exporter_stl",
 		"misc_exporter_stl",
 		"misc_fps",
 		"misc_fps",
-		"misc_lights_test",
 		"misc_lookat",
 		"misc_lookat",
-		"misc_ubiquity_test2",
 		"misc_uv_tests"
 		"misc_uv_tests"
 	],
 	],
 	"css3d": [
 	"css3d": [

+ 0 - 141
examples/js/UCSCharacter.js

@@ -1,141 +0,0 @@
-THREE.UCSCharacter = function () {
-
-	var scope = this;
-
-	var mesh;
-
-	this.scale = 1;
-
-	this.root = new THREE.Object3D();
-
-	this.numSkins = undefined;
-	this.numMorphs = undefined;
-
-	this.skins = [];
-	this.materials = [];
-	this.morphs = [];
-
-	this.mixer = new THREE.AnimationMixer( this.root );
-
-	this.onLoadComplete = function () {};
-
-	this.loadCounter = 0;
-
-	this.loadParts = function ( config ) {
-
-		this.numSkins = config.skins.length;
-		this.numMorphs = config.morphs.length;
-
-		// Character geometry + number of skins
-		this.loadCounter = 1 + config.skins.length;
-
-		// SKINS
-		this.skins = loadTextures( config.baseUrl + "skins/", config.skins );
-		this.materials = createMaterials( this.skins );
-
-		// MORPHS
-		this.morphs = config.morphs;
-
-		// CHARACTER
-		var loader = new THREE.JSONLoader();
-		console.log( config.baseUrl + config.character );
-		loader.load( config.baseUrl + config.character, function ( geometry ) {
-
-			geometry.computeBoundingBox();
-			geometry.computeVertexNormals();
-
-			mesh = new THREE.SkinnedMesh( geometry, [] );
-			mesh.name = config.character;
-			scope.root.add( mesh );
-
-			var bb = geometry.boundingBox;
-			scope.root.scale.set( config.s, config.s, config.s );
-			scope.root.position.set( config.x, config.y - bb.min.y * config.s, config.z );
-
-			mesh.castShadow = true;
-			mesh.receiveShadow = true;
-
-			scope.mixer.clipAction( geometry.animations[ 0 ], mesh ).play();
-
-			scope.setSkin( 0 );
-
-			scope.checkLoadComplete();
-
-		} );
-
-	};
-
-	this.setSkin = function ( index ) {
-
-		if ( mesh && scope.materials ) {
-
-			mesh.material = scope.materials[ index ];
-
-		}
-
-	};
-
-	this.updateMorphs = function ( influences ) {
-
-		if ( mesh ) {
-
-			for ( var i = 0; i < scope.numMorphs; i ++ ) {
-
-				mesh.morphTargetInfluences[ i ] = influences[ scope.morphs[ i ] ] / 100;
-
-			}
-
-		}
-
-	};
-
-	function loadTextures( baseUrl, textureUrls ) {
-
-		var textureLoader = new THREE.TextureLoader();
-		var textures = [];
-
-		for ( var i = 0; i < textureUrls.length; i ++ ) {
-
-			textures[ i ] = textureLoader.load( baseUrl + textureUrls[ i ], scope.checkLoadComplete );
-			textures[ i ].mapping = THREE.UVMapping;
-			textures[ i ].name = textureUrls[ i ];
-
-		}
-
-		return textures;
-
-	}
-
-	function createMaterials( skins ) {
-
-		var materials = [];
-
-		for ( var i = 0; i < skins.length; i ++ ) {
-
-			materials[ i ] = new THREE.MeshLambertMaterial( {
-				color: 0xeeeeee,
-				specular: 10.0,
-				map: skins[ i ],
-				skinning: true,
-				morphTargets: true
-			} );
-
-		}
-
-		return materials;
-
-	}
-
-	this.checkLoadComplete = function () {
-
-		scope.loadCounter -= 1;
-
-		if ( scope.loadCounter === 0 ) {
-
-			scope.onLoadComplete();
-
-		}
-
-	};
-
-};

+ 2 - 2
examples/js/controls/MapControls.js

@@ -11,7 +11,7 @@
 // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default).
 // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default).
 // This is very similar to OrbitControls, another set of touch behavior
 // This is very similar to OrbitControls, another set of touch behavior
 //
 //
-//    Orbit - right mouse, or left mouse + ctrl/metaKey / touch: two-finger rotate
+//    Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate
 //    Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish
 //    Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish
 //    Pan - left mouse, or arrow keys / touch: one-finger move
 //    Pan - left mouse, or arrow keys / touch: one-finger move
 
 
@@ -777,7 +777,7 @@ THREE.MapControls = function ( object, domElement ) {
 
 
 			case scope.mouseButtons.LEFT:
 			case scope.mouseButtons.LEFT:
 
 
-				if ( event.ctrlKey || event.metaKey ) {
+				if ( event.ctrlKey || event.metaKey || event.shiftKey ) {
 
 
 					if ( scope.enableRotate === false ) return;
 					if ( scope.enableRotate === false ) return;
 
 

+ 2 - 2
examples/js/controls/OrbitControls.js

@@ -11,7 +11,7 @@
 //
 //
 //    Orbit - left mouse / touch: one-finger move
 //    Orbit - left mouse / touch: one-finger move
 //    Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish
 //    Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish
-//    Pan - right mouse, or left mouse + ctrl/metaKey, or arrow keys / touch: two-finger move
+//    Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move
 
 
 THREE.OrbitControls = function ( object, domElement ) {
 THREE.OrbitControls = function ( object, domElement ) {
 
 
@@ -679,7 +679,7 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 
 			case scope.mouseButtons.LEFT:
 			case scope.mouseButtons.LEFT:
 
 
-				if ( event.ctrlKey || event.metaKey ) {
+				if ( event.ctrlKey || event.metaKey || event.shiftKey ) {
 
 
 					if ( scope.enablePan === false ) return;
 					if ( scope.enablePan === false ) return;
 
 

+ 8 - 7
examples/js/geometries/hilbert2D.js

@@ -15,17 +15,18 @@
  * @param v2         Corner index +X, +Z.
  * @param v2         Corner index +X, +Z.
  * @param v3         Corner index +X, -Z.
  * @param v3         Corner index +X, -Z.
  */
  */
+
 function hilbert2D( center, size, iterations, v0, v1, v2, v3 ) {
 function hilbert2D( center, size, iterations, v0, v1, v2, v3 ) {
 
 
 	// Default Vars
 	// Default Vars
-	var center = undefined !== center ? center : new THREE.Vector3( 0, 0, 0 ),
-		size = undefined !== size ? size : 10,
+	var center = center !== undefined ? center : new THREE.Vector3( 0, 0, 0 ),
+		size = size !== undefined ? size : 10,
 		half = size / 2,
 		half = size / 2,
-		iterations = undefined !== iterations ? iterations : 1,
-		v0 = undefined !== v0 ? v0 : 0,
-		v1 = undefined !== v1 ? v1 : 1,
-		v2 = undefined !== v2 ? v2 : 2,
-		v3 = undefined !== v3 ? v3 : 3
+		iterations = iterations !== undefined ? iterations : 1,
+		v0 = v0 !== undefined ? v0 : 0,
+		v1 = v1 !== undefined ? v1 : 1,
+		v2 = v2 !== undefined ? v2 : 2,
+		v3 = v3 !== undefined ? v3 : 3
 	;
 	;
 
 
 	var vec_s = [
 	var vec_s = [

+ 12 - 16
examples/js/geometries/hilbert3D.js

@@ -7,11 +7,6 @@
  * @author Thomas Diewald
  * @author Thomas Diewald
  * @link http://www.openprocessing.org/visuals/?visualID=15599
  * @link http://www.openprocessing.org/visuals/?visualID=15599
  *
  *
- * Based on `examples/canvas_lines_colors.html`:
- * @author OpenShift guest
- * @link https://github.com/mrdoob/three.js/blob/8413a860aa95ed29c79cbb7f857c97d7880d260f/examples/canvas_lines_colors.html
- * @see  Line 149 - 186
- *
  * @param center     Center of Hilbert curve.
  * @param center     Center of Hilbert curve.
  * @param size       Total width of Hilbert curve.
  * @param size       Total width of Hilbert curve.
  * @param iterations Number of subdivisions.
  * @param iterations Number of subdivisions.
@@ -24,21 +19,22 @@
  * @param v6         Corner index +X, +Y, +Z.
  * @param v6         Corner index +X, +Y, +Z.
  * @param v7         Corner index +X, +Y, -Z.
  * @param v7         Corner index +X, +Y, -Z.
  */
  */
+
 function hilbert3D( center, size, iterations, v0, v1, v2, v3, v4, v5, v6, v7 ) {
 function hilbert3D( center, size, iterations, v0, v1, v2, v3, v4, v5, v6, v7 ) {
 
 
 	// Default Vars
 	// Default Vars
-	var center = undefined !== center ? center : new THREE.Vector3( 0, 0, 0 ),
-		size = undefined !== size ? size : 10,
+	var center = center !== undefined ? center : new THREE.Vector3( 0, 0, 0 ),
+		size = size !== undefined ? size : 10,
 		half = size / 2,
 		half = size / 2,
-		iterations = undefined !== iterations ? iterations : 1,
-		v0 = undefined !== v0 ? v0 : 0,
-		v1 = undefined !== v1 ? v1 : 1,
-		v2 = undefined !== v2 ? v2 : 2,
-		v3 = undefined !== v3 ? v3 : 3,
-		v4 = undefined !== v4 ? v4 : 4,
-		v5 = undefined !== v5 ? v5 : 5,
-		v6 = undefined !== v6 ? v6 : 6,
-		v7 = undefined !== v7 ? v7 : 7
+		iterations = iterations !== undefined ? iterations : 1,
+		v0 = v0 !== undefined ? v0 : 0,
+		v1 = v1 !== undefined ? v1 : 1,
+		v2 = v2 !== undefined ? v2 : 2,
+		v3 = v3 !== undefined ? v3 : 3,
+		v4 = v4 !== undefined ? v4 : 4,
+		v5 = v5 !== undefined ? v5 : 5,
+		v6 = v6 !== undefined ? v6 : 6,
+		v7 = v7 !== undefined ? v7 : 7
 	;
 	;
 
 
 	var vec_s = [
 	var vec_s = [

+ 36 - 27
examples/js/loaders/DRACOLoader.js

@@ -84,18 +84,19 @@ THREE.DRACOLoader.prototype = {
     },
     },
 
 
     /**
     /**
-     * |attributeUniqueIdMap| specifies attribute unique id for an attribute in
-     * the geometry to be decoded. The name of the attribute must be one of the
-     * supported attribute type in Three.JS, including:
-     *     'position',
-     *     'color',
-     *     'normal',
-     *     'uv',
-     *     'uv2',
-     *     'skinIndex',
-     *     'skinWeight'.
-     * The format is:
-     *     attributeUniqueIdMap[attributeName] = attributeId
+     * Decompresses a Draco buffer. Names of attributes (for ID and type maps)
+     * must be one of the supported three.js types, including: position, color,
+     * normal, uv, uv2, skinIndex, skinWeight.
+     *
+     * @param {ArrayBuffer} rawBuffer
+     * @param {Function} callback
+     * @param {Object|undefined} attributeUniqueIdMap Provides a pre-defined ID
+     *     for each attribute in the geometry to be decoded. If given,
+     *     `attributeTypeMap` is required and `nativeAttributeMap` will be
+     *     ignored.
+     * @param {Object|undefined} attributeTypeMap Provides a predefined data
+     *     type (as a typed array constructor) for each attribute in the
+     *     geometry to be decoded.
      */
      */
     decodeDracoFile: function(rawBuffer, callback, attributeUniqueIdMap,
     decodeDracoFile: function(rawBuffer, callback, attributeUniqueIdMap,
                               attributeTypeMap) {
                               attributeTypeMap) {
@@ -103,7 +104,7 @@ THREE.DRACOLoader.prototype = {
       THREE.DRACOLoader.getDecoderModule()
       THREE.DRACOLoader.getDecoderModule()
           .then( function ( module ) {
           .then( function ( module ) {
             scope.decodeDracoFileInternal( rawBuffer, module.decoder, callback,
             scope.decodeDracoFileInternal( rawBuffer, module.decoder, callback,
-              attributeUniqueIdMap || {}, attributeTypeMap || {});
+              attributeUniqueIdMap, attributeTypeMap);
           });
           });
     },
     },
 
 
@@ -231,6 +232,7 @@ THREE.DRACOLoader.prototype = {
     convertDracoGeometryTo3JS: function(dracoDecoder, decoder, geometryType,
     convertDracoGeometryTo3JS: function(dracoDecoder, decoder, geometryType,
                                         buffer, attributeUniqueIdMap,
                                         buffer, attributeUniqueIdMap,
                                         attributeTypeMap) {
                                         attributeTypeMap) {
+        // TODO: Should not assume native Draco attribute IDs apply.
         if (this.getAttributeOptions('position').skipDequantization === true) {
         if (this.getAttributeOptions('position').skipDequantization === true) {
           decoder.SkipAttributeTransform(dracoDecoder.POSITION);
           decoder.SkipAttributeTransform(dracoDecoder.POSITION);
         }
         }
@@ -278,6 +280,7 @@ THREE.DRACOLoader.prototype = {
         }
         }
 
 
         // Verify if there is position attribute.
         // Verify if there is position attribute.
+        // TODO: Should not assume native Draco attribute IDs apply.
         var posAttId = decoder.GetAttributeId(dracoGeometry,
         var posAttId = decoder.GetAttributeId(dracoGeometry,
                                               dracoDecoder.POSITION);
                                               dracoDecoder.POSITION);
         if (posAttId == -1) {
         if (posAttId == -1) {
@@ -294,11 +297,23 @@ THREE.DRACOLoader.prototype = {
         // Import data to Three JS geometry.
         // Import data to Three JS geometry.
         var geometry = new THREE.BufferGeometry();
         var geometry = new THREE.BufferGeometry();
 
 
-        // Add native Draco attribute type to geometry.
-        for (var attributeName in this.nativeAttributeMap) {
-          // The native attribute type is only used when no unique Id is
-          // provided. For example, loading .drc files.
-          if (attributeUniqueIdMap[attributeName] === undefined) {
+        // Do not use both the native attribute map and a provided (e.g. glTF) map.
+        if ( attributeUniqueIdMap ) {
+
+          // Add attributes of user specified unique id. E.g. GLTF models.
+          for (var attributeName in attributeUniqueIdMap) {
+            var attributeType = attributeTypeMap[attributeName];
+            var attributeId = attributeUniqueIdMap[attributeName];
+            var attribute = decoder.GetAttributeByUniqueId(dracoGeometry,
+                                                           attributeId);
+            this.addAttributeToGeometry(dracoDecoder, decoder, dracoGeometry,
+                attributeName, attributeType, attribute, geometry, geometryBuffer);
+          }
+
+        } else {
+
+          // Add native Draco attribute type to geometry.
+          for (var attributeName in this.nativeAttributeMap) {
             var attId = decoder.GetAttributeId(dracoGeometry,
             var attId = decoder.GetAttributeId(dracoGeometry,
                 dracoDecoder[this.nativeAttributeMap[attributeName]]);
                 dracoDecoder[this.nativeAttributeMap[attributeName]]);
             if (attId !== -1) {
             if (attId !== -1) {
@@ -310,16 +325,7 @@ THREE.DRACOLoader.prototype = {
                   attributeName, Float32Array, attribute, geometry, geometryBuffer);
                   attributeName, Float32Array, attribute, geometry, geometryBuffer);
             }
             }
           }
           }
-        }
 
 
-        // Add attributes of user specified unique id. E.g. GLTF models.
-        for (var attributeName in attributeUniqueIdMap) {
-          var attributeType = attributeTypeMap[attributeName] || Float32Array;
-          var attributeId = attributeUniqueIdMap[attributeName];
-          var attribute = decoder.GetAttributeByUniqueId(dracoGeometry,
-                                                         attributeId);
-          this.addAttributeToGeometry(dracoDecoder, decoder, dracoGeometry,
-              attributeName, attributeType, attribute, geometry, geometryBuffer);
         }
         }
 
 
         // For mesh, we need to generate the faces.
         // For mesh, we need to generate the faces.
@@ -354,6 +360,9 @@ THREE.DRACOLoader.prototype = {
                 THREE.Uint32BufferAttribute : THREE.Uint16BufferAttribute)
                 THREE.Uint32BufferAttribute : THREE.Uint16BufferAttribute)
               (geometryBuffer.indices, 1));
               (geometryBuffer.indices, 1));
         }
         }
+
+        // TODO: Should not assume native Draco attribute IDs apply.
+        // TODO: Can other attribute types be quantized?
         var posTransform = new dracoDecoder.AttributeQuantizationTransform();
         var posTransform = new dracoDecoder.AttributeQuantizationTransform();
         if (posTransform.InitFromAttribute(posAttribute)) {
         if (posTransform.InitFromAttribute(posAttribute)) {
           // Quantized attribute. Store the quantization parameters into the
           // Quantized attribute. Store the quantization parameters into the

+ 31 - 15
examples/js/loaders/GLTFLoader.js

@@ -58,8 +58,8 @@ THREE.GLTFLoader = ( function () {
 
 
 				}
 				}
 
 
-				scope.manager.itemEnd( url );
 				scope.manager.itemError( url );
 				scope.manager.itemError( url );
+				scope.manager.itemEnd( url );
 
 
 			};
 			};
 
 
@@ -508,6 +508,7 @@ THREE.GLTFLoader = ( function () {
 		this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;
 		this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;
 		this.json = json;
 		this.json = json;
 		this.dracoLoader = dracoLoader;
 		this.dracoLoader = dracoLoader;
+		THREE.DRACOLoader.getDecoderModule();
 
 
 	}
 	}
 
 
@@ -1186,16 +1187,10 @@ THREE.GLTFLoader = ( function () {
 		POSITION: 'position',
 		POSITION: 'position',
 		NORMAL: 'normal',
 		NORMAL: 'normal',
 		TEXCOORD_0: 'uv',
 		TEXCOORD_0: 'uv',
-		TEXCOORD0: 'uv', // deprecated
-		TEXCOORD: 'uv', // deprecated
 		TEXCOORD_1: 'uv2',
 		TEXCOORD_1: 'uv2',
 		COLOR_0: 'color',
 		COLOR_0: 'color',
-		COLOR0: 'color', // deprecated
-		COLOR: 'color', // deprecated
 		WEIGHTS_0: 'skinWeight',
 		WEIGHTS_0: 'skinWeight',
-		WEIGHT: 'skinWeight', // deprecated
 		JOINTS_0: 'skinIndex',
 		JOINTS_0: 'skinIndex',
-		JOINT: 'skinIndex' // deprecated
 	};
 	};
 
 
 	var PATH_PROPERTIES = {
 	var PATH_PROPERTIES = {
@@ -1346,6 +1341,7 @@ THREE.GLTFLoader = ( function () {
 
 
 			if ( hasMorphPosition ) {
 			if ( hasMorphPosition ) {
 
 
+				// TODO: Error-prone use of a callback inside a loop.
 				var accessor = target.POSITION !== undefined
 				var accessor = target.POSITION !== undefined
 					? parser.getDependency( 'accessor', target.POSITION )
 					? parser.getDependency( 'accessor', target.POSITION )
 						.then( function ( accessor ) {
 						.then( function ( accessor ) {
@@ -1360,6 +1356,7 @@ THREE.GLTFLoader = ( function () {
 
 
 			if ( hasMorphNormal ) {
 			if ( hasMorphNormal ) {
 
 
+				// TODO: Error-prone use of a callback inside a loop.
 				var accessor = target.NORMAL !== undefined
 				var accessor = target.NORMAL !== undefined
 					? parser.getDependency( 'accessor', target.NORMAL )
 					? parser.getDependency( 'accessor', target.NORMAL )
 						.then( function ( accessor ) {
 						.then( function ( accessor ) {
@@ -1504,6 +1501,17 @@ THREE.GLTFLoader = ( function () {
 
 
 	function isPrimitiveEqual( a, b ) {
 	function isPrimitiveEqual( a, b ) {
 
 
+		var dracoExtA = a.extensions ? a.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] : undefined;
+		var dracoExtB = b.extensions ? b.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] : undefined;
+
+		if ( dracoExtA && dracoExtB ) {
+
+			if ( dracoExtA.bufferView !== dracoExtB.bufferView ) return false;
+
+			return isObjectEqual( dracoExtA.attributes, dracoExtB.attributes );
+
+		}
+
 		if ( a.indices !== b.indices ) {
 		if ( a.indices !== b.indices ) {
 
 
 			return false;
 			return false;
@@ -1632,6 +1640,7 @@ THREE.GLTFLoader = ( function () {
 
 
 			if ( primitive0.mode !== primitive.mode ) return false;
 			if ( primitive0.mode !== primitive.mode ) return false;
 			if ( primitive.indices === undefined ) return false;
 			if ( primitive.indices === undefined ) return false;
+			if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) return false;
 			if ( ! isObjectEqual( primitive0.attributes, primitive.attributes ) ) return false;
 			if ( ! isObjectEqual( primitive0.attributes, primitive.attributes ) ) return false;
 
 
 			var targets = primitive.targets || [];
 			var targets = primitive.targets || [];
@@ -1886,6 +1895,7 @@ THREE.GLTFLoader = ( function () {
 			var type = types[ i ];
 			var type = types[ i ];
 			var value = this.getDependencies( type );
 			var value = this.getDependencies( type );
 
 
+			// TODO: Error-prone use of a callback inside a loop.
 			value = value.then( function ( key, value ) {
 			value = value.then( function ( key, value ) {
 
 
 				results[ key ] = value;
 				results[ key ] = value;
@@ -1977,7 +1987,7 @@ THREE.GLTFLoader = ( function () {
 			// Ignore empty accessors, which may be used to declare runtime
 			// Ignore empty accessors, which may be used to declare runtime
 			// information about attributes coming from another source (e.g. Draco
 			// information about attributes coming from another source (e.g. Draco
 			// compression extension).
 			// compression extension).
-			return null;
+			return Promise.resolve( null );
 
 
 		}
 		}
 
 
@@ -2486,6 +2496,18 @@ THREE.GLTFLoader = ( function () {
 
 
 		}
 		}
 
 
+		function createDracoPrimitive( primitive ) {
+
+			return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]
+				.decodePrimitive( primitive, parser )
+				.then( function ( geometry ) {
+
+					return addPrimitiveAttributes( geometry, primitive, parser );
+
+				} );
+
+		}
+
 		var pending = [];
 		var pending = [];
 
 
 		for ( var i = 0, il = primitives.length; i < il; i ++ ) {
 		for ( var i = 0, il = primitives.length; i < il; i ++ ) {
@@ -2507,13 +2529,7 @@ THREE.GLTFLoader = ( function () {
 				if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {
 				if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {
 
 
 					// Use DRACO geometry if available
 					// Use DRACO geometry if available
-					geometryPromise = extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]
-						.decodePrimitive( primitive, parser )
-						.then( function ( geometry ) {
-
-							return addPrimitiveAttributes( geometry, primitive, parser );
-
-						} );
+					geometryPromise = createDracoPrimitive( primitive );
 
 
 				} else {
 				} else {
 
 

+ 2 - 2
examples/js/loaders/HDRCubeTextureLoader.js

@@ -147,11 +147,11 @@ THREE.HDRCubeTextureLoader.prototype.load = function ( type, urls, onLoad, onPro
 
 
 			}
 			}
 
 
-			if ( undefined !== texData.image ) {
+			if ( texData.image !== undefined ) {
 
 
 				texture[ i ].images = texData.image;
 				texture[ i ].images = texData.image;
 
 
-			} else if ( undefined !== texData.data ) {
+			} else if ( texData.data !== undefined ) {
 
 
 				var dataTexture = new THREE.DataTexture( texData.data, texData.width, texData.height );
 				var dataTexture = new THREE.DataTexture( texData.data, texData.width, texData.height );
 				dataTexture.format = texture.format;
 				dataTexture.format = texture.format;

+ 1 - 1
examples/js/loaders/VRMLLoader.js

@@ -626,7 +626,7 @@ THREE.VRMLLoader.prototype = {
 								parent.geometry = defines[ defineKey ].clone();
 								parent.geometry = defines[ defineKey ].clone();
 
 
 								// the solid property is not cloned with clone(), is only needed for VRML loading, so we need to transfer it
 								// the solid property is not cloned with clone(), is only needed for VRML loading, so we need to transfer it
-								if ( undefined !== defines[ defineKey ].solid && defines[ defineKey ].solid === false ) {
+								if ( defines[ defineKey ].solid !== undefined && defines[ defineKey ].solid === false ) {
 
 
 									parent.geometry.solid = false;
 									parent.geometry.solid = false;
 									parent.material.side = THREE.DoubleSide;
 									parent.material.side = THREE.DoubleSide;

+ 9 - 2
examples/js/postprocessing/SMAAPass.js

@@ -27,9 +27,14 @@ THREE.SMAAPass = function ( width, height ) {
 	this.weightsRT.texture.name = "SMAAPass.weights";
 	this.weightsRT.texture.name = "SMAAPass.weights";
 
 
 	// textures
 	// textures
+	var scope = this;
 
 
 	var areaTextureImage = new Image();
 	var areaTextureImage = new Image();
 	areaTextureImage.src = this.getAreaTexture();
 	areaTextureImage.src = this.getAreaTexture();
+	areaTextureImage.onload = function() {
+		// assigning data to HTMLImageElement.src is asynchronous (see #15162)
+		scope.areaTexture.needsUpdate = true;
+	};
 
 
 	this.areaTexture = new THREE.Texture();
 	this.areaTexture = new THREE.Texture();
 	this.areaTexture.name = "SMAAPass.area";
 	this.areaTexture.name = "SMAAPass.area";
@@ -37,11 +42,14 @@ THREE.SMAAPass = function ( width, height ) {
 	this.areaTexture.format = THREE.RGBFormat;
 	this.areaTexture.format = THREE.RGBFormat;
 	this.areaTexture.minFilter = THREE.LinearFilter;
 	this.areaTexture.minFilter = THREE.LinearFilter;
 	this.areaTexture.generateMipmaps = false;
 	this.areaTexture.generateMipmaps = false;
-	this.areaTexture.needsUpdate = true;
 	this.areaTexture.flipY = false;
 	this.areaTexture.flipY = false;
 
 
 	var searchTextureImage = new Image();
 	var searchTextureImage = new Image();
 	searchTextureImage.src = this.getSearchTexture();
 	searchTextureImage.src = this.getSearchTexture();
+	searchTextureImage.onload = function() {
+		// assigning data to HTMLImageElement.src is asynchronous (see #15162)
+		scope.searchTexture.needsUpdate = true;
+	};
 
 
 	this.searchTexture = new THREE.Texture();
 	this.searchTexture = new THREE.Texture();
 	this.searchTexture.name = "SMAAPass.search";
 	this.searchTexture.name = "SMAAPass.search";
@@ -49,7 +57,6 @@ THREE.SMAAPass = function ( width, height ) {
 	this.searchTexture.magFilter = THREE.NearestFilter;
 	this.searchTexture.magFilter = THREE.NearestFilter;
 	this.searchTexture.minFilter = THREE.NearestFilter;
 	this.searchTexture.minFilter = THREE.NearestFilter;
 	this.searchTexture.generateMipmaps = false;
 	this.searchTexture.generateMipmaps = false;
-	this.searchTexture.needsUpdate = true;
 	this.searchTexture.flipY = false;
 	this.searchTexture.flipY = false;
 
 
 	// materials - pass 1
 	// materials - pass 1

+ 1 - 0
examples/js/utils/BufferGeometryUtils.js

@@ -186,6 +186,7 @@ THREE.BufferGeometryUtils = {
 
 
 	/**
 	/**
 	 * @param  {Array<THREE.BufferGeometry>} geometries
 	 * @param  {Array<THREE.BufferGeometry>} geometries
+	 * @param  {Boolean} useGroups
 	 * @return {THREE.BufferGeometry}
 	 * @return {THREE.BufferGeometry}
 	 */
 	 */
 	mergeBufferGeometries: function ( geometries, useGroups ) {
 	mergeBufferGeometries: function ( geometries, useGroups ) {

+ 3 - 3
examples/misc_boxselection.html

@@ -141,7 +141,7 @@
 			var selectionBox = new SelectionBox( camera, scene );
 			var selectionBox = new SelectionBox( camera, scene );
     		var helper = new SelectionHelper( selectionBox, renderer, "selectBox" );
     		var helper = new SelectionHelper( selectionBox, renderer, "selectBox" );
 
 
-			document.addEventListener("mousedown", function ( e ) {
+			document.addEventListener("mousedown", function ( event ) {
 
 
 				for ( var item of selectionBox.collection ) {
 				for ( var item of selectionBox.collection ) {
 
 
@@ -155,7 +155,7 @@
 					 0.5 );
 					 0.5 );
     		} );
     		} );
 
 
-    		document.addEventListener( "mousemove", function ( e ) {
+    		document.addEventListener( "mousemove", function ( event ) {
 
 
 				if ( helper.isDown ) {
 				if ( helper.isDown ) {
 
 
@@ -181,7 +181,7 @@
 
 
 			} );
 			} );
 
 
-			document.addEventListener("mouseup", function (e) {
+			document.addEventListener("mouseup", function ( event ) {
 				
 				
 				selectionBox.endPoint.set(
 				selectionBox.endPoint.set(
 					(event.clientX / window.innerWidth) * 2 - 1,
 					(event.clientX / window.innerWidth) * 2 - 1,

+ 0 - 201
examples/misc_lights_test.html

@@ -1,201 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js misc - lights - point + directional</title>
-		<meta charset="utf-8">
-		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
-		<style>
-			body {
-				background:#fff;
-				padding:0;
-				margin:0;
-				overflow:hidden;
-				font-family:georgia;
-				text-align:center;
-			}
-			a { color:skyblue }
-			canvas { pointer-events:none; z-index:10; }
-
-			#d { text-align:center; margin:1em 0 -11.4em 0; z-index:0; position:relative; display:block }
-			.button { background:#000; color:#fff; padding:0.2em 0.5em; cursor:pointer }
-			.inactive { background:#999; color:#eee }
-		</style>
-	</head>
-
-	<body>
-
-		<script src="../build/three.js"></script>
-
-		<script src="js/libs/stats.min.js"></script>
-
-		<script>
-
-			var SCREEN_WIDTH = window.innerWidth / 2;
-			var SCREEN_HEIGHT = window.innerHeight;
-
-			var container, stats;
-
-			var camera, scene, webglRenderer;
-
-			var mesh, geometry, material;
-
-			var directionalLight, pointLight;
-
-			var mouseX = 0, mouseY = 0;
-
-			var windowHalfX = window.innerWidth / 2;
-			var windowHalfY = window.innerHeight / 2;
-
-			var clock = new THREE.Clock();
-
-			document.addEventListener( 'mousemove', onDocumentMouseMove, false );
-
-			init();
-			animate();
-
-			function init() {
-
-				container = document.createElement( 'div' );
-				document.body.appendChild( container );
-
-				camera = new THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000 );
-				camera.position.z = 500;
-
-				scene = new THREE.Scene();
-				scene.background = new THREE.Color( 0xffffff );
-
-				// Spheres
-
-				geometry = new THREE.SphereBufferGeometry( 100, 16, 8 );
-				material = new THREE.MeshPhongMaterial( { color: 0xffffff, flatShading: true, shininess: 0 } );
-
-				for ( var i = 0; i < 30; i ++ ) {
-
-					mesh = new THREE.Mesh( geometry, material );
-					mesh.position.x = 500 * ( Math.random() - 0.5 );
-					mesh.position.y = 500 * ( Math.random() - 0.5 );
-					mesh.position.z = 500 * ( Math.random() - 0.5 );
-					mesh.scale.x = mesh.scale.y = mesh.scale.z = 0.25 * ( Math.random() + 0.5 );
-					scene.add( mesh );
-
-				}
-
-				// Torus
-
-				geometry = new THREE.TorusBufferGeometry( 100, 25, 15, 30 );
-				mesh = new THREE.Mesh( geometry, material );
-				scene.add( mesh );
-
-				// Lights
-
-				var ambient = new THREE.AmbientLight( 0x101010 );
-				scene.add( ambient );
-
-				directionalLight = new THREE.DirectionalLight( 0xffffff );
-				directionalLight.position.set( 0, - 70, 100 ).normalize();
-
-				setTimeout( function () {
-
-					scene.add( directionalLight );
-
-				}, 3000 );
-
-				pointLight = new THREE.PointLight( 0xffaa00 );
-				scene.add( pointLight );
-
-				geometry = new THREE.SphereBufferGeometry( 100, 8, 4 );
-				material = new THREE.MeshBasicMaterial( { color: 0xffaa00 } );
-				mesh = new THREE.Mesh( geometry, material );
-				mesh.scale.set( 0.05, 0.05, 0.05 );
-				pointLight.add( mesh );
-
-				webglRenderer = new THREE.WebGLRenderer();
-				webglRenderer.setPixelRatio( window.devicePixelRatio );
-				webglRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
-				webglRenderer.domElement.style.position = "relative";
-				container.appendChild( webglRenderer.domElement );
-
-
-				stats = new Stats();
-				container.appendChild( stats.dom );
-
-				//
-
-				window.addEventListener( 'resize', onWindowResize, false );
-
-			}
-
-			function onWindowResize() {
-
-				SCREEN_WIDTH = window.innerWidth / 2;
-				SCREEN_HEIGHT = window.innerHeight;
-
-				camera.aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
-				camera.updateProjectionMatrix();
-
-				webglRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
-
-			}
-
-			function onDocumentMouseMove( event ) {
-
-				mouseX = ( event.clientX - windowHalfX );
-				mouseY = ( event.clientY - windowHalfY );
-
-			}
-
-			//
-
-			function animate() {
-
-				requestAnimationFrame( animate );
-
-				render();
-				stats.update();
-
-			}
-
-			function render() {
-
-				var delta = clock.getDelta();
-
-				camera.position.x += ( mouseX - camera.position.x ) * 0.05;
-				camera.position.y += ( - mouseY - camera.position.y ) * 0.05;
-
-				camera.lookAt( scene.position );
-
-				for ( var i = 0, l = scene.children.length; i < l; i ++ ) {
-
-					var object = scene.children[ i ];
-
-					if ( object instanceof THREE.Mesh ) {
-
-						if ( i % 3 == 1 )
-
-							object.rotation.z += 1.5 * delta;
-
-						else if ( i % 3 == 2 )
-
-							object.rotation.y += 1.5 * delta;
-
-						else if ( i % 3 == 0 )
-
-							object.rotation.x += 1.5 * delta;
-
-					}
-
-				}
-
-				var r = clock.getElapsedTime();
-
-				pointLight.position.x = 200 * Math.cos( r );
-				pointLight.position.z = 200 * Math.sin( r );
-
-				webglRenderer.render( scene, camera );
-
-			}
-
-		</script>
-
-	</body>
-</html>

+ 0 - 225
examples/misc_ubiquity_test2.html

@@ -1,225 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js misc - ubiquity - test2</title>
-		<meta charset="utf-8">
-		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
-		<style>
-			body {
-				background-color: #000;
-				margin: 0px;
-				overflow: hidden;
-			}
-		</style>
-	</head>
-	<body>
-
-		<script src="../build/three.js"></script>
-
-		<script src="js/renderers/Projector.js"></script>
-
-		<script src="js/libs/stats.min.js"></script>
-
-		<div id='container1' style='float: left '></div>
-		<div id='container2' style='float: right'></div>
-
-		<script>
-
-			var stats;
-
-			var camera, scene;
-			var webglRenderer;
-
-			var mesh;
-			var texture, texture1, texture2, texture3;
-
-			init();
-			animate();
-
-			function init() {
-
-				var width = window.innerWidth / 2 - 2;
-				var height = window.innerHeight;
-
-				camera = new THREE.PerspectiveCamera( 70, width / height, 1, 4000 );
-				camera.position.z = 2000;
-
-				scene = new THREE.Scene();
-				scene.background = new THREE.Color( 0xf0f0f0 );
-
-				var textureLoader = new THREE.TextureLoader();
-
-				// MESH - Repeat Pattern
-
-				texture = textureLoader.load( 'textures/UV_Grid_Sm.jpg' );
-				texture.wrapS = THREE.RepeatWrapping;
-				texture.wrapT = THREE.RepeatWrapping;
-
-				var geometry = new THREE.BoxBufferGeometry( 150, 150, 150, 4, 4, 4 );
-				var material = new THREE.MeshBasicMaterial( { map: texture } );
-
-				mesh = new THREE.Mesh( geometry, material );
-				scene.add( mesh );
-
-
-				// SPRITES - from Sprite Sheet
-
-				texture1 = textureLoader.load( 'textures/UV_Grid_Sm.jpg', function () {
-
-					texture1.wrapS = THREE.ClampToEdgeWrapping;
-					texture1.wrapT = THREE.ClampToEdgeWrapping;
-
-					for ( var i = 0; i < 20; i ++ ) {
-
-						var tex = texture1.clone();
-
-						tex.needsUpdate = true; // cloning does not set this
-
-						tex.offset.x = 0.1 * THREE.Math.randInt( 0, 7 );
-						tex.offset.y = 0.1 * THREE.Math.randInt( 0, 7 );
-						tex.repeat.x = 0.1 * THREE.Math.randInt( 1, 3 );
-						tex.repeat.y = 0.1 * THREE.Math.randInt( 1, 3 );
-
-						var material = new THREE.SpriteMaterial( { map: tex } );
-						material.rotation = 0.5 * Math.PI * ( Math.random() - 0.5 );
-
-						var sprite = new THREE.Sprite( material );
-
-						sprite.position.x = Math.random() * 1000 - 500;
-						sprite.position.y = Math.random() * 1000 - 500;
-						sprite.position.z = Math.random() * 1000 - 500;
-
-						sprite.scale.set( 96, 96, 1 );
-
-						scene.add( sprite );
-
-					}
-
-				} );
-
-
-				// SPRITES - Repeat Pattern
-
-				texture2 = textureLoader.load( 'textures/sprite0.jpg' );
-				texture2.wrapS = THREE.RepeatWrapping;
-				texture2.wrapT = THREE.RepeatWrapping;
-
-				for ( var i = 0; i < 20; i ++ ) {
-
-					var material = new THREE.SpriteMaterial( { map: texture2, opacity: 0.7 } );
-					var sprite = new THREE.Sprite( material );
-
-					sprite.material.rotation = 0.5 * Math.PI * ( Math.random() - 0.5 );
-
-					sprite.position.x = Math.random() * 1000 - 500;
-					sprite.position.y = Math.random() * 1000 - 500;
-					sprite.position.z = Math.random() * 1000 - 500;
-
-					sprite.scale.set( 64, 64, 1 );
-
-					scene.add( sprite );
-
-				}
-
-
-				// SPRITES - PNG
-
-				texture3 = textureLoader.load( 'textures/sprite1.png' );
-				texture3.wrapS = THREE.ClampToEdgeWrapping;
-				texture3.wrapT = THREE.ClampToEdgeWrapping;
-
-				for ( var i = 0; i < 20; i ++ ) {
-
-					var material = new THREE.SpriteMaterial( { map: texture3 } );
-					material.rotation = 2 * Math.PI * ( Math.random() - 0.5 );
-
-					var sprite = new THREE.Sprite( material );
-
-					sprite.position.x = Math.random() * 1000 - 500;
-					sprite.position.y = Math.random() * 1000 - 500;
-					sprite.position.z = Math.random() * 1000 - 500;
-
-					sprite.scale.set( 64, 64, 1 );
-
-					scene.add( sprite );
-
-				}
-
-				//
-
-				webglRenderer = new THREE.WebGLRenderer( { antialias: true } );
-				webglRenderer.setPixelRatio( window.devicePixelRatio );
-				webglRenderer.setSize( width, height );
-				var container2 = document.getElementById( 'container2' );
-				container2.appendChild( webglRenderer.domElement );
-
-				stats = new Stats();
-				document.body.appendChild( stats.dom );
-
-				//
-
-				window.addEventListener( 'resize', onWindowResize, false );
-
-			}
-
-			function onWindowResize() {
-
-				var width = window.innerWidth / 2 - 2;
-				var height = window.innerHeight;
-
-				camera.aspect = width / height;
-				camera.updateProjectionMatrix();
-
-				webglRenderer.setSize( width, height );
-
-			}
-
-			//
-
-			function animate() {
-
-				requestAnimationFrame( animate );
-
-				render();
-				stats.update();
-
-			}
-
-			function render() {
-
-				var time = performance.now() * 0.0001;
-
-				camera.position.x = Math.sin( time ) * 500;
-				camera.position.z = Math.cos( time ) * 500;
-				camera.lookAt( scene.position );
-
-				//
-
-				texture.repeat.x = Math.sin( time ) * 0.5 + 1.0;
-				texture.repeat.y = Math.cos( time ) * 0.5 + 1.0;
-
-				texture.offset.x = Math.sin( time ) * 0.5 + 0.5;
-				texture.offset.y = Math.cos( time ) * 0.5 + 0.5;
-
-				mesh.rotation.x = time * 2;
-				mesh.rotation.y = time * 4;
-
-				//
-
-				texture2.repeat.x = Math.sin( time ) + 1.25;
-				texture2.repeat.y = Math.sin( time ) + 1.25;
-
-				texture2.offset.x = Math.sin( time );
-				texture2.offset.y = Math.cos( time );
-
-				//
-
-				webglRenderer.render( scene, camera );
-
-			}
-
-		</script>
-
-	</body>
-
-</html>

BIN
examples/models/skinned/UCS/skins/Asian_Male.jpg


BIN
examples/models/skinned/UCS/skins/Black_Female.jpg


BIN
examples/models/skinned/UCS/skins/Caucasion_Female.jpg


BIN
examples/models/skinned/UCS/skins/Caucasion_Male.jpg


BIN
examples/models/skinned/UCS/skins/Highlighted_Muscles.jpg


BIN
examples/models/skinned/UCS/skins/Indian_Male.jpg


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.