Matrix4.js 6.9 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4 5
/**
 * @author supereggbert / http://www.paulbrunt.co.uk/
 * @author mr.doob / http://mrdoob.com/
 */

M
Mr.doob 已提交
6
THREE.Matrix4 = function () {
M
Mr.doob 已提交
7

M
Mr.doob 已提交
8
	var x, y, z;
M
Mr.doob 已提交
9

M
Mr.doob 已提交
10 11 12
	x = new THREE.Vector3();
	y = new THREE.Vector3();
	z = new THREE.Vector3();
M
Mr.doob 已提交
13

M
Mr.doob 已提交
14 15 16 17
	this.n11 = 1; this.n12 = 0; this.n13 = 0; this.n14 = 0;
	this.n21 = 0; this.n22 = 1; this.n23 = 0; this.n24 = 0;
	this.n31 = 0; this.n32 = 0; this.n33 = 1; this.n34 = 0;
	this.n41 = 0; this.n42 = 0; this.n43 = 0; this.n44 = 1;
18

M
Mr.doob 已提交
19
	this.identity = function () {
20

M
Mr.doob 已提交
21 22 23
		this.n11 = 1; this.n12 = 0; this.n13 = 0; this.n14 = 0;
		this.n21 = 0; this.n22 = 1; this.n23 = 0; this.n24 = 0;
		this.n31 = 0; this.n32 = 0; this.n33 = 1; this.n34 = 0;
M
Mr.doob 已提交
24
		this.n41 = 0; this.n42 = 0; this.n43 = 0; this.n44 = 1;
M
Mr.doob 已提交
25
	};
26 27 28 29

	this.lookAt = function ( eye, center, up ) {

		z.sub( center, eye );
M
Mr.doob 已提交
30 31
		z.normalize();

32 33
		x.copy( z );
		x.crossSelf( up );
M
Mr.doob 已提交
34 35
		x.normalize();

36 37
		y.copy( x );
		y.crossSelf( z );
M
Mr.doob 已提交
38
		y.normalize();
M
Mr.doob 已提交
39 40 41 42 43
		y.negate();

		this.n11 = x.x; this.n12 = x.y; this.n13 = x.z; this.n14 = - x.dot( eye );
		this.n21 = y.x; this.n22 = y.y; this.n23 = y.z; this.n24 = - y.dot( eye );
		this.n31 = z.x; this.n32 = z.y; this.n33 = z.z; this.n34 = - z.dot( eye );
M
Mr.doob 已提交
44
	};
M
Mr.doob 已提交
45

46 47
	this.transform = function ( v ) {

M
Mr.doob 已提交
48
		var vx = v.x, vy = v.y, vz = v.z, vw = v.w ? v.w : 1.0;
49

M
Mr.doob 已提交
50 51 52 53 54 55
		v.x = this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14 * vw;
		v.y = this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24 * vw;
		v.z = this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 * vw;

		vw = this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 * vw;

56 57
		if( v.w ) {

M
Mr.doob 已提交
58
			v.w = vw;
59

M
Mr.doob 已提交
60
		} else {
61

M
Mr.doob 已提交
62 63 64
			v.x = v.x / vw;
			v.y = v.y / vw;
			v.z = v.z / vw;
65

M
Mr.doob 已提交
66
		}
M
Mr.doob 已提交
67
	};
68 69 70

	this.crossVector = function ( a ) {

M
Mr.doob 已提交
71
		var v = new THREE.Vector4();
72

M
Mr.doob 已提交
73 74 75
		v.x = this.n11 * a.x + this.n12 * a.y + this.n13 * a.z + this.n14 * a.w;
		v.y = this.n21 * a.x + this.n22 * a.y + this.n23 * a.z + this.n24 * a.w;
		v.z = this.n31 * a.x + this.n32 * a.y + this.n33 * a.z + this.n34 * a.w;
76 77 78

		v.w = ( a.w ) ? this.n41 * a.x + this.n42 * a.y + this.n43 * a.z + this.n44 * a.w : 1;

M
Mr.doob 已提交
79
		return v;
80

M
Mr.doob 已提交
81
	};
M
Mr.doob 已提交
82

83 84
	this.multiply = function ( a, b ) {

M
Mr.doob 已提交
85 86 87 88 89 90 91
		this.n11 = a.n11 * b.n11 + a.n12 * b.n21 + a.n13 * b.n31 + a.n14 * b.n41;
		this.n12 = a.n11 * b.n12 + a.n12 * b.n22 + a.n13 * b.n32 + a.n14 * b.n42;
		this.n13 = a.n11 * b.n13 + a.n12 * b.n23 + a.n13 * b.n33 + a.n14 * b.n43;
		this.n14 = a.n11 * b.n14 + a.n12 * b.n24 + a.n13 * b.n34 + a.n14 * b.n44;

		this.n21 = a.n21 * b.n11 + a.n22 * b.n21 + a.n23 * b.n31 + a.n24 * b.n41;
		this.n22 = a.n21 * b.n12 + a.n22 * b.n22 + a.n23 * b.n32 + a.n24 * b.n42;
92
		this.n23 = a.n21 * b.n13 + a.n22 * b.n23 + a.n23 * b.n33 + a.n24 * b.n43;
M
Mr.doob 已提交
93 94 95 96 97 98 99 100 101 102 103
		this.n24 = a.n21 * b.n14 + a.n22 * b.n24 + a.n23 * b.n34 + a.n24 * b.n44;

		this.n31 = a.n31 * b.n11 + a.n32 * b.n21 + a.n33 * b.n31 + a.n34 * b.n41;
		this.n32 = a.n31 * b.n12 + a.n32 * b.n22 + a.n33 * b.n32 + a.n34 * b.n42;
		this.n33 = a.n31 * b.n13 + a.n32 * b.n23 + a.n33 * b.n33 + a.n34 * b.n43;
		this.n34 = a.n31 * b.n14 + a.n32 * b.n24 + a.n33 * b.n34 + a.n34 * b.n44;

		this.n41 = a.n41 * b.n11 + a.n42 * b.n21 + a.n43 * b.n31 + a.n44 * b.n41;
		this.n42 = a.n41 * b.n12 + a.n42 * b.n22 + a.n43 * b.n32 + a.n44 * b.n42;
		this.n43 = a.n41 * b.n13 + a.n42 * b.n23 + a.n43 * b.n33 + a.n44 * b.n43;
		this.n44 = a.n41 * b.n14 + a.n42 * b.n24 + a.n43 * b.n34 + a.n44 * b.n44;
104

M
Mr.doob 已提交
105
	};
M
Mr.doob 已提交
106

107 108
	this.multiplySelf = function ( m ) {

M
Mr.doob 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
		var n11 = this.n11, n12 = this.n12, n13 = this.n13, n14 = this.n14,
		n21 = this.n21, n22 = this.n22, n23 = this.n23, n24 = this.n24,
		n31 = this.n31, n32 = this.n32, n33 = this.n33, n34 = this.n34,
		n41 = this.n41, n42 = this.n42, n43 = this.n43, n44 = this.n44;

		this.n11 = n11 * m.n11 + n12 * m.n21 + n13 * m.n31 + n14 * m.n41;
		this.n12 = n11 * m.n12 + n12 * m.n22 + n13 * m.n32 + n14 * m.n42;
		this.n13 = n11 * m.n13 + n12 * m.n23 + n13 * m.n33 + n14 * m.n43;
		this.n14 = n11 * m.n14 + n12 * m.n24 + n13 * m.n34 + n14 * m.n44;

		this.n21 = n21 * m.n11 + n22 * m.n21 + n23 * m.n31 + n24 * m.n41;
		this.n22 = n21 * m.n12 + n22 * m.n22 + n23 * m.n32 + n24 * m.n42;
		this.n23 = n21 * m.n13 + n22 * m.n23 + n23 * m.n33 + n24 * m.n43;
		this.n24 = n21 * m.n14 + n22 * m.n24 + n23 * m.n34 + n24 * m.n44;

		this.n31 = n31 * m.n11 + n32 * m.n21 + n33 * m.n31 + n34 * m.n41;
		this.n32 = n31 * m.n12 + n32 * m.n22 + n33 * m.n32 + n34 * m.n42;
		this.n33 = n31 * m.n13 + n32 * m.n23 + n33 * m.n33 + n34 * m.n43;
		this.n34 = n31 * m.n14 + n32 * m.n24 + n33 * m.n34 + n34 * m.n44;

		this.n41 = n41 * m.n11 + n42 * m.n21 + n43 * m.n31 + n44 * m.n41;
		this.n42 = n41 * m.n12 + n42 * m.n22 + n43 * m.n32 + n44 * m.n42;
		this.n43 = n41 * m.n13 + n42 * m.n23 + n43 * m.n33 + n44 * m.n43;
		this.n44 = n41 * m.n14 + n42 * m.n24 + n43 * m.n34 + n44 * m.n44;
133

M
Mr.doob 已提交
134
	};
M
Mr.doob 已提交
135

M
Mr.doob 已提交
136
	this.clone = function () {
137

M
Mr.doob 已提交
138
		var m = new THREE.Matrix4();
M
Mr.doob 已提交
139 140 141
		m.n11 = this.n11; m.n12 = this.n12; m.n13 = this.n13; m.n14 = this.n14;
		m.n21 = this.n21; m.n22 = this.n22; m.n23 = this.n23; m.n24 = this.n24;
		m.n31 = this.n31; m.n32 = this.n32; m.n33 = this.n33; m.n34 = this.n34;
M
Mr.doob 已提交
142
		m.n41 = this.n41; m.n42 = this.n42; m.n43 = this.n43; m.n44 = this.n44;
M
Mr.doob 已提交
143
		return m;
144

M
Mr.doob 已提交
145
	};
146

M
Mr.doob 已提交
147
	this.toString = function() {
148 149 150 151 152 153

		return "| " + this.n11 + " " + this.n12 + " " + this.n13 + " " + this.n14 + " |\n" +
			"| " + this.n21 + " " + this.n22 + " " + this.n23 + " " + this.n24 + " |\n" +
			"| " + this.n31 + " " + this.n32 + " " + this.n33 + " " + this.n34 + " |\n" +
			"| " + this.n41 + " " + this.n42 + " " + this.n43 + " " + this.n44 + " |";

M
Mr.doob 已提交
154
	};
155

M
Mr.doob 已提交
156
};
M
Mr.doob 已提交
157

