November 28, 2020, 10:52:19 AM

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

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] TForm Point by Bobysait [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
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


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal