From 694c0973f81aed3edc2a6cbe235e4be89b9bbad0 Mon Sep 17 00:00:00 2001
From: fdai7322 <christoph-anton.schwierz@informatik.hs-fulda.de>
Date: Mon, 8 Jul 2024 18:47:42 +0200
Subject: [PATCH] raytracing2 animation

---
 index.html                                    |   2 +-
 src/cg/raytracing2.ts                         |  11 +-
 .../render.spheres.1.png                      | Bin 0 -> 10381 bytes
 .../render.spheres.10.png                     | Bin 0 -> 10235 bytes
 .../render.spheres.11.png                     | Bin 0 -> 10389 bytes
 .../render.spheres.2.png                      | Bin 0 -> 10365 bytes
 .../render.spheres.3.png                      | Bin 0 -> 10653 bytes
 .../render.spheres.5.png                      | Bin 0 -> 10257 bytes
 .../render.spheres.6.png                      | Bin 0 -> 10398 bytes
 .../render.spheres.7.png                      | Bin 0 -> 10349 bytes
 .../render.spheres.8.png                      | Bin 0 -> 10630 bytes
 .../render.spheres.9.png                      | Bin 0 -> 10581 bytes
 src/cg/raytracing2animation.ts                |  97 ++++++++++++++++++
 src/cg/utils.ts                               |   6 +-
 14 files changed, 109 insertions(+), 7 deletions(-)
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.1.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.10.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.11.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.2.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.3.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.5.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.6.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.7.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.8.png
 create mode 100644 src/cg/raytracing2animation frames/render.spheres.9.png
 create mode 100644 src/cg/raytracing2animation.ts

diff --git a/index.html b/index.html
index d2a125a..d31a42c 100644
--- a/index.html
+++ b/index.html
@@ -15,6 +15,6 @@
     <script type="module" src="/src/cg/perspectiveDivide.ts"></script>
     <script type="module" src="/src/cg/walkToVec.ts"></script>
     <script type="module" src="/src/cg/basis.ts"></script-->
-    <script type="module" src="/src/cg/raytracing2.ts"></script>
+    <script type="module" src="/src/cg/raytracing2animation.ts"></script>
   </body>
 </html>
diff --git a/src/cg/raytracing2.ts b/src/cg/raytracing2.ts
index 4fec61b..475ec1c 100644
--- a/src/cg/raytracing2.ts
+++ b/src/cg/raytracing2.ts
@@ -4,7 +4,7 @@ import { ISphere, Vec3, raySphereIntersect } from "./utils";
 const width = 200
 const height = 200
 const framebuffer = new Framebuffer(width, height);
-const imagePlaneDist = -1
+const imagePlaneDist = -0.5
 
 const tNear = 1;
 const tFar = 1000;
@@ -12,14 +12,19 @@ const tFar = 1000;
 const spheres = [
     {
         position: [0, 0, -3],// <--- 
-        radius: 2,// <--- 
+        radius: 1,// <--- 
         color: [255,0,0]// <--- 
     },
     {
         position: [3,2,-3],// <--- 
-        radius: 2,// <--- 
+        radius: 0.5,// <--- 
         color: [0,255,0]// <--- 
     },
+    {
+        position: [-2, -2, -4],
+        radius: 1,
+        color: [0,0,255]
+    }
     //... add more spheres if you like
 ]
 
