three.js 源码注释(六十四)objects/Skeleton.js

商域无疆 (http://blog.csdn.net/omni360/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS否则,出自本博客的文章拒绝转载或再转载,谢谢合作。


俺也是刚开始学,好多地儿肯定不对还请见谅.

以下代码是THREE.JS 源码文件中objects/Skeleton.js文件的注释.

更多更新在 : https://github.com/omni360/three.js.sourcecode


/**
 * @author mikael emtinger / http://gomo.se/
 * @author alteredq / http://alteredqualia.com/
 * @author michael guerrero / http://realitymeltdown.com
 * @author ikerr / http://verold.com
 */
/*
///Skeleton是骨架对象,是骨骼对象的几何,是蒙皮对象的一部分,用来制作支持骨骼动画,当前有两种模型动画的方式:顶点动画和骨骼动画。顶点动画中,每帧动画其实就是模型特定姿态的一个“快照”。通过在帧之间插值的方法,
/// 引擎可以得到平滑的动画效果。在骨骼动画中,模型具有互相连接的“骨骼”组成的骨架结构,通过改变骨骼的朝向和位置来为模型生成动画。
/// 骨骼动画比顶点动画要求更高的处理器性能,但同时它也具有更多的优点,骨骼动画可以更容易、更快捷地创建。不同的骨骼动画可以被结合到一起——比如,
/// 模型可以转动头部、射击并且同时也在走路。一些引擎可以实时操纵单个骨骼,这样就可以和环境更加准确地进行交互——模型可以俯身并向某个方向观察或射击,
/// 或者从地上的某个地方捡起一个东西。多数引擎支持顶点动画,但不是所有的引擎都支持骨骼动画。
/// 一些引擎包含面部动画系统,这种系统使用通过音位(phoneme)和情绪修改面部骨骼集合来表达面部表情和嘴部动作。
*/
///<summary>Skeleton</summary>
///<param name ="bones" type="SkinnedMesh">骨骼数组</param>
///<param name ="boneInverses" type="SkinnedMesh">骨架位置逆矩阵</param>
///<param name ="useVertexTexture" type="boolean">true 或者 false,是否使用顶点纹理,对象构建后,该属性不能修改.</param>
///<returns type="Skeleton">骨骼对象</returns>
THREE.Skeleton = function ( bones, boneInverses, useVertexTexture ) {

	this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;	//如果不设置useVertexTexture参数,默认初始化为true

	this.identityMatrix = new THREE.Matrix4();

	// copy the bone array
	// 复制骨骼数组

	bones = bones || [];

	this.bones = bones.slice( 0 );

	// create a bone texture or an array of floats
	// 创建骨架纹理或者骨架纹理数组

	if ( this.useVertexTexture ) {		//使用定点纹理

		// layout (1 matrix = 4 pixels)
		//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)
		//  with  8x8  pixel texture max   16 bones  (8 * 8  / 4)
		//       16x16 pixel texture max   64 bones (16 * 16 / 4)
		//       32x32 pixel texture max  256 bones (32 * 32 / 4)
		//       64x64 pixel texture max 1024 bones (64 * 64 / 4)

		var size;

		if ( this.bones.length > 256 )
			size = 64;
		else if ( this.bones.length > 64 )
			size = 32;
		else if ( this.bones.length > 16 )
			size = 16;
		else
			size = 8;

		this.boneTextureWidth = size;	//骨骼纹理宽度
		this.boneTextureHeight = size;	//骨骼纹理高度

		this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel	//每像素4个浮点型数值
		this.boneTexture = new THREE.DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType );	/////DataTexture类用来为面创建一个基于图像数据的反射折射或者纹理贴图对象,和THREE.Texture方法不同的是这里的图像使用的数据格式
																																							/// 这个类是最重要的属性是data,这是一个JavaScript Image类型对象的数据格式。传入的第一个参数就是该对象,
																																							///后面的对象都是可选的,如果缺省就会填充默认值,而且往往都是填充默认值。
		this.boneTexture.minFilter = THREE.NearestFilter;		///属性magFileter和minFileter指定纹理在放大和缩小时的过滤方式设置为最临近点
		this.boneTexture.magFilter = THREE.NearestFilter;
		this.boneTexture.generateMipmaps = false;		//不生成mipmap贴图,金字塔贴图
		this.boneTexture.flipY = false;					//不翻转图像

	} else {

		this.boneMatrices = new Float32Array( 16 * this.bones.length );		//不适用顶点纹理

	}

	// use the supplied bone inverses or calculate the inverses
	// 使用提供的骨架位置逆矩阵或计算骨架位置逆矩阵

	if ( boneInverses === undefined ) {		//如果没有提供骨架位置逆矩阵

		this.calculateInverses();	//计算骨架位置逆矩阵

	} else {

		if ( this.bones.length === boneInverses.length ) {		//如果提供了逆矩阵,并和骨骼数量相等

			this.boneInverses = boneInverses.slice( 0 );	//复制骨架的逆矩阵

		} else {		//如果提供的骨骼逆矩阵和骨骼数量不一致

			console.warn( 'THREE.Skeleton bonInverses is the wrong length.' );		//提示用户骨骼的逆矩阵和骨骼数量不一致

			this.boneInverses = [];	//清空骨骼逆矩阵

			for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {

				this.boneInverses.push( new THREE.Matrix4() );	//并将骨骼逆矩阵和骨骼数量保持不一致

			}

		}

	}

};

