:) funny ..
;setup graphics
Graphics3D 800, 600, 0, 2
SetBuffer BackBuffer()
;create camera
cam = CreateCamera()
;position camera
MoveEntity cam, 0, 0, -15
;create cube
cube = CreateCube(cam)
PositionEntity cube, 0, 0, 0, 1
ScaleEntity cube, 1, 1, 0.01
;init bounds
GetLimits(cam, cube, 100, 100, 700, 500)
EntityOrder cube, -1
z# = 0
For i = 0 To 100
c = CreateCube()
ScaleEntity c, 0.1, 0.1, 0.1
EntityColor c,Rand(255),Rand(255),Rand(255)
PositionEntity c, Rnd(-10, 10), Rnd(-10, 10), Rnd(-10, 10) - 15
Next
;main loop
Repeat
TurnEntity cam, 0, 1, 0
;move cube
x# = x# + (MouseXSpeed() * 0.01)
y# = y# - (MouseYSpeed() * 0.01)
PositionEntity cube, x, y, EntityZ(cube)
MoveMouse 400, 300
;limit cube's position
LimitPosition cam, cube
RenderWorld()
;draw bounds (100,100)-(700,500)
Color 0, 0, 255
Rect 100, 100, 600, 400, 0
Flip
Until KeyHit(1)
End
Global minx#, miny#, maxx#, maxy#
Function GetLimits(cam, ent, x1, y1, x2, y2)
;determine distance entity->camera
TFormPoint EntityX(ent, 1), EntityY(ent, 1), EntityZ(ent, 1), 0, cam
;create temp. plane
plane = CreatePlane(1, cam)
;move away from camera
PositionEntity plane, 0, 0, TFormedZ()
;turn towards camera
RotateEntity plane, -90, 0, 0
;make plane pickable
EntityPickMode plane, 2
;pick upperleft coords
CameraPick cam, x1, y1
TFormPoint PickedX(), PickedY(), PickedZ(), 0, cam
;store upperleft coords
minx# = TFormedX()
miny# = TFormedY()
;pick bottomright coords
CameraPick cam, x2, y2
TFormPoint PickedX(), PickedY(), PickedZ(), 0, cam
;store bottomright coords
maxx# = TFormedX()
maxy# = TFormedY()
;free temp. plane
FreeEntity plane
;swap coords if needed
If maxx < minx Then
t# = maxx
maxx = minx
minx = t#
End If
;swap coords if needed
If maxy < miny Then
t# = maxy
maxy = miny
miny = t
End If
End Function
;apply limits
Function LimitPosition(cam, ent)
;convert current coords to camera coords
TFormPoint EntityX(ent, 1), EntityY(ent, 1), EntityZ(ent, 1), 0, cam
x# = TFormedX()
y# = TFormedY()
z# = TFormedZ()
;limit coords
If x < minx Then x = minx
If x > maxx Then x = maxx
If y < miny Then y = miny
If y > maxy Then y = maxy
;convert coords back to world coords
TFormPoint x, y, z, cam, 0
;reposition object
PositionEntity ent, TFormedX(), TFormedY(), TFormedZ(), 1
End Function
However, instead of using MouseXSpeed/MouseYSpeed, you could also create the plane, make it invisible using EntityAlpha and pickable, and use CameraPick to determine where the crosshair should be:
;setup graphics
Graphics3D 800, 600, 0, 2
SetBuffer BackBuffer()
;create camera
cam = CreateCamera()
;position camera
MoveEntity cam, 0, 0, -15
;create cube
cube = CreateCube()
ScaleEntity cube, 1, 1, 0.01
plane = CreatePlane()
TurnEntity plane, -90, 0, 0
EntityPickMode plane, 2
EntityAlpha plane, 0.1
;main loop
Repeat
mx = mx + MouseXSpeed()
my = my + MouseYSpeed()
MoveMouse 400, 300
If mx < 0 Then mx = 0
If my < 0 Then my = 0
If mx > 800 Then mx = 800
If my > 600 Then my = 600
CameraPick cam, mx, my
PositionEntity cube, PickedX(), PickedY(), PickedZ()
RenderWorld()
Flip
Until KeyHit(1)
End