Code archives/3D Graphics - Maths/Vector Example

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

Download source code

Vector Example by Jeppe Nielsen2003
Graphically shows the use of aligntovector, dot and cross products
;small vector example by Jeppe Nielsen 2003
;nielsen_jeppe@hotmail.com
;
;showing dot and cross products in action!
;and aligntovector.

Graphics3D 800,600,16,2

SeedRnd MilliSecs()

p1=CreatePivot()
p2=CreatePivot()
p3=CreatePivot()

RotateEntity p1,Rnd(360),Rnd(360),Rnd(360)
RotateEntity p2,Rnd(360),Rnd(360),Rnd(360)

cube=CreateCube()
ScaleEntity cube,0.5,0.5,0.5
EntityAlpha cube,0.5

campivot=CreatePivot()
camera=CreateCamera(campivot)

PositionEntity camera,0,2,-3
PointEntity camera,campivot

Repeat

TurnEntity campivot,0,2,0

TFormVector 0,0,1,p1,0

If KeyHit(57)=True

align=1-align

turnangle1#=Rnd(-2,2)
turnangle2#=Rnd(-2,2)

EndIf


If align=1

;change the last parameter for varied speeds
AlignToVector p2,TFormedX(),TFormedY(),TFormedZ(),3,0.04

Else

TurnEntity p2,turnangle1#,turnangle2#,0

EndIf


TFormNormal 0,0,1,p1,0
nx1#=TFormedX()
ny1#=TFormedY()
nz1#=TFormedZ()

TFormNormal 0,0,1,p2,0
nx2#=TFormedX()
ny2#=TFormedY()
nz2#=TFormedZ()

dot#=nx1*nx2+ny1*ny2+nz1*nz2

angle#=ACos(dot#)

;Make a third vector perpendicular to two other vectors
cx# = ( ny1 * nz2 ) - ( nz1 * ny2 ) 
cy# = ( nz1 * nx2 ) - ( nx1 * nz2 ) 
cz# = ( nx1 * ny2 ) - ( ny1 * nx2 ) 				
											
AlignToVector p3,cx,cy,cz,3


RenderWorld()

drawworldaxes(camera,1)
drawvector(p1,camera,1.5,255,255,255)
drawvector(p2,camera,1.5,0,0,255)
drawvector(p3,camera,1.5,255,0,0)

Color 0,255,0
Text 10,10,"Angle between blue and white vectors: "+angle
Text 10,30,"Red vector is perpendicular to the two others: "
Text 10,50,"Space to toggle between align/rotate the blue vector"
Text 10,70,"White vector coordinates:"
Text 10,80,"X: "+nx1#
Text 10,90,"Y: "+ny1#
Text 10,100,"Z: "+nz1#

Flip
Until KeyDown(1)
End

Function drawvector(e,camera,length,r,g,b)

;Get initial position
CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
x=ProjectedX()
y=ProjectedY()

;Draw X axis
;Color 255,0,0
;MoveEntity e,length,0,0
;CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
;Line x,y,ProjectedX(),ProjectedY()
;MoveEntity e,-length,0,0

;Draw Y axis
;Color 0,255,0
;MoveEntity e,0,length,0
;CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
;Line x,y,ProjectedX(),ProjectedY()
;MoveEntity e,0,-length,0

;Draw Z axis
Color r,g,b ;,0,255
MoveEntity e,0,0,length
CameraProject camera,EntityX(e,1),EntityY(e,1),EntityZ(e,1)
Line x,y,ProjectedX(),ProjectedY()
MoveEntity e,0,0,-length
Oval ProjectedX()-4,ProjectedY()-4,8,8,1

End Function

Function drawworldaxes(camera,length)

;Get initial position
CameraProject camera,0,0,0
x=ProjectedX()
y=ProjectedY()

;Draw X axis
Color 255,0,0
CameraProject camera,length,0,0
Line x,y,ProjectedX(),ProjectedY()
CameraProject camera,length*1.1,0,0
Oval ProjectedX()-12,ProjectedY()-12,24,24,0
Text ProjectedX(),ProjectedY(),"X",1,1

;Draw Y axis
Color 0,255,0
CameraProject camera,0,length,0
Line x,y,ProjectedX(),ProjectedY()
CameraProject camera,0,length*1.1,0
Oval ProjectedX()-12,ProjectedY()-12,24,24,0
Text ProjectedX(),ProjectedY(),"Y",1,1

;Draw Z axis
Color 0,0,255
CameraProject camera,0,0,length
Line x,y,ProjectedX(),ProjectedY()
CameraProject camera,0,0,length*1.1
Oval ProjectedX()-12,ProjectedY()-12,24,24,0
Text ProjectedX(),ProjectedY(),"Z",1,1

End Function

Comments

None.

Code Archives Forum