158
THREE.Matrix4.translationMatrix = function ( x, y, z ) {
M
Mr.doob 已提交
159

M
Mr.doob 已提交
160
	var m = new THREE.Matrix4();
M
Mr.doob 已提交
161 162 163 164 165 166

	m.n14 = x;
	m.n24 = y;
	m.n34 = z;

	return m;
167

M
Mr.doob 已提交
168
};
M
Mr.doob 已提交
169

170
THREE.Matrix4.scaleMatrix = function ( x, y, z ) {
M
Mr.doob 已提交
171 172

	var m = new THREE.Matrix4();
M
Mr.doob 已提交
173 174 175 176 177 178

	m.n11 = x;
	m.n22 = y;
	m.n33 = z;

	return m;
179

M
Mr.doob 已提交
180
};
M
Mr.doob 已提交
181

182
THREE.Matrix4.rotationXMatrix = function ( theta ) {
M
Mr.doob 已提交
183 184

	var rot = new THREE.Matrix4();
M
Mr.doob 已提交
185

186 187 188
	rot.n22 = rot.n33 = Math.cos( theta );
	rot.n32 = Math.sin( theta );
	rot.n23 = - rot.n32;
M
Mr.doob 已提交
189 190

	return rot;
191

M
Mr.doob 已提交
192
};
M
Mr.doob 已提交
193

