July 28, 2021, 04:44:47

### Author Topic: [bb] TForm Point by Bobysait [ 1+ years ago ]  (Read 853 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bb] TForm Point by Bobysait [ 1+ years ago ]
« on: June 29, 2017, 00:28:40 »
Title : TForm Point
Author : Bobysait
Posted : 1+ years ago

Description : It simply make the same as the original blitz3d function.

It's here to explain how to calculate transformation using Local/Global matrix.

Code :
Code: BlitzBasic
1. Global TFormedX_#;
2. Global TFormedY_#;
3. Global TFormedZ_#;
4.
5. Function TFormedX_#() : Return TFormedX_ : End Function
6. Function TFormedY_#() : Return TFormedY_ : End Function
7. Function TFormedZ_#() : Return TFormedZ_ : End Function
8.
9. Function TFormPoint_ ( x#, y#, z#, source=0, dest=0 )
10.         TFormedX_ = x;
11.         TFormedY_ = y;
12.         TFormedZ_ = z;
13.         If (source<>0)
14.                 Local xx# = GetMatElement(source,0,0);
15.                 Local xy# = GetMatElement(source,0,1);
16.                 Local xz# = GetMatElement(source,0,2);
17.                 Local yx# = GetMatElement(source,1,0);
18.                 Local yy# = GetMatElement(source,1,1);
19.                 Local yz# = GetMatElement(source,1,2);
20.                 Local zx# = GetMatElement(source,2,0);
21.                 Local zy# = GetMatElement(source,2,1);
22.                 Local zz# = GetMatElement(source,2,2);
23.                 Local px# = GetMatElement(source,3,0);
24.                 Local py# = GetMatElement(source,3,1);
25.                 Local pz# = GetMatElement(source,3,2);
26.                 TFormedX_ = x * xx + y * yx + z * zx + px;
27.                 TFormedY_ = x * xy + y * yy + z * zy + py;
28.                 TFormedZ_ = x * xz + y * yz + z * zz + pz;
29.         EndIf
30.
31.         If (dest<>0)
32.                 ; invert destination matrix
33.                 xx# = GetMatElement(dest,0,0);
34.                 xy# = GetMatElement(dest,0,1);
35.                 xz# = GetMatElement(dest,0,2);
36.                 yx# = GetMatElement(dest,1,0);
37.                 yy# = GetMatElement(dest,1,1);
38.                 yz# = GetMatElement(dest,1,2);
39.                 zx# = GetMatElement(dest,2,0);
40.                 zy# = GetMatElement(dest,2,1);
41.                 zz# = GetMatElement(dest,2,2);
42.                 px# = GetMatElement(dest,3,0);
43.                 py# = GetMatElement(dest,3,1);
44.                 pz# = GetMatElement(dest,3,2);
45.                 Local x_# = xy*yz-xz*yy;
46.                 Local y_# = xz*yx-xx*yz;
47.                 Local z_# = xx*yy-xy*yx;
48.                 Local t_# = 1.0 / (zx*x_+zy*y_+zz*z_);
49.                 Local xz_# = t_*x_ ;
50.                 Local yz_# = t_*y_ ;
51.                 Local zz_# = t_*z_ ;
52.                 Local pz_# = -t_*(px*x_+py*y_+pz*z_);
53.                 x_ = yy*zz-yz*zy;
54.                 y_ = zx*yz-yx*zz;
55.                 z_ = yx*zy-yy*zx;
56.                 Local xx_# = t_*x_ ;
57.                 Local yx_# = t_*y_ ;
58.                 Local zx_# = t_*z_ ;
59.                 Local px_# = -t_*(px*x_+py*y_+pz*z_);
60.                 x_ = zy*xz-zz*xy;
61.                 y_ = xx*zz-zx*xz;
62.                 z_ = zx*xy-zy*xx;
63.                 Local xy_# = t_*x_ ;
64.                 Local yy_# = t_*y_ ;
65.                 Local zy_# = t_*z_ ;
66.                 Local py_# = -t_*(px*x+py*y+pz*z);
67.
68.                 x_ = TFormedX_;
69.                 y_ = TFormedY_;
70.                 z_ = TFormedZ_;
71.                 TFormedX_ = x_ * xx_ + y_ * yx_ + z_ * zx_ + px_;
72.                 TFormedY_ = x_ * xy_ + y_ * yy_ + z_ * zy_ + py_;
73.                 TFormedZ_ = x_ * xz_ + y_ * yz_ + z_ * zz_ + pz_;
74.         EndIf
75.
76. End Function
77.
78.
79.
80.
81. ; and here a sample.
82.
83.
84. Graphics3D 1440,900,0,2
85. SetBuffer BackBuffer()
86. ClearTextureFilters()
87.
88. AmbientLight 255,255,255
89.
90. Local PCm%      =       CreatePivot             ( )
91. Local Cam%      =       CreateCamera    ( PCm )
92.                                 PositionEntity  ( PCm, +00.0,+05.0,-05.0 )
93.
94. Local plane%=   CreatePlane             ( 6 )
95.                                 EntityAlpha             ( plane, .3 )
96.                                 EntityColor             ( plane, 100,80,130 )
97.
98. Local lit%      =       CreateLight             ( 2 )
99.                                 PositionEntity  ( lit, +80.0,+60.0,-40.0 )
100.                                 LightRange              ( lit, 150 )
101.                                 LightColor              ( lit, 180,200,220 )
102.
103. Local piv%      =       CreatePivot             ()
104.                                 TurnEntity              ( piv, 15,-40,59 )
105.                                 MoveEntity              ( piv, -07.2,+12.3,-05.2 )
106. Local cube%     =       CreateCube              ( piv )
107.                                 PositionEntity  ( cube, +21.5,+08.4,+12.1 )
108.
109. Local msx#      =       0.0
110. Local msy#      =       0.0
111. Local mt%       =       0
112. Local st%       =       MilliSecs()
113. Local lt%       =       mt
114. Local dt#       =       1.0
115.
116. Local Speed#=   1.0
117. Local MOV_UD#=  0.0
118. Local MOV_LR#=  0.0
119. Local VEL_P#=   0.0
120. Local VEL_Y#=   0.0
121. Local Redress%= False
122.
123. Local HELP%     =       True
124. Local SYNC%     =       True
125. Local WIRE%     =       False
126. Repeat
127.         ; -----------------
128.         ; tbm
129.         ; -----------------
130.                 lt=mt
131.                 mt=MilliSecs()-st
132.                 dt=Float(mt-lt)
133.                 If dt<1         dt=.5
134.                 If dt>60        dt=60
135.                 Speed   =       (dt*60)/1000
136.
137.         ; -----------------
138.         ; inputs
139.         ; -----------------
140.                 If KeyHit(59)  HELP=1-HELP
141.                 If KeyHit(60)  SYNC=1-SYNC
142.                 If KeyHit(61)  WIRE=1-WIRE:WireFrame WIRE
143.                 MOV_UD = (KeyDown(200) Or KeyDown(17)) - (KeyDown(208) Or KeyDown(31))
144.                 MOV_LR = (KeyDown(205) Or KeyDown(32)) - (KeyDown(203) Or KeyDown(30))
145.
146.         ; -----------------
147.         ; cam update
148.         ; -----------------
149.                 msx#=MouseXSpeed()
150.                 msy#=MouseYSpeed()
151.
152.                 If MouseDown(2) And (msx<>0 Or msy<>0)
153.                         VEL_P=VEL_P+msy*.01
154.                         VEL_Y=VEL_Y-msx*.01
155.                         Redress=False
156.                 Else
157.                         If Abs(VEL_Y)>.0005
158.                                 VEL_Y=VEL_Y-Float(Sgn(VEL_Y))*.001*dt
159.                         Else
160.                                 VEL_Y=0
161.                         EndIf
162.                         If Abs(VEL_P)>.0005
163.                                 VEL_P=VEL_P-Float(Sgn(VEL_P))*.001*dt
164.                         Else
165.                                 VEL_P=0
166.                         EndIf
167.                         If Redress=False
168.                                 If Abs(VEL_P)<.1
169.                                         If GetMatElement(PCm,1,1)<-.45  Then Redress=True
170.                                 EndIf
171.                         EndIf
172.                 EndIf
173.
174.
175.                 TurnEntity PCm, +VEL_P*dt*.05,+VEL_Y*dt*.05,0
176.                 MoveEntity PCm, Speed*MOV_LR,0,Speed*MOV_UD
177.                 If Redress=True
178.                         If GetMatElement(PCm,1,1)>.75
179.                                 Redress=True
180.                         Else
181.                                 TurnEntity PCm, 0,0,.001*dt
182.                         EndIf
183.                 EndIf
184.                 TurnEntity piv, dt*.1,dt*.075,-dt*.12
185.
186.         RenderWorld
187.
188.                 Color 000,255,000
189.                 Text 10,10,"[F1] Show Help"
190.                 If HELP
191.                         Rect 10,25,200,50,0
192.                         Text 20,30,"[F2] Flip VSync ("+SYNC+")"
193.                         Text 20,45,"[F3] Wire ("+WIRE+")"
194.                 EndIf
195.
196.                 Color 255,128,000
197.
198.                 Text 010,200,LSet(GetMatElement(Cam,0,0),4)+" "+LSet(GetMatElement(Cam,0,1),4)+" "+LSet(GetMatElement(Cam,0,2),4)
199.                 Text 010,215,LSet(GetMatElement(Cam,1,0),4)+" "+LSet(GetMatElement(Cam,1,1),4)+" "+LSet(GetMatElement(Cam,1,2),4)
200.                 Text 010,230,LSet(GetMatElement(Cam,2,0),4)+" "+LSet(GetMatElement(Cam,2,1),4)+" "+LSet(GetMatElement(Cam,2,2),4)
201.
202.                 TFormVector 1,0,0,Cam,0
203.                 Text 150,200,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
204.                 TFormVector 0,1,0,Cam,0
205.                 Text 150,215,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
206.                 TFormVector 0,0,1,Cam,0
207.                 Text 150,230,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
208.
209.                 Color 200,200,000
210.                 Local x_#=12
211.                 Local y_#=7
212.                 Local z_#=4
213.                 Text 010,300," Transform from Camera"
214.                 TFormPoint x_,y_,z_,Cam,0
215.                 Text 010,320,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
216.                 TFormPoint_ x_,y_,z_,Cam,0
217.                 Text 150,320,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)
218.
219.                 Color 128,100,255
220.                 Text 010,350," Transform To Camera"
221.                 TFormPoint x_,y_,z_,0,Cam
222.                 Text 010,370,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
223.                 TFormPoint_ x_,y_,z_,0,Cam
224.                 Text 150,370,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)
225.
226.                 Color 100,200,255
227.                 Text 010,400," Transform from Cube to Camera"
228.                 TFormPoint x_,y_,z_,cube,Cam
229.                 Text 010,420,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
230.                 TFormPoint_ x_,y_,z_,cube,Cam
231.                 Text 150,420,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)
232.
233.                 Color 255,100,150
234.                 Text 010,450," Transform from Camera to cube"
235.                 TFormPoint x_,y_,z_,Cam,cube
236.                 Text 010,470,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
237.                 TFormPoint_ x_,y_,z_,Cam,cube
238.                 Text 150,470,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)
239.
240.                 Color 180,180,180
241.                 Text 050,500,"TFormPoint()",1,0
242.                 Text 200,500,"TFormPoint_()",1,0
243.
244.         Flip SYNC
245.
246. Until KeyHit(1)
247.
248. End