/*calculateInverses方法
///calculateInverses方法重新计算骨骼的逆矩阵
*/
///<summary>calculateInverses</summary>
///<returns type="Skeleton">返回包含骨骼逆矩阵的Skeleton骨架对象.</returns>	
THREE.Skeleton.prototype.calculateInverses = function () {

	this.boneInverses = [];

	for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {

		var inverse = new THREE.Matrix4();

		if ( this.bones[ b ] ) {

			inverse.getInverse( this.bones[ b ].matrixWorld );		//获得当前骨骼的位置属性的逆矩阵

		}

		this.boneInverses.push( inverse );		//返回包含骨骼逆矩阵的Skeleton骨架对象

	}

};

/*pose方法
///pose方法重新计算骨骼的计算本地矩阵,位置,旋转缩放属性
*/
///<summary>pose</summary>
///<returns type="Skeleton">返回包含新属性的骨架对象.</returns>	
THREE.Skeleton.prototype.pose = function () {

	var bone;

	// recover the bind-time world matrices
	// 恢复在绑定时的世界坐标矩阵.

	for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {

		bone = this.bones[ b ];

		if ( bone ) {

			bone.matrixWorld.getInverse( this.boneInverses[ b ] );	//恢复在绑定时的世界坐标矩阵

		}

	}

	// compute the local matrices, positions, rotations and scales
	//计算本地矩阵,位置,旋转缩放属性

	for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {

		bone = this.bones[ b ];

		if ( bone ) {

			if ( bone.parent ) {	//如果骨骼有父级对象

				bone.matrix.getInverse( bone.parent.matrixWorld );	//求逆父级对象的世界坐标矩阵
				bone.matrix.multiply( bone.matrixWorld );	//将当前骨骼的矩阵与父级对象的世界坐标矩阵相乘

			}
			else {

				bone.matrix.copy( bone.matrixWorld );	//复制自身的世界坐标矩阵

			}

			bone.matrix.decompose( bone.position, bone.quaternion, bone.scale );	//调用decompose()方法,重新设置骨骼对象的位置,旋转缩放属性.

		}

	}

};

/*update方法
///update方法更新当前骨架的缓冲区数据,并更新纹理标识设置为true.
*/
///<summary>pose</summary>
///<returns type="Skeleton">返回包含新的骨架对象.</returns>	
THREE.Skeleton.prototype.update = function () {

	var offsetMatrix = new THREE.Matrix4();

	// flatten bone matrices to array
	// 展开骨骼矩阵到数组.

	for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {

		// compute the offset between the current and the original transform
		//计算当前位置到原始位置的偏移距离

		var matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;

		offsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );
		offsetMatrix.flattenToArrayOffset( this.boneMatrices, b * 16 );		//调用flattenToArrayOffset方法,通过参数offset(b * 16)指定偏移量,将矩阵展开到数组(参数array)中,返回新的数组.

	}

	if ( this.useVertexTexture ) {		//如果使用顶点纹理

		this.boneTexture.needsUpdate = true;	//将更新标识设置为true.

	}

};


商域无疆 (http://blog.csdn.net/omni360/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化、GOLANG、Html5、WEBGL、THREE.JS否则,出自本博客的文章拒绝转载或再转载,谢谢合作。


以下代码是THREE.JS 源码文件中objects/Skeleton.js文件的注释.

更多更新在 : https://github.com/omni360/three.js.sourcecode

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。