Just for the fun of it, I added FPS - WASD controls and moved the camera back a little. Now the point is initially in the frustum.
null = make vector4(1) ` Left clipping plane
null = make vector4(2) ` Right clipping plane
null = make vector4(3) ` Top clipping plane
null = make vector4(4) ` Bottom clipping plane
null = make vector4(5) ` Near clipping plane
null = make vector4(6) ` Far clipping plane
null = make matrix4(7) ` Tranformation matrix
null = make matrix4(8) ` Projection matrix
null = make matrix4(9) ` View matrix
null = make vector3(10) ` 3d point
sync on
sync rate 60
backdrop on
color backdrop 0xFF101010
autocam off
move camera -25.0
set directional light 0, 0.0, 0.0, 1.0
hide mouse
position mouse 320, 240
make object sphere 1, 1.0
color object 1, 0xFF0000FF
set object ambient 1, 0
do
set cursor 0, 0
ink -1, 0
set text size 12
print "Controls: WASD & Mouse."
center text screen width()/2, 64, "Point inside Frustum?"
set text size 36
if (PointInFrustum(object position x(1), object position y(1), object position z(1)))
ink 0xFF00FF00, 0
center text screen width()/2, 96, "Yes!"
else
ink 0xFFFF0000, 0
center text screen width()/2, 96, "No!"
endif
sync
CamControl()
loop
end
function CamControl()
` declare local variables
` -----------------------
` Keyboard input
local keystate17 as integer
local keystate30 as integer
local keystate31 as integer
local keystate32 as integer
` Mouse input
local cammovex as float
local cammovey as float
` Camera movement
local sx as float
local sy as float
local sz as float
local y as float
` Get keyboard input
keystate17 = keystate(17)
keystate30 = keystate(30)
keystate31 = keystate(31)
keystate32 = keystate(32)
` Get mouse input
cammovex = mousemovex()
cammovey = mousemovey()
` Control camera movement
if (keystate17-keystate31 or keystate32-keystate30)
sx = camera angle x()
sy = camera angle y()
sz = camera angle z()
y = atanfull(keystate32-keystate30, keystate17-keystate31)
rotate camera 0, sy+y, sz
move camera 0.25
rotate camera sx, sy, sz
endif
` Control camera view
camangx = camera angle x()-cammovey/5.0
camangy = camera angle y()-cammovex/5.0
if (wrapvalue(camangx)>85.0 and wrapvalue(camangx)<180.0)
camangx = 85.0
endif
if (wrapvalue(camangx)>180.0 and wrapvalue(camangx)<275.0)
camangx = 275.0
endif
rotate camera camangx, camangy, camera angle z()
endfunction
function PointInFrustum(xPos as float, yPos as float, zPos as float)
local Result as boolean
local i as integer
Result = 0
set vector3 10, xPos, yPos, zPos
projection matrix4 8
view matrix4 9
multiply matrix4 7, 9, 8
` Left clipping plane
set vector4 1, get matrix4 element(7, 3)+get matrix4 element(7, 0), get matrix4 element(7, 7)+get matrix4 element(7, 4), get matrix4 element(7, 11)+get matrix4 element(7, 8), get matrix4 element(7, 15)+get matrix4 element(7, 12)
` Right clipping plane
set vector4 2, get matrix4 element(7, 3)-get matrix4 element(7, 0), get matrix4 element(7, 7)-get matrix4 element(7, 4), get matrix4 element(7, 11)-get matrix4 element(7, 8), get matrix4 element(7, 15)-get matrix4 element(7, 12)
` Top clipping plane
set vector4 3, get matrix4 element(7, 3)-get matrix4 element(7, 1), get matrix4 element(7, 7)-get matrix4 element(7, 5), get matrix4 element(7, 11)-get matrix4 element(7, 9), get matrix4 element(7, 15)-get matrix4 element(7, 13)
` Bottom clipping plane
set vector4 4, get matrix4 element(7, 3)+get matrix4 element(7, 1), get matrix4 element(7, 7)+get matrix4 element(7, 5), get matrix4 element(7, 11)+get matrix4 element(7, 9), get matrix4 element(7, 15)+get matrix4 element(7, 13)
` Near clipping plane
set vector4 5, get matrix4 element(7, 2), get matrix4 element(7, 6), get matrix4 element(7, 10), get matrix4 element(7, 14)
` Far clipping plane
set vector4 6, get matrix4 element(7, 3)-get matrix4 element(7, 2), get matrix4 element(7, 7)-get matrix4 element(7, 6), get matrix4 element(7, 11)-get matrix4 element(7, 10), get matrix4 element(7, 15)-get matrix4 element(7, 14)
` Normalize the planes
for i=1 to 6
normalize vector4 i, i
next i
` Check if 3D point is in view frustum
for i=1 to 6
if (x vector4(i)*x vector3(10)+y vector4(i)*y vector3(10)+z vector4(i)*z vector3(10)+w vector4(i)<0.0)
exitfunction Result
endif
next i
Result = 1
endfunction Result