-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtransformObj.js
95 lines (85 loc) · 3.48 KB
/
transformObj.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
function transformObj() {
this.identity = function () {
this.m = [1, 0, 0, 0, /* row 1*/
0, 1, 0, 0, /*row 2*/
0, 0, 1, 0, /*row 3*/
0, 0, 0, 1];/*row 4*/
}
this.multiply = function(a,b){
var m = [];
//First row
var _b0 = b[0], _b1 = b[1], _b2 = b[2], _b3 = b[3];
m[0] = a[0] * _b0 + a[4] * _b1 + a[8] * _b2 + a[12] * _b3;
m[1] = a[0 + 1] * _b0 + a[4 + 1] * _b1 + a[8 + 1] * _b2 + a[12 + 1] * _b3;
m[2] = a[0 + 2] * _b0 + a[4 + 2] * _b1 + a[8 + 2] * _b2 + a[12 + 2] * _b3;
m[3] = a[0 + 3] * _b0 + a[4 + 3] * _b1 + a[8 + 3] * _b2 + a[12 + 3] * _b3;
//Second row
_b0 = b[4], _b1 = b[5], _b2 = b[6], _b3 = b[7];
m[4] = a[0] * _b0 + a[4] * _b1 + a[8] * _b2 + a[12] * _b3;
m[5] = a[0 + 1] * _b0 + a[4 + 1] * _b1 + a[8 + 1] * _b2 + a[12 + 1] * _b3;
m[6] = a[0 + 2] * _b0 + a[4 + 2] * _b1 + a[8 + 2] * _b2 + a[12 + 2] * _b3;
m[7] = a[0 + 3] * _b0 + a[4 + 3] * _b1 + a[8 + 3] * _b2 + a[12 + 3] * _b3;
//Third Row
_b0 = b[8], _b1 = b[9], _b2 = b[10], _b3 = b[11];
m[8] = a[0] * _b0 + a[4] * _b1 + a[8] * _b2 + a[12] * _b3;
m[9] = a[0 + 1] * _b0 + a[4 + 1] * _b1 + a[8 + 1] * _b2 + a[12 + 1] * _b3;
m[10] = a[0 + 2] * _b0 + a[4 + 2] * _b1 + a[8 + 2] * _b2 + a[12 + 2] * _b3;
m[11] = a[0 + 3] * _b0 + a[4 + 3] * _b1 + a[8 + 3] * _b2 + a[12 + 3] * _b3;
//Fourth Row
_b0 = b[12], _b1 = b[13], _b2 = b[14], _b3 = b[15];
m[12] = a[0] * _b0 + a[4] * _b1 + a[8] * _b2 + a[12] * _b3;
m[13] = a[0 + 1] * _b0 + a[4 + 1] * _b1 + a[8 + 1] * _b2 + a[12 + 1] * _b3;
m[14] = a[0 + 2] * _b0 + a[4 + 2] * _b1 + a[8 + 2] * _b2 + a[12 + 2] * _b3;
m[15] = a[0 + 3] * _b0 + a[4 + 3] * _b1 + a[8 + 3] * _b2 + a[12 + 3] * _b3;
return m;
}
this.translate = function (a,b,c) {
var t = [1, 0, 0, 0,
/**/ 0, 1, 0, 0,
/**/ 0, 0, 1, 0,
/**/ a, b, c, 1];
this.m = this.multiply(t, this.m);
}
this.rotateX = function (rad) {
var c = Math.cos(rad);
var s = Math.sin(rad);
var rx = [1, 0, 0, 0, /**/
0, c, s, 0, /**/
0, -s, c, 0, /**/
0, 0, 0, 1];
this.m = this.multiply(rx, this.m);
}
this.rotateY = function (rad) {
var c = Math.cos(rad);
var s = Math.sin(rad);
var ry = [c, 0, -s, 0, /**/
0, 1, 0, 0, /**/
s, 0, c, 0, /**/
0, 0, 0, 1]
this.m = this.multiply(ry, this.m);
}
this.rotateZ = function (rad) {
var c = Math.cos(rad);
var s = Math.sin(rad);
var rz = [c, s, 0, 0, /**/
-s, c, 0, 0, /**/
0, 0, 1, 0, /**/
0, 0, 0, 1]
this.m = this.multiply(rz, this.m);
}
this.scale = function (a,b,c) {
b = b || a; c = c || a;
var scale = [a, 0, 0, 0, /**/
0, b, 0, 0, /**/
0, 0, c, 0, /**/
0, 0, 0, 1];
this.m = this.multiply(scale, this.m);
}
this.transform = function (p) {
return [this.m[0] * p[0] + this.m[4] * p[1] + this.m[8] * p[2] + this.m[12],
this.m[1] * p[0] + this.m[5] * p[1] + this.m[9] * p[2] + this.m[13],
this.m[2] * p[0] + this.m[6] * p[1] + this.m[10] * p[2] + this.m[14]];
return p;
}
};
var m = new transformObj();