Code archives/3D Graphics - Maths/TForm Point

This code has been declared by its author to be Public Domain code.

Download source code

TForm Point by Bobysait2009
It simply make the same as the original blitz3d function.

It's here to explain how to calculate transformation using Local/Global matrix.
Global TFormedX_#;
Global TFormedY_#;
Global TFormedZ_#;

Function TFormedX_#() : Return TFormedX_ : End Function
Function TFormedY_#() : Return TFormedY_ : End Function
Function TFormedZ_#() : Return TFormedZ_ : End Function

Function TFormPoint_ ( x#, y#, z#, source=0, dest=0 )
	TFormedX_ = x;
	TFormedY_ = y;
	TFormedZ_ = z;
	If (source<>0)
		Local xx# = GetMatElement(source,0,0);
		Local xy# = GetMatElement(source,0,1);
		Local xz# = GetMatElement(source,0,2);
		Local yx# = GetMatElement(source,1,0);
		Local yy# = GetMatElement(source,1,1);
		Local yz# = GetMatElement(source,1,2);
		Local zx# = GetMatElement(source,2,0);
		Local zy# = GetMatElement(source,2,1);
		Local zz# = GetMatElement(source,2,2);
		Local px# = GetMatElement(source,3,0);
		Local py# = GetMatElement(source,3,1);
		Local pz# = GetMatElement(source,3,2);
		TFormedX_ = x * xx + y * yx + z * zx + px;
		TFormedY_ = x * xy + y * yy + z * zy + py;
		TFormedZ_ = x * xz + y * yz + z * zz + pz;
	EndIf
	
	If (dest<>0)
		; invert destination matrix
		xx# = GetMatElement(dest,0,0);
		xy# = GetMatElement(dest,0,1);
		xz# = GetMatElement(dest,0,2);
		yx# = GetMatElement(dest,1,0);
		yy# = GetMatElement(dest,1,1);
		yz# = GetMatElement(dest,1,2);
		zx# = GetMatElement(dest,2,0);
		zy# = GetMatElement(dest,2,1);
		zz# = GetMatElement(dest,2,2);
		px# = GetMatElement(dest,3,0);
		py# = GetMatElement(dest,3,1);
		pz# = GetMatElement(dest,3,2);
		Local x_# = xy*yz-xz*yy;
		Local y_# = xz*yx-xx*yz;
		Local z_# = xx*yy-xy*yx;
		Local t_# = 1.0 / (zx*x_+zy*y_+zz*z_);
		Local xz_# = t_*x_ ;
		Local yz_# = t_*y_ ;
		Local zz_# = t_*z_ ;
		Local pz_# = -t_*(px*x_+py*y_+pz*z_);
		x_ = yy*zz-yz*zy;
		y_ = zx*yz-yx*zz;
		z_ = yx*zy-yy*zx;
		Local xx_# = t_*x_ ;
		Local yx_# = t_*y_ ;
		Local zx_# = t_*z_ ;
		Local px_# = -t_*(px*x_+py*y_+pz*z_);
		x_ = zy*xz-zz*xy;
		y_ = xx*zz-zx*xz;
		z_ = zx*xy-zy*xx;
		Local xy_# = t_*x_ ;
		Local yy_# = t_*y_ ;
		Local zy_# = t_*z_ ;
		Local py_# = -t_*(px*x+py*y+pz*z);
		
		x_ = TFormedX_;
		y_ = TFormedY_;
		z_ = TFormedZ_;
		TFormedX_ = x_ * xx_ + y_ * yx_ + z_ * zx_ + px_;
		TFormedY_ = x_ * xy_ + y_ * yy_ + z_ * zy_ + py_;
		TFormedZ_ = x_ * xz_ + y_ * yz_ + z_ * zz_ + pz_;
	EndIf
	
End Function




; and here a sample.


Graphics3D 1440,900,0,2
SetBuffer BackBuffer()
ClearTextureFilters()

AmbientLight 255,255,255

Local PCm%	=	CreatePivot		( )
Local Cam%	=	CreateCamera	( PCm )
				PositionEntity	( PCm, +00.0,+05.0,-05.0 )

Local plane%=	CreatePlane		( 6 )
				EntityAlpha		( plane, .3 )
				EntityColor		( plane, 100,80,130 )

Local lit%	=	CreateLight		( 2 )
				PositionEntity	( lit, +80.0,+60.0,-40.0 )
				LightRange		( lit, 150 )
				LightColor		( lit, 180,200,220 )

Local piv%	=	CreatePivot		()
				TurnEntity		( piv, 15,-40,59 )
				MoveEntity		( piv, -07.2,+12.3,-05.2 )
Local cube%	=	CreateCube		( piv )
				PositionEntity	( cube, +21.5,+08.4,+12.1 )

Local msx#	=	0.0
Local msy#	=	0.0
Local mt%	=	0
Local st%	=	MilliSecs()
Local lt%	=	mt
Local dt#	=	1.0

Local Speed#=	1.0
Local MOV_UD#=	0.0
Local MOV_LR#=	0.0
Local VEL_P#=	0.0
Local VEL_Y#=	0.0
Local Redress%=	False

Local HELP%	=	True
Local SYNC%	=	True
Local WIRE%	=	False
Repeat
	; -----------------
	; tbm
	; -----------------
		lt=mt
		mt=MilliSecs()-st
		dt=Float(mt-lt)
		If dt<1		dt=.5
		If dt>60	dt=60
		Speed	=	(dt*60)/1000

	; -----------------
	; inputs
	; -----------------
		If KeyHit(59)  HELP=1-HELP
		If KeyHit(60)  SYNC=1-SYNC
		If KeyHit(61)  WIRE=1-WIRE:WireFrame WIRE
		MOV_UD = (KeyDown(200) Or KeyDown(17)) - (KeyDown(208) Or KeyDown(31))
		MOV_LR = (KeyDown(205) Or KeyDown(32)) - (KeyDown(203) Or KeyDown(30))

	; -----------------
	; cam update
	; -----------------
		msx#=MouseXSpeed()
		msy#=MouseYSpeed()

		If MouseDown(2) And (msx<>0 Or msy<>0)
			VEL_P=VEL_P+msy*.01
			VEL_Y=VEL_Y-msx*.01
			Redress=False
		Else
			If Abs(VEL_Y)>.0005
				VEL_Y=VEL_Y-Float(Sgn(VEL_Y))*.001*dt
			Else
				VEL_Y=0
			EndIf
			If Abs(VEL_P)>.0005
				VEL_P=VEL_P-Float(Sgn(VEL_P))*.001*dt
			Else
				VEL_P=0
			EndIf
			If Redress=False
				If Abs(VEL_P)<.1
					If GetMatElement(PCm,1,1)<-.45	Then Redress=True
				EndIf
			EndIf
		EndIf


		TurnEntity PCm, +VEL_P*dt*.05,+VEL_Y*dt*.05,0
		MoveEntity PCm, Speed*MOV_LR,0,Speed*MOV_UD
		If Redress=True
			If GetMatElement(PCm,1,1)>.75
				Redress=True
			Else
				TurnEntity PCm, 0,0,.001*dt
			EndIf
		EndIf
		TurnEntity piv, dt*.1,dt*.075,-dt*.12

	RenderWorld

		Color 000,255,000
		Text 10,10,"[F1] Show Help"
		If HELP
			Rect 10,25,200,50,0
			Text 20,30,"[F2] Flip VSync ("+SYNC+")"
			Text 20,45,"[F3] Wire ("+WIRE+")"
		EndIf
		
		Color 255,128,000

		Text 010,200,LSet(GetMatElement(Cam,0,0),4)+" "+LSet(GetMatElement(Cam,0,1),4)+" "+LSet(GetMatElement(Cam,0,2),4)
		Text 010,215,LSet(GetMatElement(Cam,1,0),4)+" "+LSet(GetMatElement(Cam,1,1),4)+" "+LSet(GetMatElement(Cam,1,2),4)
		Text 010,230,LSet(GetMatElement(Cam,2,0),4)+" "+LSet(GetMatElement(Cam,2,1),4)+" "+LSet(GetMatElement(Cam,2,2),4)

		TFormVector 1,0,0,Cam,0
		Text 150,200,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
		TFormVector 0,1,0,Cam,0
		Text 150,215,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
		TFormVector 0,0,1,Cam,0
		Text 150,230,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)

		Color 200,200,000
		Local x_#=12
		Local y_#=7
		Local z_#=4
		Text 010,300," Transform from Camera"
		TFormPoint x_,y_,z_,Cam,0
		Text 010,320,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
		TFormPoint_ x_,y_,z_,Cam,0
		Text 150,320,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)

		Color 128,100,255
		Text 010,350," Transform To Camera"
		TFormPoint x_,y_,z_,0,Cam
		Text 010,370,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
		TFormPoint_ x_,y_,z_,0,Cam
		Text 150,370,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)

		Color 100,200,255
		Text 010,400," Transform from Cube to Camera"
		TFormPoint x_,y_,z_,cube,Cam
		Text 010,420,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
		TFormPoint_ x_,y_,z_,cube,Cam
		Text 150,420,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)
		
		Color 255,100,150
		Text 010,450," Transform from Camera to cube"
		TFormPoint x_,y_,z_,Cam,cube
		Text 010,470,LSet(TFormedX(),4)+" "+LSet(TFormedY(),4)+" "+LSet(TFormedZ(),4)
		TFormPoint_ x_,y_,z_,Cam,cube
		Text 150,470,LSet(TFormedX_(),4)+" "+LSet(TFormedY_(),4)+" "+LSet(TFormedZ_(),4)

		Color 180,180,180
		Text 050,500,"TFormPoint()",1,0
		Text 200,500,"TFormPoint_()",1,0

	Flip SYNC

Until KeyHit(1)

End

Comments

None.

Code Archives Forum