Maybe this will help.
`*******************************************************************************
`* Code by: DMiTR0S [email protected] *
`*******************************************************************************
`*******************************************************************************
`* Free License Agreement. *
`* *
`* The user/developer agrees to include a visible credit to "Dmitri Kuschev" *
`* within your programs documentation and or web site.šš *
`* *
`* The user/developer agrees to NOT offer the this source code for Sale. *
`* *
`* Providing the user/Developer agrees in full to the previous Free *
`* License Agreement clauses, the user/developer may use this source *
`* code FREELY in all their products, commercial or otherwise.Å¡ *
`* *
`*******************************************************************************
ViewMatrix=1
ProjectionMatrix=2
Vector=3
r=Make Matrix4(ViewMatrix)
r=Make Matrix4(ProjectionMatrix)
r=Make Vector3(Vector)
BulletFire=0
BulletTime=0
MaxBulletTime=300
Bullet=1
BulletStep#=2.0
LastCollide=10
Make Object Sphere Bullet, 1.0
For I=10 To 50
Make Object Cube I, 10.0
Position Object I, RND(200)-100, RND(100), RND(200)-100
Color Object I, RGB(0,255,0)
Next I
Position Camera 0, 50, -200
Position Object Bullet, Camera Position X(), Camera Position Y(), Camera Position Z()
Hide Object Bullet
Sync Rate 0
Sync On
Do
Set Cursor 0, 0
If Mouseclick()=2
cy#=cy#+MousemoveY()
Move Camera MousemoveX()
Position Camera Camera Position X(), cy#, Camera Position Z()
EndIf
If MouseClick()&&1 And BulletFire=0
Position Object Bullet, Camera Position X(), Camera Position Y(), Camera Position Z()
Show Object Bullet
BulletFire=1
2DTo3DDirectionVector(Vector, ViewMatrix, ProjectionMatrix)
Endif
If BulletFire=1
If BulletTime <= MaxBulletTime
Inc BulletTime
Position Object Bullet, Object Position X(Bullet)+X Vector3(Vector)*BulletStep#, Object Position Y(Bullet)+Y Vector3(Vector)*BulletStep#, Object Position Z(Bullet)+Z Vector3(Vector)*BulletStep#
Else
Hide Object Bullet
BulletFire=0
BulletTime=0
EndIf
EndIf
Coll=Object Collision(Bullet, 0)
If Coll>0
Color Object LastCollide, RGB(0,255,0)
Color Object Coll, RGB(255,0,0)
LastCollide=Coll
Hide Object Bullet
BulletFire=0
BulletTime=0
EndIf
Print "BulletTime = "+Str$(BulletTime)+" BulletFire = "+Str$(BulletFire)
Print "Normalized direction vector:"
Print " X = "+Str$(X Vector3(Vector))
Print " Y = "+Str$(Y Vector3(Vector))
Print " Z = "+Str$(Z Vector3(Vector))
Sync
Loop
Function 2DTo3DDirectionVector(VectorResult, ViewMatrix, ProjectionMatrix)
X#=2.0*(Mousex()*1.0)/(Screen Width()*1.0)-1.0
Y#=1.0-2.0*(MouseY()*1.0)/(Screen Height()*1.0)
Set Vector3 VectorResult, X#, Y#, 1.0
View Matrix4 ViewMatrix
Projection Matrix4 ProjectionMatrix
r=Inverse Matrix4(ViewMatrix, ViewMatrix)
r=Inverse Matrix4(ProjectionMatrix, ProjectionMatrix)
Transform Coords Vector3 VectorResult, VectorResult, ProjectionMatrix
Transform Coords Vector3 VectorResult, VectorResult, ViewMatrix
Set Vector3 VectorResult, X Vector3(VectorResult)-Camera Position X(), Y Vector3(VectorResult)-Camera Position Y(), Z Vector3(VectorResult)-Camera Position Z()
Normalize Vector3 VectorResult, VectorResult
EndFunction