3dsmax Kamerasteuerung

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

chi

Betreff: 3dsmax Kamerasteuerung

BeitragDi, Dez 12, 2006 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo leute!

hab ein kleines problem mit meiner 3dsmax-ähnlichen kamerasteuerung und hoffe jemand von euch kann mir vielleicht weiterhelfen...

ich möchte mich unendlich um die objekte drehen, bewegen oder zoomen können, doch im moment springt alles wieder in seine ausgangsposition wenn ich mit der gedrückten maus ausserhalb des fensters komme... is jetzt etwas blöd erklärt, aber wenn ihr euch das beispiel anschaut wisst ihr sicher gleich was ich meine Wink

vielleicht hat jemand eine idee ?!? thx, chi


Code: [AUSKLAPPEN]

global width=800,height=540,onstart=1
graphics3d width,height,0,2
setbuffer backbuffer()

camerapivot= createsphere()
scaleentity camerapivot,0.2,0.2,0.2
brush=createbrush()
brushcolor brush,255,0,0
paintmesh camerapivot,brush

camera=createcamera(camerapivot)
camerazoom camera,1.2
camerarange camera,0.1,200
cameraclscolor camera,190,190,190
camerabank=createbank(48)

obj1=createcube()
positionentity obj1,0,1,0
obj2=createcone()
positionentity obj2,0,1,5
obj3=createcylinder()
positionentity obj3,5,1,5



while not keyhit(1)
   cls
    updateworld
    renderworld
    cameramouseview(camerapivot,camera,camerabank)
    text 0,0," lmb=drehen  rmb=zoomen  lmb+rmb=bewegen " +"     mx=" +mousex() +" my=" +mousey()
    vwait
    flip 0
    delay 2
wend
end




function cameramouseview(camerapivot,camera,camerabank,speed#=0.05)

 local movex,movey,camx#,camy#,camz#,pivx#,pivz#,angle#,xaxis#,zaxis#

 if speed#<0.01 then speed#=0.01
 if peekfloat(camerabank,36)=0 then pokefloat camerabank,36,-70

 pokeint camerabank,0,peekint(camerabank,8)
 pokeint camerabank,4,peekint(camerabank,16)
 pokeint camerabank,8,mousex()
 pokeint camerabank,16,mousey()
 pokeint camerabank,20,mousex()-peekint(camerabank,0)
 pokeint camerabank,24,mousey()-peekint(camerabank,4)

 movex=peekint(camerabank,20)
 movey=peekint(camerabank,24)
 camx#=peekfloat(camerabank,28)
 camy#=peekfloat(camerabank,32)
 camz#=peekfloat(camerabank,36)
 pivx#=peekfloat(camerabank,40)
 pivz#=peekfloat(camerabank,44)

if mousedown(1) and mousedown(2)
   angle#=camy# : xaxis#=speed# : zaxis#=speed#
   if angle#>90 and angle#<270 then zaxis#=-zaxis#
   if angle#>180 then angle#=360-angle# : xaxis#=-xaxis#
   if angle#>90 then angle#=180-angle#
   angle#=angle#*0.011
   pivx#=pivx#-(movex*(1-angle#)*zaxis#)-(movey*angle#*xaxis#)
   pivz#=pivz#-(movex*angle#*xaxis#)+(movey*(1-angle#)*zaxis#)
   if mousex() <=1 then movemouse width/2,mousey()
   if mousex() >=width-1 then movemouse width/2,mousey()
   if mousey() <=1 then movemouse mousex(),height/2
   if mousey() >=height-1 then movemouse mousex(),height/2
elseif mousedown(2)
   camz#=camz#-movey*speed#
   if camz#>-3 then camz#=-3
   if mousey() <=3 then movemouse mousex(),height/2
   if mousey() >=height-3 then movemouse mousex(),height/2
elseif mousedown(1)
   camx#=camx#+(movey*10*speed#)
   if camx#>90 then camx#=90
   if camx#<5 then camx#=5
   camy#=camy#-(movex*10*speed#)
   if camy#>359 then camy#=0
   if camy#<0 then camy#=359
   if mousex() <=3 then movemouse width/2,mousey()
   if mousex() >=width-3 then movemouse width/2,mousey()
endif

if onstart=1
 camx#=40
 camy#=20
 onstart=0
endif

 pokefloat camerabank,28,camx#
 pokefloat camerabank,32,camy#
 pokefloat camerabank,36,camz#
 pokefloat camerabank,40,pivx#
 pokefloat camerabank,44,pivz#

 positionentity camerapivot,pivx#,0,pivz#
 rotateentity camerapivot,camx#,camy#,0
 positionentity camera,0,0,camz#

end function
 

Krümel

BeitragMi, Dez 13, 2006 0:12
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo chi,

vorab eine frage, wieso machst du das so kompliziert mit bank und peek/poke anstatt ein type für die camera zu verwenden?
 

chi

BeitragMi, Dez 13, 2006 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
um ehrlich zu sein is der code nicht ganz von mir... nur a bissl überarbeitet. so gut bin ich noch nicht um das alles allein zu progen.
aber ich schätze mal, daß es mit types genauso funktionieren würde und mein problem mit der durchgehenden drehung usw. noch immer bestehen würde... korrigiere mich bitte wenn ich falsch liege Wink


lg, chi
 

Krümel

BeitragMi, Dez 13, 2006 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, hier ein beispiel wie ich die steuerung machen würde:

Code: [AUSKLAPPEN]

Graphics3D 640,480,16,2
SetBuffer BackBuffer()

Type camera
   Field Camera
   Field Pivot
End Type

Function MoveCamera(camera.camera, dirX#,dirY#, Button)
   Select Button
      Case 1 ;Left Button - drehen
         TurnEntity camera\pivot, diry , dirx , 0, 0
      Case 2 ;Right Button - zoomen
         MoveEntity camera\Camera, 0,0, (-dirx + diry) * 0.1
      Case 3 ;Left+Right Button - bewegen
         MoveEntity camera\Camera, -dirx * 0.1 ,diry * 0.1 ,0
   End Select
End Function

CreateLight()

obj1=CreateCube()
PositionEntity obj1,0,1,0
obj2=CreateCone()
PositionEntity obj2,0,1,5
obj3=CreateCylinder()
PositionEntity obj3,5,1,5

camera1.camera=New camera
camera1\Pivot=CreateSphere()
ScaleMesh camera1\Pivot,0.2,0.2,0.2
EntityColor camera1\Pivot,255,0,0
camera1\Camera=CreateCamera()
EntityParent camera1\camera, camera1\pivot
MoveEntity camera1\camera,0,0,-10

While Not KeyHit(1)

   If MouseDown(1) Or MouseDown(2)   
      If ButtonPressed=False
         ButtonPressed=True
         oldMouseX=MouseX()
         oldMouseY=MouseY()         
         MoveMouse 320,240
         HidePointer
      EndIf
         
      moveCamera(camera1, MouseXSpeed()*0.1, MouseYSpeed()*0.1, MouseDown(1)+MouseDown(2)*2)

      MoveMouse 320,240      
   Else
      If ButtonPressed=True
         ButtonPressed=False
         MoveMouse oldMouseX,oldMouseY
         ShowPointer
      EndIf
   EndIf   
   
   RenderWorld
   Flip
Wend


 

chi

BeitragMi, Dez 13, 2006 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
hey danke krümel... werd mich gleich mal hinsetzten und alles durchackern Wink hoffe ich check alles...


thx again, chi

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group