194
THREE.Matrix4.rotationYMatrix = function ( theta ) {
M
Mr.doob 已提交
195 196

	var rot = new THREE.Matrix4();
M
Mr.doob 已提交
197

198 199 200
	rot.n11 = rot.n33 = Math.cos( theta );
	rot.n13 = Math.sin( theta );
	rot.n31 = - rot.n13;
M
Mr.doob 已提交
201 202

	return rot;
203

M
Mr.doob 已提交
204
};
M
Mr.doob 已提交
205

206
THREE.Matrix4.rotationZMatrix = function( theta ) {
M
Mr.doob 已提交
207 208

	var rot = new THREE.Matrix4();
M
Mr.doob 已提交
209

210 211 212
	rot.n11 = rot.n22 = Math.cos( theta );
	rot.n21 = Math.sin( theta );
	rot.n12 = - rot.n21;
M
Mr.doob 已提交
213 214

	return rot;
215

M
Mr.doob 已提交
216
};
M
Mr.doob 已提交
217

218
THREE.Matrix4.makeFrustum = function( left, right, bottom, top, near, far ) {
M
Mr.doob 已提交
219 220 221

	var m = new THREE.Matrix4(),

222 223 224 225 226 227
	x = 2 * near / ( right - left ),
	y = 2 * near / ( top - bottom ),
	a = ( right + left ) / ( right - left ),
	b = ( top + bottom ) / ( top - bottom ),
	c = - ( far + near ) / ( far - near ),
	d = - 2 * far * near / ( far - near );
M
Mr.doob 已提交
228 229 230 231

	m.n11 = x; m.n13 = a;
	m.n22 = y; m.n23 = b;
	m.n33 = c; m.n34 = d;
232
	m.n43 = - 1; m.n44 = 0;
M
Mr.doob 已提交
233 234

	return m;
235

M
Mr.doob 已提交
236
};
M
Mr.doob 已提交
237

238
THREE.Matrix4.makePerspective = function( fovy, aspect, near, far ) {
M
Mr.doob 已提交
239

240 241
	var ymax = near * Math.tan( fovy * 0.00872664625972 ),
	ymin = - ymax,
M
Mr.doob 已提交
242 243
	xmin = ymin * aspect,
	xmax = ymax * aspect;
244 245 246

	return THREE.Matrix4.makeFrustum( xmin, xmax, ymin, ymax, near, far );

M
Mr.doob 已提交
247
};