2 // http://www.speich.net/computer/moztesting/3d.htm
3 // Created by Simon Speich
6 var MTrans
= new Array(); // transformation matrix
7 var MQube
= new Array(); // position information of qube
8 var I
= new Array(); // entity matrix
9 var Origin
= new Object();
10 var Testing
= new Object();
13 var DisplArea
= new Object();
14 DisplArea
.Width
= 300;
15 DisplArea
.Height
= 300;
17 function DrawLine(From
, To
) {
22 var dx
= Math
.abs(x2
- x1
);
23 var dy
= Math
.abs(y2
- y1
);
33 if (x2
>= x1
) { IncX1
= 1; IncX2
= 1; }
34 else { IncX1
= -1; IncX2
= -1; }
35 if (y2
>= y1
) { IncY1
= 1; IncY2
= 1; }
36 else { IncY1
= -1; IncY2
= -1; }
54 NumPix
= Math
.round(Q
.LastPx
+ NumPix
);
57 for (; i
< NumPix
; i
++) {
70 function CalcCross(V0
, V1
) {
71 var Cross
= new Array();
72 Cross
[0] = V0
[1]*V1
[2] - V0
[2]*V1
[1];
73 Cross
[1] = V0
[2]*V1
[0] - V0
[0]*V1
[2];
74 Cross
[2] = V0
[0]*V1
[1] - V0
[1]*V1
[0];
78 function CalcNormal(V0
, V1
, V2
) {
79 var A
= new Array(); var B
= new Array();
80 for (var i
= 0; i
< 3; i
++) {
85 var Length
= Math
.sqrt(A
[0]*A
[0] + A
[1]*A
[1] + A
[2]*A
[2]);
86 for (var i
= 0; i
< 3; i
++) A
[i
] = A
[i
] / Length
;
91 function CreateP(X
,Y
,Z
) {
95 // multiplies two matrices
96 function MMulti(M1
, M2
) {
97 var M
= [[],[],[],[]];
102 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
];
107 //multiplies matrix with vector
108 function VMulti(M
, V
) {
109 var Vect
= new Array();
111 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];
115 function VMulti2(M
, V
) {
116 var Vect
= new Array();
118 for (;i
< 3; i
++) Vect
[i
] = M
[i
][0] * V
[0] + M
[i
][1] * V
[1] + M
[i
][2] * V
[2];
123 function MAdd(M1
, M2
) {
124 var M
= [[],[],[],[]];
129 for (; j
< 4; j
++) M
[i
][j
] = M1
[i
][j
] + M2
[i
][j
];
134 function Translate(M
, Dx
, Dy
, Dz
) {
144 function RotateX(M
, Phi
) {
147 var Cos
= Math
.cos(a
);
148 var Sin
= Math
.sin(a
);
158 function RotateY(M
, Phi
) {
161 var Cos
= Math
.cos(a
);
162 var Sin
= Math
.sin(a
);
172 function RotateZ(M
, Phi
) {
175 var Cos
= Math
.cos(a
);
176 var Sin
= Math
.sin(a
);
186 function DrawQube() {
187 // calc current normals
188 var CurN
= new Array();
191 for (; i
> -1; i
--) CurN
[i
] = VMulti2(MQube
, Q
.Normal
[i
]);
192 if (CurN
[0][2] < 0) {
193 if (!Q
.Line
[0]) { DrawLine(Q
[0], Q
[1]); Q
.Line
[0] = true; };
194 if (!Q
.Line
[1]) { DrawLine(Q
[1], Q
[2]); Q
.Line
[1] = true; };
195 if (!Q
.Line
[2]) { DrawLine(Q
[2], Q
[3]); Q
.Line
[2] = true; };
196 if (!Q
.Line
[3]) { DrawLine(Q
[3], Q
[0]); Q
.Line
[3] = true; };
198 if (CurN
[1][2] < 0) {
199 if (!Q
.Line
[2]) { DrawLine(Q
[3], Q
[2]); Q
.Line
[2] = true; };
200 if (!Q
.Line
[9]) { DrawLine(Q
[2], Q
[6]); Q
.Line
[9] = true; };
201 if (!Q
.Line
[6]) { DrawLine(Q
[6], Q
[7]); Q
.Line
[6] = true; };
202 if (!Q
.Line
[10]) { DrawLine(Q
[7], Q
[3]); Q
.Line
[10] = true; };
204 if (CurN
[2][2] < 0) {
205 if (!Q
.Line
[4]) { DrawLine(Q
[4], Q
[5]); Q
.Line
[4] = true; };
206 if (!Q
.Line
[5]) { DrawLine(Q
[5], Q
[6]); Q
.Line
[5] = true; };
207 if (!Q
.Line
[6]) { DrawLine(Q
[6], Q
[7]); Q
.Line
[6] = true; };
208 if (!Q
.Line
[7]) { DrawLine(Q
[7], Q
[4]); Q
.Line
[7] = true; };
210 if (CurN
[3][2] < 0) {
211 if (!Q
.Line
[4]) { DrawLine(Q
[4], Q
[5]); Q
.Line
[4] = true; };
212 if (!Q
.Line
[8]) { DrawLine(Q
[5], Q
[1]); Q
.Line
[8] = true; };
213 if (!Q
.Line
[0]) { DrawLine(Q
[1], Q
[0]); Q
.Line
[0] = true; };
214 if (!Q
.Line
[11]) { DrawLine(Q
[0], Q
[4]); Q
.Line
[11] = true; };
216 if (CurN
[4][2] < 0) {
217 if (!Q
.Line
[11]) { DrawLine(Q
[4], Q
[0]); Q
.Line
[11] = true; };
218 if (!Q
.Line
[3]) { DrawLine(Q
[0], Q
[3]); Q
.Line
[3] = true; };
219 if (!Q
.Line
[10]) { DrawLine(Q
[3], Q
[7]); Q
.Line
[10] = true; };
220 if (!Q
.Line
[7]) { DrawLine(Q
[7], Q
[4]); Q
.Line
[7] = true; };
222 if (CurN
[5][2] < 0) {
223 if (!Q
.Line
[8]) { DrawLine(Q
[1], Q
[5]); Q
.Line
[8] = true; };
224 if (!Q
.Line
[5]) { DrawLine(Q
[5], Q
[6]); Q
.Line
[5] = true; };
225 if (!Q
.Line
[9]) { DrawLine(Q
[6], Q
[2]); Q
.Line
[9] = true; };
226 if (!Q
.Line
[1]) { DrawLine(Q
[2], Q
[1]); Q
.Line
[1] = true; };
228 Q
.Line
= [false,false,false,false,false,false,false,false,false,false,false,false];
233 if (Testing
.LoopCount
> Testing
.LoopMax
) return;
234 var TestingStr
= String(Testing
.LoopCount
);
235 while (TestingStr
.length
< 3) TestingStr
= "0" + TestingStr
;
236 MTrans
= Translate(I
, -Q
[8].V
[0], -Q
[8].V
[1], -Q
[8].V
[2]);
237 MTrans
= RotateX(MTrans
, 1);
238 MTrans
= RotateY(MTrans
, 3);
239 MTrans
= RotateZ(MTrans
, 5);
240 MTrans
= Translate(MTrans
, Q
[8].V
[0], Q
[8].V
[1], Q
[8].V
[2]);
241 MQube
= MMulti(MTrans
, MQube
);
243 for (; i
> -1; i
--) {
244 Q
[i
].V
= VMulti(MTrans
, Q
[i
].V
);
251 function Init(CubeSize
) {
253 Origin
.V
= [150,150,20,1];
254 Testing
.LoopCount
= 0;
255 Testing
.LoopMax
= 50;
259 Testing
.TimeTemp
= 0;
260 Testing
.TimeTotal
= 0;
261 Testing
.Init
= false;
263 // transformation matrix
271 // position information of qube
288 Q
[0] = new CreateP(-CubeSize
,-CubeSize
, CubeSize
);
289 Q
[1] = new CreateP(-CubeSize
, CubeSize
, CubeSize
);
290 Q
[2] = new CreateP( CubeSize
, CubeSize
, CubeSize
);
291 Q
[3] = new CreateP( CubeSize
,-CubeSize
, CubeSize
);
292 Q
[4] = new CreateP(-CubeSize
,-CubeSize
,-CubeSize
);
293 Q
[5] = new CreateP(-CubeSize
, CubeSize
,-CubeSize
);
294 Q
[6] = new CreateP( CubeSize
, CubeSize
,-CubeSize
);
295 Q
[7] = new CreateP( CubeSize
,-CubeSize
,-CubeSize
);
298 Q
[8] = new CreateP(0, 0, 0);
300 // anti-clockwise edge check
301 Q
.Edge
= [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
303 // calculate squad normals
304 Q
.Normal
= new Array();
305 for (var i
= 0; i
< Q
.Edge
.length
; i
++) Q
.Normal
[i
] = CalcNormal(Q
[Q
.Edge
[i
][0]].V
, Q
[Q
.Edge
[i
][1]].V
, Q
[Q
.Edge
[i
][2]].V
);
308 Q
.Line
= [false,false,false,false,false,false,false,false,false,false,false,false];
310 // create line pixels
311 Q
.NumPx
= 9 * 2 * CubeSize
;
312 for (var i
= 0; i
< Q
.NumPx
; i
++) CreateP(0,0,0);
314 MTrans
= Translate(MTrans
, Origin
.V
[0], Origin
.V
[1], Origin
.V
[2]);
315 MQube
= MMulti(MTrans
, MQube
);
319 Q
[i
].V
= VMulti(MTrans
, Q
[i
].V
);
326 for ( var i
= 20; i
<= 160; i
*= 2 ) {