Так: немного подправим код для удобства:
внесём прицел в функцию создания перса, м немного морфируем физ. модель игрока. Теперь уже понятно почему и когда мы крутим камеру и основание. И теперь для удобства просчёта коллизий камеру поместим в центр прозрачной сферы.
И ещё
CameraRange camera,0.1,100
установит минимальный и максимальный радиусы рендеринга
;инициализация графики
Graphics3D 800,600,32
SetBuffer BackBuffer()
Global user
Global camera
Const G#=1
Const USERT=1;for user
Const TERRT=2;for terrain
Global pricel=LoadImage("pricel.bmp")
;создание игрока
Function create_user(x#=0,y#=10,z#=0)
MidHandle pricel
MaskImage pricel,255,255,255
user=CreateSphere()
k#=3
ScaleEntity user,k#,k#,k#
EntityRadius user,k#
camera=CreateCamera(user)
CameraRange camera,0.1,100
PositionEntity user,x#,y#,z#
EntityType user,USERT
End Function
;обновление игрока
Function update_user()
V#=0.5
u#=70;предельный угол
TurnEntity camera,MouseYSpeed(),0,0
TurnEntity user,0,-MouseXSpeed(),0
If KeyDown(203)=1 Then MoveEntity user,-V#,0,0
If KeyDown(205)=1 Then MoveEntity user,V#,0,0
If KeyDown(200)=1 Then MoveEntity user,0,0,+V#
If KeyDown(208)=1 Then MoveEntity user,0,0,-V#
MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
If Abs(EntityPitch#(camera))>u# RotateEntity camera,u#*Sgn(EntityPitch#(camera)),0,0
;физика
TranslateEntity user,0,-G#,0
End Function
;создание игрового мира
Function create_world()
terrain=CreatePlane()
tertex=LoadTexture("terrain1.jpg")
ScaleTexture tertex,10,10
EntityTexture terrain,tertex
FreeTexture tertex
EntityType terrain,TERRT
create_user()
Collisions USERT,TERRT,2,3
End Function
;функции закончились
;--------------------------------
create_world()
;MAIN LOOP
While Not KeyHit(1)=1
update_user()
UpdateWorld()
RenderWorld()
DrawImage pricel,MouseX(),MouseY()
Flip
Wend
;----------------------------
End