diff --git a/src/cg/raytracing2animation frames/render.spheres.1.png b/src/cg/raytracing2animation frames/render.spheres.1.png
new file mode 100644
index 0000000000000000000000000000000000000000..99e5178a669525e38d730702d80ef979db95cc9e
GIT binary patch
literal 10381
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

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.10.png b/src/cg/raytracing2animation frames/render.spheres.10.png
new file mode 100644
index 0000000000000000000000000000000000000000..807475fa31af0b4aff8d2277adfa2a7c897cda2d
GIT binary patch
literal 10235
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

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.11.png b/src/cg/raytracing2animation frames/render.spheres.11.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a4030e4ffe0d9f33175953a37cb76839f4ae8bc
GIT binary patch
literal 10389
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
Ck+f9+

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.2.png b/src/cg/raytracing2animation frames/render.spheres.2.png
new file mode 100644
index 0000000000000000000000000000000000000000..390880d5272c8f53faec88857ec4400a4a5d1770
GIT binary patch
literal 10365
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

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.3.png b/src/cg/raytracing2animation frames/render.spheres.3.png
new file mode 100644
index 0000000000000000000000000000000000000000..5255f85565a517ea56130c79492961616fe59b02
GIT binary patch
literal 10653
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

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.5.png b/src/cg/raytracing2animation frames/render.spheres.5.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef64d1405296089a52e0367d33386a6b79247a4d
GIT binary patch
literal 10257
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

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.6.png b/src/cg/raytracing2animation frames/render.spheres.6.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e56bda15c4d3d502e4031b0687c054df4bea10f
GIT binary patch
literal 10398
zcmeAS@N?(olHy`uVBq!ia0y~yV2S`?4mJh`hJ9%>?l3SgFct^7J29*~C-ahlL4m>3
z#WAEJ?(N;zQ)P}%ZM`_n+r-7};4;G&y-YFb2a6p`uD^cLd16oXzg1dF$@e8*L`N!o
zoxgqi{eRz|{pS!+aA;s)WMWBT`Y#w^=*=w%<=<mvnbr-F;t=5A=2&B};welq(`i|#
zDvlObmN1DcMJ!OM#;1HR0}nAVY4c=RGC`yo4ivFN)i5P8Hj1)sm0^TPIV9|4hNxj^
z+|Y1<t2wF<<Q@(I1%(ZFplTW%A{-K09d+HoPUR2~h<FE8<Dj6Uu;I{xY06Nia_E#p
z)hGyv2}C3YoQ8RbWtufq&8T;nSVm)KG_j55ozaqwakMCC7_D~{MvH>cqF}Tra2PEL
z1n6B9?6hb3C!O|V|A(q+x5FOXe!t%K*7o~xzxU<OcYARAc6a&H<&*2Gi_86t|4g=7
zalq>2f^XGlN?dHKoj!hDbLZ3hy;8y7<s3@xYHz*!{F30;H;hNGZ!X%rUwuQ``TvcV
z-wTC&x7qY!mwV>P^r*nEHy<9kHfiJi%`f!~OYd*4x?S3T`OA5ZH80H{T>d;?b44C+
zV8LA>t1tHPvY|<@FMPDy{bOd+t80>bAMR2$`D`y9Vf_5x$(8FxLg({_<y>9&XI<h~
z<A&`~d$k4sRR?cnuTN0k_?6+>QG2ZodUg+PAD=A{n)LdcEl2GmoxrDS!!jOhpT6_b
z>{Yjy|NX(a@#~5kTkZ5WtTR1t?Qd+ks?PPv+G}&gpMUP3YrAI8)vBLdf4U0}++O8=
z;m9@RsOvx09N2YC=DkhphF!d>+w!FUe(79&^y>WMpD#ar9PSu$*F-qVyi@NpV`J&e
zz`9a_#IHYQv|jVwyt-}b_DFO0_qkUOyZryvbfM~Q!FN%XYwv`sUjA&k>Rt0bUMy<A
z$sD2Zdug>l|2s|oUw8F&{kEET$Bd;a-=p0V-kMK7Ak4X%;gP>L$J+P*b0_@Wp8ouK
z$%n2wvp<5Yhu<G$yzY}B+pw#`vvF$$!_Bv?q1Qe?zuM-0?aPi&X5KNfzu9}tqgd}h
z6JuJvvi3#XqgMg<_`CUebPK<Jtm3Vi{Pg*Od-DzMrF~t~f5$UHc4c&AbVTTk`kf~y
zTo4N1zc0yI$va~0Z(+BLwVVCl=xh+`I(<zb{Pc_ew|+dDsJd?7z9jK}ox-jE{3RxC
ztz$cH*La{REbry_ma9Sk>T~N3o)8NA9>1~MZQ71q|G7-;G`C2dx@pT2c5U;9Sv#~8
z>~|h*b@EQIEo0Xci9Gab<3)3O-A%J@t$(k&A<kT9ox-}V8~%BvjVFY{&!7FrG*NZk
zJn7oc(MqdV{=F5)^xAa)qwPmS1%Dr1>n9WW=+)Mn^DQ<VxthH=zb-n(bnE>4-U+t(
z;eVFx&`N6GW|f%Ix%$i-e~HLPTE@SgX@ShR6UX%0a{Hz2Euoyh7UcSgL_X50W(QN&
zzrJNTt=6skU&r*iZuKYiqoI<27QFQnh<x;F#?AQ(n~q#HT%5mNYtyYq-`}clcvq}d
z?-eukApgC*&nJW;j-RRjd_XAtcu(!sRZ7`Y|2+TAwdQZyr*GfXHf)nQ?ajY6Go^F&
z^kr3_PtOJgi{;MCwGIhy&5atj-t{?hwM@Cw_Cnf3)pbde{}wGgtK=P1dTd{k_{6PF
zccs_ty<%T0RaiR7aqov2(yr4ER3-ND*OV?kAQaAj=Is)B(a7IC=cL!<rYWx5CVBKB
z|0c(j&eeyP|4D4-1)1Z%ugHAj)}a6I_p)9SD;5Zk?pgRvfN8bc-qUVO+0#9HD)}aE
zt-HdM{g>y@(r>zH7wS4%Cq8`}T7BdG_h^a8dvR+ef1ZkEz2^1zeKq%*r^X+?W&Pxs
zW_zINgi!eDWqY+Y9l3gI;`%$WDQmBYM`VBf`&vTm_xgKr32Wy$)c$A9-^dbHdn!6t
zW7D<X!_sR?ztu^_WbHrw?CFV5Y}s!goNiQIcdf6w{VwaZU78$gQbE#g`|loGdO|3?
z+Gn3g<fE+q!uKCUl(Nr?uw0WW&tE@n=ldNS58Nu$YPX$yz^dokq5Wb45!rcd2cjOm
zdwW&r+gfv5i%om>-pc;P?mlgMcy(`e`*Oj^znUCt_U+sr?tP~Gen`SwyM-@4bFR@?
zel(ApW6f>1m;M}Uw!Ap|b<f^io+jUz+1;j@M^xWk#ms#A_UgTEdoN$^So6+=CG7g`
z+pBkdpJ`^JvEj(odD9;(I3W~K-B;bdTqxqMCdZmp+qZ{@zPp^Ow!zPQQ@C72!rn#C
zcl&d7tWkeB@5ihIRZMSxuIE_u{Oz)u&kZ2opFdsfkWg8@_4$hODy_z=v)c~5iu_%<
zA*=S<*+Y%0>%Q&dcnGqfzq)<7aKv6sjy1EkZVxwo6`ZfK!OwP|yL?=Nt=6;8jEoaS
z9rh%1HkPsnJyT}Ver%CAH6f+4dF%I9PBu^g^j9rkE*vp8lVeTa=K1W|=fZDzB*Z3m
zmCtodxO?=8b0lNq)USVXOdGEjiba?{*UnMdu+HG<?sEzo-X(onxTfL2sVc5Deb3c*
z|EMg`{QuHSJYu=@O>KUeE**QpeMT*n_eCR*pT8r$=5g=dy{jbRb0<5b{QMpMe1}Nm
z0ip2c5?}rNH8=FlZ#!UhFCrndXZ^O$1G{dy*xU9WkTQNXmrn~*j`iA%&Uud(Fund^
z$hqcmFKgJ*A6c_G)~xmoN$8#VLKCD#eln_YBUZ~6Pla{=p8WXsduqbE%4rAw-}o$V
zaR1(!U$exY%n0UOlN|GZ=c)r%_kJAb`@i;W%Hqx39BVfFe|Yzt|LD{MyQ1%~-%tKy
z&d18w80zqEU+aNYf%EH>8%uu)-m7M4EL}h4JS!_pn84@mr7U5`BNML9S-)Z8fnA40
z-di;v*wuZqeG?Ot_UoTFvzS&t*4dDCF8#iSMELvt(m$&$qwjYlB<$_KegE*Ssyn-F
z<{WtC<CIW3r~b{O^g~+THO+-1mdo7U%&)s)-qg=~)me{Rom}8w<C|dH`0Y<P%eBvC
z!TTinbn-WT+iUS~$0xSz`+@Jjq%f^E=WV>Y`I~X#)n7fcWd*{SvhQ~nI3#qgsXe~;
z^kmL8_f%NI&fhxUQu=yxuEvIQW*eu^3s2a4<oW4-?vB;R&&K_1J5c5Ne&zdLGe2l<
z6O6ag*s$m5t@qz#M8fYSyfuF{cb-Q=>2k#lyYAgf(*0<6cp3Y#sRwSoXOfYKP|Dt4
z`2K^-qgD2-jaSXTmv5Xl<Ndys2X56mU3@Ma5$M-_S4<#cd+(+B0uh-PcVGV;{P1qb
z^#2bI7Jgkmzh3>CocYTKJAP%~`8PMB`b>56a)I#dHiZq>c2sw7JyUzUm-Sj-u;rVX
zEY}jZi2d8za3HGKnB|((clq5_-CL*Bcc1kxe5!j*>~fv<(W%=bs(Y&2mkWfyUZ$|&
z+Rf_jtyk*W&z>&)dVJzvpB-f%o*t-@-#MS_`nj5q@0hahGO%2;s?Ogy?e_XQhQ_T`
zOke-9hRv<{)b=Rr?HAT-QS}qIw*K#Gj}Qp2Q;RWtvHyFFKzN;2jP<9fySrCU{dNDl
zSj6k}2g?uXrd_D%Xf0ITG^_cZ(mI!GvnH;;7n-nkUc-SX`^NqA4#Zd7&yZlZ?>b;5
zQL+E2_`bbD5x-;G7ti;Ik=3oa|Lb1D-RB{{rkv1n)W4I~yyKJDYU}^JkGxV!LG@DM
z)}a57?=fZ1kNi_1G;!-)k0kyrfiZsz)&9FA=4^`B+Y*?txBsqv=#81bn_`b#W%{DO
zO(dfFtaD1PW&aW9T(R(bNvdsC)xBpQotnMowzBnW^&?m7CJRUWK6@m->VA>hdYdcD
z3RO47NxpjfK2IuK>Gii4=YDWDZoPkn<yxKbN3rbNGi^R6%szhgcfQ+x`(lIpJ5@JS
zChYCMcfNJ|vWl+%F)?o~)f%@xk8!znt$646hkgR#_mb{fpE+(<-n8SB+Ut!I-~Gxg
z-1<7@Pqx&zxo6tdKa1b@H(F6|^Q`lcS4!&o>tM?LevEH~>DKwTPfM?Pen+gvJ4M%_
zzUZ{@v8gAjimut$zHKQ~-DI>lf1T30S+~x=SKTmgd-Mn2iCY=|9@O=h30Hc3Ffv|!
zoy#?F8z;teYy55RguTzUKe(-w&G>6>bezIEmuqu3?~9A+T=U%R{-0?(va<H?n|`3`
zZoxq=kP`9eIE^*`D!u-fJgmL`=7>FaU8%$WmWQ>E^J~3gwk|3D&9P?A)268{*O<P{
z-?k?srgC!W{j0k&Vk&2s-v1#zUnq?CY4SILh~qoN!bKxp-$WLwZrZmmO1xit;?{Tm
z)AqlukNz((??EPG<5!crdGR7qdpl$Pti8Hk;cv{3z*LWzzn?GE8NK<-`FL&U`CljI
zvRs?E>+4q6Ya5?1AAWVX{_rpJefx`fdbAgozL~EhU%Pkft4#UblMh&3E5G>4Nt@r^
zX5F8dAF&A)F@H;W|M<T-^1tKbH7&ngHI9v2YgpXv8ZK1DhDZFpRB+3`?a-_1*BvtU
z{&DZwP&KpQHY>}uZHqnaW?ZO>368jHGFvF}(W`Hv0#W9@b^jVRRLyu(5-$L$&UCiq
zz2;nf+s(fA(W-^2YvlHGIlW#sbHgsrl9~J*Yfkrkn%K;-wm)jotBJRbAE`SRe*HC7
zAX=WM_3G*HS0&sWYcBWd{5>!^**jus{^i>@@27FD{xelVCTfvZ-CVz|3l3Oa-O*Qf
zgL9+ms=j@$^=s>=-4F`ht8J*T%_a1$Rqp<Y2X585td{%WwNZ6d*xg0nYs-0c6Ssbg
ziqY8Sa`n>cEpMMOW#7K|=37EKm!9L++i!0^TRUyVt?yZLG<L9D-F7`=HM?*`bnjyy
z{>|P6ohyy+&f-6Rt7^0As&mz@W}SMDrMI-Vd^yN^E$H9sym@{4f~8kye_CI>S1L9s
z>s%=3@#!5>#id#7q7kN9($M*uU>25ZQ#`HJAu~V$!UCgm;OVQ;a2ZV#0t%z~VYHlJ
zWI`?rUcKwcW?<m(0j&iXO&_E62xt`qa{3re6QgNjG);`QDM#DWqirYR+D`xE{np&i
SZDfyS00B=|KbLh*2~7a`=+QO+

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.7.png b/src/cg/raytracing2animation frames/render.spheres.7.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b972a8d57ea6ce17a05a800fcfe4f94aa7bbb71
GIT binary patch
literal 10349
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

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.8.png b/src/cg/raytracing2animation frames/render.spheres.8.png
new file mode 100644
index 0000000000000000000000000000000000000000..a003471af1daeb790582b9fd5342bf55a1830a59
GIT binary patch
literal 10630
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

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation frames/render.spheres.9.png b/src/cg/raytracing2animation frames/render.spheres.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bbe0f02f1eda97774dfc131d3c85226645960ad
GIT binary patch
literal 10581
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
UVaMfo1_lNOPgg&ebxsLQ01j4#umAu6

literal 0
HcmV?d00001

diff --git a/src/cg/raytracing2animation.ts b/src/cg/raytracing2animation.ts
new file mode 100644
index 0000000..d1b0600
--- /dev/null
+++ b/src/cg/raytracing2animation.ts
@@ -0,0 +1,97 @@
+import Framebuffer from "./framebuffer";
+import { Vec3, Matrix4, Matrix3, matrix3ToMatrix4, matrix4Product, raySphereIntersect, ISphere, rotX, rotY, multVec3Matrix4 } from "./utils";
+
+const width = 600
+const height = 600
+const framebuffer = new Framebuffer(width, height);
+const imagePlaneDist = -0.5
+
+const tNear = 1;
+const tFar = 1000;
+
+const spheres = [
+    {
+        "position": [-2.5, 0, 0],
+        "radius": 1,
+        "color": [128, 0, 0]
+    },
+    {
+        "position": [0, 0, 0],
+        "radius": 1,
+        "color": [0, 128, 0]
+    },
+    {
+        "position": [2.5, 0, 0],
+        "radius": 1,
+        "color": [0, 0, 128]
+    },
+]
+
+const o: Vec3 = [0, 0, 0]
+
+
+const camT: Matrix4 = [
+    1, 0, 0, 0,
+    0, 1, 0, 0,
+    0, 0, 1, 0,
+    0, 0, 3, 1  // <--- 4x4 matrix that moves the camera in Z
+]
+
+const camRx = matrix3ToMatrix4(rotX(-30))// <--- rotation matrix around X. Convert it to 4x4. 
+
+const camInitialTransform = matrix4Product(camT, camRx)// <--- combine camT and camRX into a new matrix
+
+let currentFrame = 0
+
+for (let i = 0; i <= 1; i += .1) {
+    framebuffer.clear()
+
+    
+    const camRot = rotY(360*i)// <--- rotation matrix around Y using 360 * i in each frame 
+
+    
+    const combinedCameraTransform = matrix4Product(camInitialTransform, matrix3ToMatrix4(camRot)) // <--- Combine transformations: 
+                                    // initial transform then rotate
+
+
+    // Loop over framebuffer pixels
+    for (let x = 0; x <= width; x++) {
+        for (let y = 0; y <= height; y++) {
+
+            // Convert to screen space
+            const v = framebuffer.rasterToScreen(x, y, width, height, imagePlaneDist)// <--- convert raster to screen space 
+            const vTransformed = multVec3Matrix4(v, combinedCameraTransform)// <--- apply camera transform
+            const oTransformed = multVec3Matrix4(o, combinedCameraTransform)// <--- apply camera transform
+
+            // ...
+            // ... same as in previous task but using transformed camera vectors
+            let closestSphere = null;
+            let closestIntersection = 9999;
+
+            for (let i = 0; i < spheres.length; i++) {
+
+                const [t1, t2] = raySphereIntersect(vTransformed, oTransformed, spheres[i] as ISphere)// <--- Calculate intersections
+    
+                if (t1 < closestIntersection && tNear < t1 && t1 < tFar) {
+                    closestIntersection = t1;
+                    closestSphere = spheres[i]
+                }
+    
+                if (t2 < closestIntersection && tNear < t2 && t2 < tFar) {
+                    closestIntersection = t2;
+                    closestSphere = spheres[i];
+                }
+            }
+            if (!closestSphere) {
+                framebuffer.draw(x,y,[0,0,50]) // <--- Draw a background color
+            } else {
+                framebuffer.draw(x,y,closestSphere.color) // <--- Draw color of closest sphere
+            }
+
+        }
+
+    }
+    framebuffer.update();
+    framebuffer.save("spheres." + ++currentFrame);
+
+}
\ No newline at end of file
diff --git a/src/cg/utils.ts b/src/cg/utils.ts
index 1a4beb8..7e33466 100644
--- a/src/cg/utils.ts
+++ b/src/cg/utils.ts
@@ -124,7 +124,7 @@ export function multVecMatrix(v: Array<number>, m: Array<number>){
     ]
 }
 
-export function rotX(degrees: number){
+export function rotX(degrees: number): Matrix3{
     const radian = degrees * Math.PI / 180
     return [
         1, 0, 0,
@@ -133,7 +133,7 @@ export function rotX(degrees: number){
     ]
 }
 
-export function rotY(degrees: number){
+export function rotY(degrees: number): Matrix3{
     const radian = degrees * Math.PI / 180
     return [
         Math.cos(radian), 0, -1*Math.sin(radian),
@@ -142,7 +142,7 @@ export function rotY(degrees: number){
     ]
 }
 
-export function rotZ(degrees: number){
+export function rotZ(degrees: number): Matrix3{
     const radian = degrees * Math.PI / 180
     return [
         Math.cos(radian), Math.sin(radian), 0,
-- 
GitLab