forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши (http://forum.boolean.name/showthread.php?t=13689)

Слейпнир 09.11.2010 23:10

Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
 
Всех приветствую! Я новичек... жуть как хочется освоить этот язык...

Что имеется: *земля и небо(в виде куба-вид изнутри)
*персонаж - простая сфера(пока не разобрался с пачем на 3дмакс 2009)
*сферой можно упрвлять "WSAD"
*Камера на небольшом расстянии смотрит на сферу, при этом можно передвигая мышь крутится вокруг неё, но тут возникла проблема...передвинув мышь сферу начинает мотать из стороны в сторону, можно с земли на небо улететь ), ограничения на вращение нет(просто не знаю как поставить)


Вопросы:
1) Как организовать вращение камеры вокруг объекта(сферы) по осям (X,Y, "Z"-не уверен что нужна) при зажатой правой кнопки мыши, без мотания её из стороны в сторону, с ограничениями верх-низ и последующим плавным возвращением за спину сферы?

2) Как сделать чтобы курсор мыши был всегда видимым в процессе игры...(покачто условно "игры":rolleyes: ), и при нажатии правой кнопки мыши исчезал нормально, при отпускании появляся (showpointer и hidepointer будет так работать ?) ? Сам курсор мыши пока вообще не удалось вывести на экран...

Вобщим был на многих ресурсах, много кусков кода насобирал, сам половину не понимаю... возможно проблема решится простым удалением частей кода ?

Очень прошу, помогите оптимизировать код...

полный код:

Код:

Graphics3D 800,600,32,1;
SetBuffer BackBuffer()
lit=CreateLight(2);
RotateEntity lit,90,0,0


AmbientLight 200,200,200


Include "CONST.bb";
Include "COLLISIONS.bb"
Include "GLOBAL.bb"

Text 320,0,"Click to reset mouse",True

Text 0,0,"Mouse X:"+MouseX()
Text 0,10,"Mouse Y:"+MouseY()

If MouseDown(1) Or MouseDown(2) Then MoveMouse 320,240

Text MouseX(),MouseY(),"X",True,True



Flip


;mouse.bb
 
;ShowPointer()   
;Global mouse_pic=LoadImage( "Picture.bmp" )   

;While Not KeyHit(1)=1   

;UpdateWorld()   
;RenderWorld()
;Cls   
;DrawImage mouse_pic, MouseX(),MouseY()   
;Flip     

;Wend




;-------------------------------------------------------------
Setup();
period=1000/FPS;
time=MilliSecs()-period;
;MAIN LOOP ;  ----------------------------------------- 
While Not KeyHit(1)=1;                                     
Include "FPS.bb";


Repeat
                elapsed=MilliSecs()-time
        Until elapsed
        ticks=elapsed/period
        ;tween#=Float(elapsed Mod period)/Float(period)
        For k=1 To ticks
                time=time+period
                If k=ticks Then CaptureWorld

Update_Game()                                                                   
UpdateWorld()                                                                     
    Next
RenderWorld ; tween


Text 0,0,"user  x="+EntityX(user,1);
Text 0,15,"user  y="+EntityY(user,1)
Text 0,30,"user  z="+EntityZ(user,1)
Text 0,45,"centr y="+EntityY(centr,1)
Text 0,90,"Треугольников рендерится: "+TrisRendered()
Text 0,105,"fps: "+Framecounter_framerate

Flip
Wend
;-------------------------------------------------------------- 
;ClearWorld();



