亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? quaternion.as

?? flash 360全景瀏覽
?? AS
字號:
/*
 * PAPER    ON   ERVIS  NPAPER ISION  PE  IS ON  PERVI IO  APER  SI  PA
 * AP  VI  ONPA  RV  IO PA     SI  PA ER  SI NP PE     ON AP  VI ION AP
 * PERVI  ON  PE VISIO  APER   IONPA  RV  IO PA  RVIS  NP PE  IS ONPAPE
 * ER     NPAPER IS     PE     ON  PE  ISIO  AP     IO PA ER  SI NP PER
 * RV     PA  RV SI     ERVISI NP  ER   IO   PE VISIO  AP  VISI  PA  RV3D
 * ______________________________________________________________________
 * papervision3d.org + blog.papervision3d.org + osflash.org/papervision3d
 *
 * Copyright 2006 (c) Carlos Ulloa Matesanz, noventaynueve.com.
 * 
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */
 
package org.papervision3d.core.math
{
	/**
	 * @author Tim Knip 
	 */
	public class Quaternion 
	{
		public static const EPSILON:Number = 0.000001;
		public static const DEGTORAD:Number = (Math.PI/180.0);
		public static const RADTODEG:Number = (180.0/Math.PI);
		
		/** */
		public var x:Number;
		
		/** */
		public var y:Number;
		
		/** */
		public var z:Number;
		
		/** */
		public var w:Number;
		
		/**
		 * constructor.
		 * 
		 * @param	x
		 * @param	y
		 * @param	z
		 * @param	w
		 * @return
		 */
		public function Quaternion( x:Number = 0, y:Number = 0, z:Number = 0, w:Number = 1 ):void
		{
			this.x = x;
			this.y = y;
			this.z = z;
			this.w = w;
			
			_matrix = Matrix3D.IDENTITY;
		}
		
		/**
		 * Modulo.
		 * 
		 * @param	a
		 * @return
		 */
		public function get modulo():Number
		{
			return Math.sqrt(x*x + y*y + z*z + w*w);
		}
		
		/**
		 * Conjugate.
		 * 
		 * @param	a
		 * @return
		 */
		public static function conjugate( a:Quaternion ):Quaternion
		{
			var q:Quaternion = new Quaternion();
			q.x = -a.x;
			q.y = -a.y;
			q.z = -a.z;
			q.w = a.w;
			return q;
		}
		
		/**
		 * Creates a Quaternion from a axis and a angle.
		 * 
		 * @param	x 	X-axis
		 * @param	y 	Y-axis
		 * @param	z 	Z-axis
		 * @param	angle	angle in radians.
		 * 
		 * @return
		 */
		public static function createFromAxisAngle( x:Number, y:Number, z:Number, angle:Number ):Quaternion
		{
			var sin:Number = Math.sin( angle / 2 );
			var cos:Number = Math.cos( angle / 2 );

			var q:Quaternion = new Quaternion();

			q.x = x * sin;
			q.y = y * sin;
			q.z = z * sin;
			q.w = cos;

			q.normalize();
			
			return q;
		}
		
		/**
		 * Creates a Quaternion from Euler angles.
		 * 
		 * @param	ax	X-angle in radians.
		 * @param	ay	Y-angle in radians.
		 * @param	az	Z-angle in radians.
		 * 
		 * @return
		 */
		public static function createFromEuler( ax:Number, ay:Number, az:Number, useDegrees:Boolean = false ):Quaternion
		{
			if( useDegrees )
			{
				ax *= DEGTORAD;
				ay *= DEGTORAD;
				az *= DEGTORAD;
			}
			
			var fSinPitch       :Number = Math.sin( ax * 0.5 );
			var fCosPitch       :Number = Math.cos( ax * 0.5 );
			var fSinYaw         :Number = Math.sin( ay * 0.5 );
			var fCosYaw         :Number = Math.cos( ay * 0.5 );
			var fSinRoll        :Number = Math.sin( az * 0.5 );
			var fCosRoll        :Number = Math.cos( az * 0.5 );
			var fCosPitchCosYaw :Number = fCosPitch * fCosYaw;
			var fSinPitchSinYaw :Number = fSinPitch * fSinYaw;

			var q:Quaternion = new Quaternion();

			q.x = fSinRoll * fCosPitchCosYaw     - fCosRoll * fSinPitchSinYaw;
			q.y = fCosRoll * fSinPitch * fCosYaw + fSinRoll * fCosPitch * fSinYaw;
			q.z = fCosRoll * fCosPitch * fSinYaw - fSinRoll * fSinPitch * fCosYaw;
			q.w = fCosRoll * fCosPitchCosYaw     + fSinRoll * fSinPitchSinYaw;

			return q;
		}
				
		/**
		 * Creates a Quaternion from a matrix.
		 * 
		 * @param	matrix	a matrix. @see org.papervision3d.core.Matrix3D
		 * 
		 * @return	the created Quaternion
		 */
		public static function createFromMatrix( matrix:Matrix3D ):Quaternion
		{
			var quat:Quaternion = new Quaternion();
			
			var s:Number;
			var q:Array = new Array(4);
			var i:int, j:int, k:int;
			
			var tr:Number = matrix.n11 + matrix.n22 + matrix.n33;

			// check the diagonal
			if (tr > 0.0) 
			{
				s = Math.sqrt(tr + 1.0);
				quat.w = s / 2.0;
				s = 0.5 / s;
				
				quat.x = (matrix.n32 - matrix.n23) * s;
				quat.y = (matrix.n13 - matrix.n31) * s;
				quat.z = (matrix.n21 - matrix.n12) * s;
			} 
			else 
			{		
				// diagonal is negative
				var nxt:Array = [1, 2, 0];

				var m:Array = [
					[matrix.n11, matrix.n12, matrix.n13, matrix.n14],
					[matrix.n21, matrix.n22, matrix.n23, matrix.n24],
					[matrix.n31, matrix.n32, matrix.n33, matrix.n34]
				];
				
				i = 0;

				if (m[1][1] > m[0][0]) i = 1;
				if (m[2][2] > m[i][i]) i = 2;

				j = nxt[i];
				k = nxt[j];
				s = Math.sqrt((m[i][i] - (m[j][j] + m[k][k])) + 1.0);

				q[i] = s * 0.5;

				if (s != 0.0) s = 0.5 / s;

				q[3] = (m[k][j] - m[j][k]) * s;
				q[j] = (m[j][i] + m[i][j]) * s;
				q[k] = (m[k][i] + m[i][k]) * s;

				quat.x = q[0];
				quat.y = q[1];
				quat.z = q[2];
				quat.w = q[3];
			}
			return quat;
		}
		
		/**
		 * Creates a Quaternion from a orthonormal matrix.
		 * 
		 * @param	m	a orthonormal matrix. @see org.papervision3d.core.Matrix3D
		 * 
		 * @return  the created Quaternion
		 */
		public static function createFromOrthoMatrix( m:Matrix3D ):Quaternion
		{
			var q:Quaternion = new Quaternion();

			q.w = Math.sqrt( Math.max(0, 1 + m.n11 + m.n22 + m.n33) ) / 2;
			q.x = Math.sqrt( Math.max(0, 1 + m.n11 - m.n22 - m.n33) ) / 2;
			q.y = Math.sqrt( Math.max(0, 1 - m.n11 + m.n22 - m.n33) ) / 2;
			q.z = Math.sqrt( Math.max(0, 1 - m.n11 - m.n22 + m.n33) ) / 2;
			
			// recover signs
			q.x = m.n32 - m.n23 < 0 ? (q.x < 0 ? q.x : -q.x) : (q.x < 0 ? -q.x : q.x);
			q.y = m.n13 - m.n31 < 0 ? (q.y < 0 ? q.y : -q.y) : (q.y < 0 ? -q.y : q.y);
			q.z = m.n21 - m.n12 < 0 ? (q.z < 0 ? q.z : -q.z) : (q.z < 0 ? -q.z : q.z);

			return q;
		}
		
		/**
		 * Dot product.
		 * 
		 * @param	a
		 * @param	b
		 * 
		 * @return
		 */
		public static function dot( a:Quaternion, b:Quaternion ):Number
		{
			return (a.x * b.x) + (a.y * b.y) + (a.z * b.z) + (a.w * b.w);
		}
		
		/**
		 * Multiply.
		 * 
		 * @param	a
		 * @param	b
		 * @return
		 */
		public static function multiply( a:Quaternion, b:Quaternion ):Quaternion
		{
			var c:Quaternion = new Quaternion();
			c.x = a.w*b.x + a.x*b.w + a.y*b.z - a.z*b.y;
			c.y = a.w*b.y - a.x*b.z + a.y*b.w + a.z*b.x;
			c.z = a.w*b.z + a.x*b.y - a.y*b.x + a.z*b.w;
			c.w = a.w*b.w - a.x*b.x - a.y*b.y - a.z*b.z;
			return c;
		}
		
		/**
		 * Multiply by another Quaternion.
		 * 
		 * @param	b	The Quaternion to multiply by.
		 */
		public function mult( b:Quaternion ):void
		{
			var aw:Number = this.w,
				ax:Number = this.x,
				ay:Number = this.y,
				az:Number = this.z;
				
			x = aw*b.x + ax*b.w + ay*b.z - az*b.y;
			y = aw*b.y - ax*b.z + ay*b.w + az*b.x;
			z = aw*b.z + ax*b.y - ay*b.x + az*b.w;
			w = aw*b.w - ax*b.x - ay*b.y - az*b.z;
		}
		
		/**
		 * Normalize.
		 * 
		 * @param	a
		 * 
		 * @return
		 */
		public function normalize():void
		{
			var len:Number = this.modulo;
			
			if( Math.abs(len) < EPSILON )
			{
				x = y = z = 0.0;
				w = 1.0;
			}
			else
			{
				var m:Number = 1 / len;
				x *= m;
				y *= m;
				z *= m;
				w *= m;
			}
		}

		/**
		 * SLERP (Spherical Linear intERPolation). @author Trevor Burton
		 * 
		 * @param	qa		start quaternion
		 * @param	qb		end quaternion
		 * @param	alpha	a value between 0 and 1
		 * 
		 * @return the interpolated quaternion.
		 */	
		public static function slerp( qa:Quaternion, qb:Quaternion, alpha:Number ):Quaternion
		{
			var s0:Number;
			var s1:Number;
		
			var cosine:Number = qa.x * qb.x + qa.y * qb.y + qa.z * qb.z + qa.w * qb.w;		
		
			if ( cosine < 0.0 ) cosine = -cosine; 
		
			if ( (1.0 - cosine) > EPSILON ) 
			{	
				var omega:Number = Math.acos(cosine);
				var sine:Number = Math.sin(omega);
				s0 = Math.sin((1.0 - alpha) * omega) / sine;
				s1 = Math.sin(alpha * omega) / sine;
			} 
			else 
			{        
		                s0 = 1.0 - alpha;
		                s1 = alpha;
			}
			        
			return new Quaternion(  s0 * qa.x + s1 * qb.x, 
						s0 * qa.y + s1 * qb.y,
						s0 * qa.z + s1 * qb.z,
						s0 * qa.w + s1 * qb.w );
		}
		
		/**
		 * SLERP (Spherical Linear intERPolation).
		 * 
		 * @param	qa		start quaternion
		 * @param	qb		end quaternion
		 * @param	alpha	a value between 0 and 1
		 * 
		 * @return the interpolated quaternion.
		 */
		public static function slerpOld( qa:Quaternion, qb:Quaternion, alpha:Number ):Quaternion
		{
			var qm:Quaternion = new Quaternion();
			
			// Calculate angle between them.
			var cosHalfTheta:Number = qa.w * qb.w + qa.x * qb.x + qa.y * qb.y + qa.z * qb.z;

			// if qa=qb or qa=-qb then theta = 0 and we can return qa
			if(Math.abs(cosHalfTheta) >= 1.0)
			{
				qm.w = qa.w;
				qm.x = qa.x;
				qm.y = qa.y;
				qm.z = qa.z;
				return qm;
			}
			
			// Calculate temporary values.
			var halfTheta:Number = Math.acos(cosHalfTheta);
			var sinHalfTheta:Number = Math.sqrt(1.0 - cosHalfTheta*cosHalfTheta);
			
			// if theta = 180 degrees then result is not fully defined
			// we could rotate around any axis normal to qa or qb
			if(Math.abs(sinHalfTheta) < 0.001)
			{
				qm.w = (qa.w * 0.5 + qb.w * 0.5);
				qm.x = (qa.x * 0.5 + qb.x * 0.5);
				qm.y = (qa.y * 0.5 + qb.y * 0.5);
				qm.z = (qa.z * 0.5 + qb.z * 0.5);
				return qm;
			}
			
			var ratioA:Number = Math.sin((1 - alpha) * halfTheta) / sinHalfTheta;
			var ratioB:Number = Math.sin(alpha * halfTheta) / sinHalfTheta; 
			
			//calculate Quaternion.
			qm.w = (qa.w * ratioA + qb.w * ratioB);
			qm.x = (qa.x * ratioA + qb.x * ratioB);
			qm.y = (qa.y * ratioA + qb.y * ratioB);
			qm.z = (qa.z * ratioA + qb.z * ratioB);
			
			return qm;
		}
		
		/**
		 * Gets the matrix representation of this Quaternion.
		 * 
		 * @return matrix. @see org.papervision3d.core.Matrix3D
		 */
		public function toMatrix():Matrix3D
		{
			var xx:Number = x * x;
			var xy:Number = x * y;
			var xz:Number = x * z;
			var xw:Number = x * w;
			var yy:Number = y * y;
			var yz:Number = y * z;
			var yw:Number = y * w;
			var zz:Number = z * z;
			var zw:Number = z * w;

			_matrix.n11 = 1 - 2 * ( yy + zz );
			_matrix.n12 =     2 * ( xy - zw );
			_matrix.n13 =     2 * ( xz + yw );
			
			_matrix.n21 =     2 * ( xy + zw );
			_matrix.n22 = 1 - 2 * ( xx + zz );
			_matrix.n23 =     2 * ( yz - xw );
			
			_matrix.n31 =     2 * ( xz - yw );
			_matrix.n32 =     2 * ( yz + xw );
			_matrix.n33 = 1 - 2 * ( xx + yy );
			
			return _matrix;
		}
		
		private var _matrix:Matrix3D;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产1区2区| 91在线你懂得| 日本一区二区三区久久久久久久久不| 99视频一区二区三区| 久久激情五月婷婷| 一区二区三区精品在线| 国产亚洲精品免费| 69成人精品免费视频| 色悠悠久久综合| 懂色av一区二区三区蜜臀| www.av精品| 亚洲最大成人综合| 久久亚洲一区二区三区四区| 欧美高清视频一二三区 | 成人avav在线| 琪琪久久久久日韩精品| 一区二区免费看| 亚洲天堂免费看| 国产精品久久久久久久久免费丝袜| 2020国产精品自拍| 欧美一二区视频| 717成人午夜免费福利电影| 日本韩国欧美一区| 99精品1区2区| 成人av电影在线播放| 国产jizzjizz一区二区| 国产麻豆一精品一av一免费| 久色婷婷小香蕉久久| 日韩av一二三| 日韩中文字幕91| 亚洲国产综合色| 亚洲一区二区av在线| 亚洲一区二区三区影院| 亚洲国产美国国产综合一区二区| 亚洲精品国产无天堂网2021| 日韩理论在线观看| **性色生活片久久毛片| 最新热久久免费视频| 亚洲视频电影在线| 国产精品成人免费| 亚洲精品综合在线| 亚洲免费av高清| 亚洲精品成人精品456| 亚洲欧美成人一区二区三区| 一区二区三区影院| 亚洲综合免费观看高清在线观看| 亚洲国产另类精品专区| 天天综合天天综合色| 日本vs亚洲vs韩国一区三区| 狠狠色狠狠色综合| 国产91精品久久久久久久网曝门| 成熟亚洲日本毛茸茸凸凹| av中文字幕亚洲| 欧美色大人视频| 日韩午夜精品视频| 欧美经典三级视频一区二区三区| 国产精品久久福利| 亚洲一区二区影院| 免费成人小视频| 国产成人精品三级麻豆| 91美女片黄在线| 欧美欧美午夜aⅴ在线观看| 日韩一区二区三区免费看| 国产亚洲精品资源在线26u| 日韩理论片在线| 日韩国产成人精品| 国产大陆精品国产| wwwwww.欧美系列| 久久九九99视频| 亚洲一区二区在线视频| 免费观看在线色综合| 懂色av一区二区三区免费看| 欧美少妇bbb| 久久亚洲二区三区| 亚洲人123区| 蜜桃视频在线一区| 99久久久久免费精品国产| 欧美日本不卡视频| 国产亚洲欧美色| 亚洲福利一二三区| 国产二区国产一区在线观看| 91福利在线看| 国产网红主播福利一区二区| 亚洲伊人色欲综合网| 激情综合亚洲精品| 日本二三区不卡| 久久久久久久久久久久久夜| 亚洲一区二区三区影院| 国产精品18久久久久久久久久久久 | 国产精品久99| 麻豆成人久久精品二区三区小说| 成人午夜激情在线| 欧美一区二区三区四区五区| 中文字幕欧美国产| 日本视频中文字幕一区二区三区| 99久久婷婷国产综合精品| 日韩午夜精品电影| 亚洲国产你懂的| 99久久伊人网影院| 久久天天做天天爱综合色| 亚洲成人黄色影院| 一本大道久久精品懂色aⅴ| 久久婷婷综合激情| 麻豆精品一二三| 欧美日韩中文另类| 亚洲视频你懂的| 丁香另类激情小说| 久久精品视频在线免费观看| 蜜臀久久久久久久| 欧美日本国产视频| 亚洲国产视频一区| 色婷婷综合在线| 日本一区二区三区电影| 国内外精品视频| 日韩三级.com| 日韩激情中文字幕| 欧美色图在线观看| 一区二区成人在线| 99re8在线精品视频免费播放| 久久精品亚洲麻豆av一区二区 | 日本久久电影网| 亚洲欧洲日产国码二区| 国产xxx精品视频大全| 久久一夜天堂av一区二区三区| 麻豆视频观看网址久久| 欧美日韩国产精品自在自线| 一区二区三区在线免费播放 | 91精品国产aⅴ一区二区| 亚洲午夜激情av| 欧美三级蜜桃2在线观看| 亚洲一级电影视频| 欧美三级日本三级少妇99| 亚洲成人激情综合网| 欧美日韩国产高清一区| 午夜电影一区二区三区| 欧美日韩一级片网站| 午夜精品在线视频一区| 欧美精品色综合| 蜜臀久久久99精品久久久久久| 宅男噜噜噜66一区二区66| 美女mm1313爽爽久久久蜜臀| 欧美va亚洲va香蕉在线| 国产一区二区美女诱惑| 国产亚洲精品免费| av在线不卡免费看| 亚洲一区二区精品视频| 555www色欧美视频| 国产一区在线观看视频| 国产欧美日韩视频在线观看| 成人av在线资源| 亚洲午夜一区二区| 欧美精品色一区二区三区| 九一九一国产精品| 欧美韩国日本综合| 色综合天天综合狠狠| 亚洲午夜在线电影| 日韩一区二区视频| 国产一区二区三区日韩| 中文字幕一区在线观看| 欧美亚洲愉拍一区二区| 久久99国产精品尤物| 国产亚洲va综合人人澡精品 | 久久亚洲综合色一区二区三区 | 日韩欧美国产系列| 国产69精品久久久久毛片| 亚洲精品免费在线观看| 在线不卡免费av| 国产乱码精品一区二区三区av| 亚洲男女毛片无遮挡| 欧美日韩国产精选| 国产九色精品成人porny| 亚洲精品国产a| 久久亚洲精精品中文字幕早川悠里 | 亚洲精品少妇30p| 欧美一级一区二区| 99久久免费精品高清特色大片| 偷拍一区二区三区四区| 国产亚洲制服色| 色94色欧美sute亚洲线路一久| 美国十次了思思久久精品导航| 国产精品女主播在线观看| 3d成人动漫网站| 成人免费av在线| 免费精品视频在线| 一区二区视频在线看| 精品国产青草久久久久福利| 在线观看免费一区| 国产福利一区在线| 日产国产高清一区二区三区| 精品在线视频一区| 亚洲人成7777| 久久久久久久国产精品影院| 欧美日韩国产三级| 国产成人精品亚洲777人妖 | 久久成人免费网| 一区二区三区四区激情| 国产亚洲va综合人人澡精品| 欧美一区二区三区日韩| 91老师片黄在线观看| 国产一区二区福利视频|