|
2 | 2 | // http://www.speich.net/computer/moztesting/3d.htm
|
3 | 3 | // Created by Simon Speich
|
4 | 4 |
|
| 5 | + |
| 6 | +function CalcCross(V0, V1) { |
| 7 | + var Cross = new Array(); |
| 8 | + Cross[0] = V0[1]*V1[2] - V0[2]*V1[1]; |
| 9 | + Cross[1] = V0[2]*V1[0] - V0[0]*V1[2]; |
| 10 | + Cross[2] = V0[0]*V1[1] - V0[1]*V1[0]; |
| 11 | + return Cross; |
| 12 | +} |
| 13 | + |
| 14 | +function CalcNormal(V0, V1, V2) { |
| 15 | + var A = new Array(); |
| 16 | + var B = new Array(); |
| 17 | + for (var i = 0; i < 3; i++) { |
| 18 | + A[i] = V0[i] - V1[i]; |
| 19 | + B[i] = V2[i] - V1[i]; |
| 20 | + } |
| 21 | + A = CalcCross(A, B); |
| 22 | + var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); |
| 23 | + for (var i = 0; i < 3; i++) A[i] = A[i] / Length; |
| 24 | + A[3] = 1; |
| 25 | + return A; |
| 26 | +} |
| 27 | + |
| 28 | +function CreateP(X,Y,Z) { |
| 29 | + this.V = [X,Y,Z,1]; |
| 30 | +} |
| 31 | + |
| 32 | +// multiplies two matrices |
| 33 | +function MMulti(M1, M2) { |
| 34 | + var M = [[],[],[],[]]; |
| 35 | + var i = 0; |
| 36 | + var j = 0; |
| 37 | + for (; i < 4; i++) { |
| 38 | + j = 0; |
| 39 | + for (; j < 4; j++) M[i][j] = M1[i][0] * M2[0][j] + M1[i][1] * M2[1][j] + M1[i][2] * M2[2][j] + M1[i][3] * M2[3][j]; |
| 40 | + } |
| 41 | + return M; |
| 42 | +} |
| 43 | + |
| 44 | +//multiplies matrix with vector |
| 45 | +function VMulti(M, V) { |
| 46 | + var Vect = new Array(); |
| 47 | + var i = 0; |
| 48 | + for (;i < 4; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2] + M[i][3] * V[3]; |
| 49 | + return Vect; |
| 50 | +} |
| 51 | + |
| 52 | +function VMulti2(M, V) { |
| 53 | + var Vect = new Array(); |
| 54 | + var i = 0; |
| 55 | + for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2]; |
| 56 | + return Vect; |
| 57 | +} |
| 58 | + |
| 59 | +// add to matrices |
| 60 | +function MAdd(M1, M2) { |
| 61 | + var M = [[],[],[],[]]; |
| 62 | + var i = 0; |
| 63 | + var j = 0; |
| 64 | + for (; i < 4; i++) { |
| 65 | + j = 0; |
| 66 | + for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j]; |
| 67 | + } |
| 68 | + return M; |
| 69 | +} |
| 70 | + |
| 71 | +function Translate(M, Dx, Dy, Dz) { |
| 72 | + var T = [ |
| 73 | + [1,0,0,Dx], |
| 74 | + [0,1,0,Dy], |
| 75 | + [0,0,1,Dz], |
| 76 | + [0,0,0,1] |
| 77 | + ]; |
| 78 | + return MMulti(T, M); |
| 79 | +} |
| 80 | + |
| 81 | +function RotateX(M, Phi) { |
| 82 | + var a = Phi; |
| 83 | + a *= Math.PI / 180; |
| 84 | + var Cos = Math.cos(a); |
| 85 | + var Sin = Math.sin(a); |
| 86 | + var R = [ |
| 87 | + [1,0,0,0], |
| 88 | + [0,Cos,-Sin,0], |
| 89 | + [0,Sin,Cos,0], |
| 90 | + [0,0,0,1] |
| 91 | + ]; |
| 92 | + return MMulti(R, M); |
| 93 | +} |
| 94 | + |
| 95 | +function RotateY(M, Phi) { |
| 96 | + var a = Phi; |
| 97 | + a *= Math.PI / 180; |
| 98 | + var Cos = Math.cos(a); |
| 99 | + var Sin = Math.sin(a); |
| 100 | + var R = [ |
| 101 | + [Cos,0,Sin,0], |
| 102 | + [0,1,0,0], |
| 103 | + [-Sin,0,Cos,0], |
| 104 | + [0,0,0,1] |
| 105 | + ]; |
| 106 | + return MMulti(R, M); |
| 107 | +} |
| 108 | + |
| 109 | +function RotateZ(M, Phi) { |
| 110 | + var a = Phi; |
| 111 | + a *= Math.PI / 180; |
| 112 | + var Cos = Math.cos(a); |
| 113 | + var Sin = Math.sin(a); |
| 114 | + var R = [ |
| 115 | + [Cos,-Sin,0,0], |
| 116 | + [Sin,Cos,0,0], |
| 117 | + [0,0,1,0], |
| 118 | + [0,0,0,1] |
| 119 | + ]; |
| 120 | + return MMulti(R, M); |
| 121 | +} |
| 122 | + |
5 | 123 | function run() {
|
6 | 124 | var Q = new Array();
|
7 | 125 | var MTrans = new Array(); // transformation matrix
|
@@ -74,123 +192,6 @@ function run() {
|
74 | 192 | Q.LastPx = NumPix;
|
75 | 193 | }
|
76 | 194 |
|
77 |
| - function CalcCross(V0, V1) { |
78 |
| - var Cross = new Array(); |
79 |
| - Cross[0] = V0[1]*V1[2] - V0[2]*V1[1]; |
80 |
| - Cross[1] = V0[2]*V1[0] - V0[0]*V1[2]; |
81 |
| - Cross[2] = V0[0]*V1[1] - V0[1]*V1[0]; |
82 |
| - return Cross; |
83 |
| - } |
84 |
| - |
85 |
| - function CalcNormal(V0, V1, V2) { |
86 |
| - var A = new Array(); |
87 |
| - var B = new Array(); |
88 |
| - for (var i = 0; i < 3; i++) { |
89 |
| - A[i] = V0[i] - V1[i]; |
90 |
| - B[i] = V2[i] - V1[i]; |
91 |
| - } |
92 |
| - A = CalcCross(A, B); |
93 |
| - var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); |
94 |
| - for (var i = 0; i < 3; i++) A[i] = A[i] / Length; |
95 |
| - A[3] = 1; |
96 |
| - return A; |
97 |
| - } |
98 |
| - |
99 |
| - function CreateP(X,Y,Z) { |
100 |
| - this.V = [X,Y,Z,1]; |
101 |
| - } |
102 |
| - |
103 |
| - // multiplies two matrices |
104 |
| - function MMulti(M1, M2) { |
105 |
| - var M = [[],[],[],[]]; |
106 |
| - var i = 0; |
107 |
| - var j = 0; |
108 |
| - for (; i < 4; i++) { |
109 |
| - j = 0; |
110 |
| - for (; j < 4; j++) M[i][j] = M1[i][0] * M2[0][j] + M1[i][1] * M2[1][j] + M1[i][2] * M2[2][j] + M1[i][3] * M2[3][j]; |
111 |
| - } |
112 |
| - return M; |
113 |
| - } |
114 |
| - |
115 |
| - //multiplies matrix with vector |
116 |
| - function VMulti(M, V) { |
117 |
| - var Vect = new Array(); |
118 |
| - var i = 0; |
119 |
| - for (;i < 4; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2] + M[i][3] * V[3]; |
120 |
| - return Vect; |
121 |
| - } |
122 |
| - |
123 |
| - function VMulti2(M, V) { |
124 |
| - var Vect = new Array(); |
125 |
| - var i = 0; |
126 |
| - for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2]; |
127 |
| - return Vect; |
128 |
| - } |
129 |
| - |
130 |
| - // add to matrices |
131 |
| - function MAdd(M1, M2) { |
132 |
| - var M = [[],[],[],[]]; |
133 |
| - var i = 0; |
134 |
| - var j = 0; |
135 |
| - for (; i < 4; i++) { |
136 |
| - j = 0; |
137 |
| - for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j]; |
138 |
| - } |
139 |
| - return M; |
140 |
| - } |
141 |
| - |
142 |
| - function Translate(M, Dx, Dy, Dz) { |
143 |
| - var T = [ |
144 |
| - [1,0,0,Dx], |
145 |
| - [0,1,0,Dy], |
146 |
| - [0,0,1,Dz], |
147 |
| - [0,0,0,1] |
148 |
| - ]; |
149 |
| - return MMulti(T, M); |
150 |
| - } |
151 |
| - |
152 |
| - function RotateX(M, Phi) { |
153 |
| - var a = Phi; |
154 |
| - a *= Math.PI / 180; |
155 |
| - var Cos = Math.cos(a); |
156 |
| - var Sin = Math.sin(a); |
157 |
| - var R = [ |
158 |
| - [1,0,0,0], |
159 |
| - [0,Cos,-Sin,0], |
160 |
| - [0,Sin,Cos,0], |
161 |
| - [0,0,0,1] |
162 |
| - ]; |
163 |
| - return MMulti(R, M); |
164 |
| - } |
165 |
| - |
166 |
| - function RotateY(M, Phi) { |
167 |
| - var a = Phi; |
168 |
| - a *= Math.PI / 180; |
169 |
| - var Cos = Math.cos(a); |
170 |
| - var Sin = Math.sin(a); |
171 |
| - var R = [ |
172 |
| - [Cos,0,Sin,0], |
173 |
| - [0,1,0,0], |
174 |
| - [-Sin,0,Cos,0], |
175 |
| - [0,0,0,1] |
176 |
| - ]; |
177 |
| - return MMulti(R, M); |
178 |
| - } |
179 |
| - |
180 |
| - function RotateZ(M, Phi) { |
181 |
| - var a = Phi; |
182 |
| - a *= Math.PI / 180; |
183 |
| - var Cos = Math.cos(a); |
184 |
| - var Sin = Math.sin(a); |
185 |
| - var R = [ |
186 |
| - [Cos,-Sin,0,0], |
187 |
| - [Sin,Cos,0,0], |
188 |
| - [0,0,1,0], |
189 |
| - [0,0,0,1] |
190 |
| - ]; |
191 |
| - return MMulti(R, M); |
192 |
| - } |
193 |
| - |
194 | 195 | function DrawQube() {
|
195 | 196 | // calc current normals
|
196 | 197 | var CurN = new Array();
|
|
0 commit comments