Function Setup() 
                font=LoadFont("Arial Cyr",16,True,False,True)
                SetFont font
                Color 255,0,0
                create_ground()
                sky=MakeSkyBox("textures\nebo\")
                ScaleEntity sky,20,20,20
                create_user()
End Function


Function create_ground()





                        terrain=CreatePlane()
                        tertex=LoadTexture("textures\zemlya\grass.jpg")
                        ScaleTexture tertex,10,10
                        EntityTexture terrain,tertex
                        ; FreeTexture tertex
                        EntityType terrain,TERRT
                        EntityPickMode terrain,2
End Function




Function MakeSkyBox( file$ )
                            m=CreateMesh()
                            b=LoadBrush( file$+"front.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
                            AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"right.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
                            AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"back.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
                            AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"left.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
                            AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"up.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
                            AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b
                            ScaleMesh m,100,100,100
                            FlipMesh m
                            EntityFX m,9
                            EntityOrder m,10
                            Return m
End Function



Function create_user(x#=-0,y#=4,z#=0)
                                    user=CreateSphere()
                                    EntityRadius user,3,3

                                    EntityType user,USERT
                                    centr=CreatePivot (user)

                                    MoveEntity  centr,0,4,-10
 
                                    camera=CreateCamera(centr)

                                    CameraRange camera,0.10,10000
                                    ;CameraRange camera,0.01,10000;

                                    microphone=CreateListener(camera,.2,1,.2); звуки
                                    PositionEntity user,x#,y#,z#
End Function

Function update_user()
                      If KeyHit(46) us=us+1
                      If us=2 us=0
                      If us=1 And kcam=0
                      MoveEntity centr,0,-0.15,0
                      If EntityY (centr,1)=<EntityY(user,1) Then kcam=1:ncam=1:V1#=0.05:EntityRadius user,2,3
                    EndIf

                      If us=0 And kcam=1
                      PositionEntity user,EntityX(user),EntityY(user)+1.8,EntityZ(user),1
                      EntityRadius user,3,3
                      PositionEntity centr,EntityX(user),EntityY(user)-1.8,EntityZ(user),1
                      kcam=0
                    EndIf

                      If kcam=0 And ncam=1
                      MoveEntity centr,0,0.15,0
                      If EntityY (centr,1)=>EntityY(user,1)+2.5 Then ncam=0:V1#=0.2
                    EndIf

                      pick_ent=LinePick(EntityX(user),EntityY(user),EntityZ(user),0,-3.6,0)
                      If pick_ent
                      jump_bool=False
                      Else
                      jump_bool=True
                    EndIf

  If KeyHit(57) And jump_bool=False And ncam=0 Then jmp#=0.7:j#=EntityY(user,1)
  If EntityY (user,1)=>j#+8 Then jmp#=0
  MoveEntity user,0,jmp#-G#,0

  If KeyDown(42)=1
    V2#=V1#+V1#*0.5
  Else
    V2#=V1#
  EndIf

  If KeyDown(30)=1 MoveEntity user,-V2#,0,0
  If KeyDown(32)=1 MoveEntity user,V2#,0,0
  If KeyDown(17)=1 MoveEntity user,0,0,+V2#
  If KeyDown(31)=1 MoveEntity user,0,0,-V2#

;-----------------------------

TurnEntity user,MouseYSpeed()*0.3,0,0

TurnEntity user,0,-MouseXSpeed()*0.5,0
;-----===================-----

  If KeyDown(30)=1  Then MoveEntity user,-V#,0,0
  If KeyDown(32)=1  Then MoveEntity user,V#,0,0
  If KeyDown(17)=1  Then MoveEntity user,0,0,+V#
  If KeyDown(31)=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 ;

  Return

End Function

Function Update_Game()
        update_user;
                         
End Function

Код:

;CONST.bb

Const G#=0.4;
Const u#=70;п
Const USERT=1;
Const TERRT=2;
Const FPS=50

Код:

;GLOBAL.bb

Global centr;
Global camera
Global user;
Global V1#=0.2;
Global j#;
Global  jmp#;
Global kcam;
Global ncam;
Global us;

Код:

;COLLISIONS.bb
Collisions USERT,TERRT,2,3


baton4ik 09.11.2010 23:26

Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
 
Цитата:

Вобщим был на многих ресурсах, много кусков кода насобирал, сам половину не понимаю... возможно проблема решится простым удалением частей кода ?
Проблема решится написанием своего кода

Цитата:

2) Как сделать чтобы курсор мыши был всегда видимым в процессе игры...(покачто условно "игры":rolleyes: ), и при нажатии правой кнопки мыши исчезал нормально, при отпускании появляся (showpointer и hidepointer будет так работать ?) ? Сам курсор мыши пока вообще не удалось вывести на экран...
Загружаешь какртинку для курсора и рисуешь в цикле в координаты мыши. Если зажата пкм, то не рисуешь.
If Not MouseHit(2) DrawImage(pointer,MouseX(),MouseY())

Цитата:

Сообщение от Слейпнир (Сообщение 167800)
1) Как организовать вращение камеры вокруг объекта(сферы) по осям (X,Y, "Z"-не уверен что нужна) при зажатой правой кнопки мыши, без мотания её из стороны в сторону, с ограничениями верх-низ и последующим плавным возвращением за спину сферы?

Проще простого: привязываешь камеру к объекту и перемещаешь её

impersonalis 09.11.2010 23:34

Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
 
Какие знакомые куски кода. :)
http://forum.boolean.name/showthread.php?t=15

Слейпнир 09.11.2010 23:44

Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
 
Цитата:

Сообщение от baton4ik (Сообщение 167804)
Загружаешь какртинку для курсора и рисуешь в цикле в координаты мыши. Если зажата пкм, то не рисуешь.
If Not MouseHit(2) DrawImage(pointer,MouseX(),MouseY())

Вствлял это

Код:

ShowPointer()   
Global mouse_pic=LoadImage( "Picture.bmp" )   
While Not KeyHit(1)=1   
UpdateWorld()   
RenderWorld()
Cls   
DrawImage mouse_pic, MouseX(),MouseY()   
Flip     
Wend

практически во все части кода, пытался убрать строки While Not KeyHit(1)=1 и Wend, UpdateWorld() и RenderWorld()...пытался в конце кода Wend поставить...пробовал просто вот так:
Код:

Global mouse_pic=LoadImage( "Picture.bmp" )
DrawImage mouse_pic, MouseX(),MouseY()

Из моих методов тыка иногда мышь появлялась на черном экране, нормально двигалась, после нажатия Esc появляась игра(ну там земля-небо-сфера...)

Цитата:

Сообщение от baton4ik (Сообщение 167804)
Проще простого: привязываешь камеру к объекту и перемещаешь её

Где-то в коде камера привязана к объекту(не уверен), но при движении мышкой почемуто двигается сфера... не могу найти где убрать это ее движение и летание, надо ведь чтоб просто объект стоял на месте при вращении

Слейпнир 09.11.2010 23:48

Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
 
может выложить сие чудо ?

baton4ik 10.11.2010 00:02

Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
 
Чувак, ну дам я тебе код, ты ничего не поймёшь. Удаляй это мимо корзины и учи всё с самого начала. Если б ты учил, то знал бы, что рисовать надо между рендером и флипом.
------------------
Беглым просмотром кода привязку не нашёл. Привязывай в цикле с PointEntity и потом перемещай камеру.


Часовой пояс GMT +4, время: 08:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot