[Gelöst] Kugel mit der Maus drehen (Globus)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Ratchet

Betreff: [Gelöst] Kugel mit der Maus drehen (Globus)

BeitragMi, März 31, 2010 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte eine einfache Kugel mit der Maus drehen können, wie einen Globus in Google Earth. Das funktioniert zwar vertikal und horizontal, aber wenn man die Kugel z.B. diagonal dreht stimmt das Verhältnis nicht mehr. Klar, ich drehe immer die gleichen Achsen und dann verdreht sich alles. Ich müsste also bei jedem Mal wenn ich anfange mit der Maus zu drehen die gleiche Basis haben. Aber wie mache ich das am besten?

Ach ja, das Programm ist ein MiniB3D, also BlitzMax, Programm. Daher wird es sich nicht direkt mit B3D übersetzen lassen.

BlitzBasic: [AUSKLAPPEN]

Local width=640,height=480,depth=32,mode=2

Graphics3D width, height, depth, mode
AntiAlias 8

Local cam:TCamera=CreateCamera()
PositionEntity cam,0,0,-15

Local light:TLight=CreateLight()
RotateEntity light,45,0,0

Local marker:TMesh=CreateSphere()
ScaleEntity marker,0.2,0.2,0.2
EntityColor marker,255,0,0

Local mesh:TMesh=CreateSphere()
EntityPickMode mesh,2
ScaleEntity mesh,6,6,6


' used by fps code
Local old_ms=MilliSecs()
Local renders
Local fps
Local mx: Float
Local my: Float
Local lx: Float
Local ly: Float

While Not KeyDown(KEY_ESCAPE)
lx = MouseX()
ly = MouseY()

If KeyHit(KEY_ENTER) Then DebugStop

' control camera
MoveEntity cam,KeyDown(KEY_D)-KeyDown(KEY_A),0,KeyDown(KEY_W)-KeyDown(KEY_S)
TurnEntity cam,KeyDown(KEY_DOWN)-KeyDown(KEY_UP),KeyDown(KEY_LEFT)-KeyDown(KEY_RIGHT),0

'TurnEntity mesh,0,1,0

' If MouseDown Then perform CameraPick
Local pick:TEntity
If MouseHit(MOUSE_LEFT)

' reset entity colors
EntityColor mesh,255,255,255

pick:TEntity=CameraPick(cam,MouseX(),MouseY())

If pick<>Null
EntityColor pick,255,255,0
PositionEntity marker,PickedX(),PickedY(),PickedZ()
EndIf

EndIf

'hier wird die kugel gedreht
If MouseDown(MOUSE_LEFT) Then
pick:TEntity=CameraPick(cam,MouseX(),MouseY())

If pick = mesh
TurnEntity(mesh, 0, mx, my) 'mx/my ist MouseX/YSpeed
EntityColor pick,255,255,0
EndIf
End If

RenderWorld
renders=renders+1

' calculate fps
If MilliSecs()-old_ms>=1000
old_ms=MilliSecs()
fps=renders
renders=0
EndIf

Text 0,0,"FPS: "+fps

If pick<>Null
Text 0,20,"Picked!"
Else
Text 0,20,"Not Picked"
EndIf

Flip
mx = MouseXSpeed()
my = MouseYSpeed()
Wend
End
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
  • Zuletzt bearbeitet von Ratchet am Mi, März 31, 2010 16:42, insgesamt einmal bearbeitet

Hakkai

BeitragMi, März 31, 2010 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe dafür immer einen Pivot für jede Achse erstellt und diese Pivots nur auf dieser einen Achse gedreht.

Ratchet

BeitragMi, März 31, 2010 15:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe dein Idee. Habe mal promt versucht es umzusetzen. Allerdings verhält sich das ganze immer noch komisch und ich verstehe nicht was ich falsch mache. Habe den Teil der sich um das Drehen kümmert nun so angepasst. Ich denke ich habe bei meinem EntityParent noch einen Denkfehler...

BlitzBasic: [AUSKLAPPEN]
	;hier wird die kugel gedreht
If MouseDown(MOUSE_LEFT) Then
pick: TEntity = CameraPick(cam, MouseX(), MouseY())
If IsMouseDown Then
EntityParent mesh, xp, 1 ;Pivot für X-Achse
TurnEntity(xp, 0, mx, 0) ; XAchse drehen

EntityParent mesh, yp, 1 ;Pivot für Y-Achse
TurnEntity(yp, -my, 0, 0) ;Y-Achse drehen
Else
If pick = mesh
;wenn die Kugel angeklickt wird die Pivots neu setzten
xp = CreatePivot()
yp = CreatePivot()
EntityColor pick,255,255,0
EndIf
IsMouseDown = True
End If
Else
IsMouseDown = False
End If
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Hakkai

BeitragMi, März 31, 2010 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Createbefehle würde ich nicht auf Ereignisse wie Mousedown legen, da hast du am Ende was weis ich wieviele Pivots. Am besten du erstellst die beim start und verschiebst diese dann nur noch.

Bei Turnentity musst du dir das mit den Achsen so vorstellen das dein Objekt an die Achse geheftet ist und die Achse sich dreht, bei der X-Achse wäre das der Pitch und turnentity wird dann auch in der Reihenfolge x,0,0 belegt.

Je nachdem was bei dir die Ausgangsachse ist, ich schätze mal y, musst du die x-Achse auch noch an den y-pivot heften inder Form das yPiv parent von xPiv ist.

Dadurch wird X-Rotation in Abhängigkeit von der Y-Rotation ausgeführt, das sollte klappen.

Ratchet

BeitragMi, März 31, 2010 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank, jetzt klappt es. Dass die eine Achse der Parent der anderen sein muss war wirklich das Problem.
Hier nochmal das ganze Konstrukt (ich weiß der Source ist nicht schön, aber es ist nur ein Test; Zeit für ein Refactoring):

BlitzBasic: [AUSKLAPPEN]
Local width=640,height=480,depth=32,mode=2

Graphics3D width, height, depth, mode
AntiAlias 8

Local cam:TCamera=CreateCamera()
PositionEntity cam,0,0,-15

Local light:TLight=CreateLight()
RotateEntity light,45,0,0

Local marker:TMesh=CreateSphere()
ScaleEntity marker,0.2,0.2,0.2
EntityColor marker,255,0,0

Local mesh:TMesh=CreateSphere()
EntityPickMode mesh,2
ScaleEntity mesh, 6, 6, 6

Local earth: TTexture = LoadTexture("earth.png")
EntityTexture mesh, earth

' used by fps code
Local old_ms=MilliSecs()
Local renders
Local fps
Local mx: Float
Local my: Float
Local lx: Float = 0
Local ly: Float = 0
Local IsMouseDown: Byte = False
Local xp: TPivot
Local yp: TPivot


While Not KeyDown(KEY_ESCAPE)
lx = MouseX()
ly = MouseY()

If KeyHit(KEY_ENTER) Then DebugStop

' control camera
MoveEntity cam,KeyDown(KEY_D)-KeyDown(KEY_A),0,KeyDown(KEY_W)-KeyDown(KEY_S)
TurnEntity cam,KeyDown(KEY_DOWN)-KeyDown(KEY_UP),KeyDown(KEY_LEFT)-KeyDown(KEY_RIGHT),0

'TurnEntity mesh,0,1,0

' If MouseDown Then perform CameraPick
Local pick:TEntity
If MouseHit(MOUSE_LEFT)

' reset entity colors
EntityColor mesh,255,255,255

pick:TEntity=CameraPick(cam,MouseX(),MouseY())

If pick<>Null
PositionEntity marker,PickedX(),PickedY(),PickedZ()
EndIf

EndIf

'hier wird die kugel gedreht
If MouseDown(MOUSE_LEFT) Then
pick:TEntity = CameraPick(cam, MouseX(), MouseY())
If IsMouseDown Then
TurnEntity(xp, 0, mx / 5, 0)
TurnEntity(yp, -my / 5, 0, 0)
Else
If pick = mesh
xp = CreatePivot()
yp = CreatePivot()
EntityParent yp, xp, 1
EntityParent mesh, yp, 1
EndIf
IsMouseDown = True
End If
Else
IsMouseDown = False
xp = Null
yp = Null
GCCollect()
End If

RenderWorld
renders=renders+1

' calculate fps
If MilliSecs()-old_ms>=1000
old_ms=MilliSecs()
fps=renders
renders=0
EndIf

Text 0,0,"FPS: "+fps

If pick<>Null
Text 0,20,"Picked!"
Else
Text 0,20,"Not Picked"
EndIf

If IsMouseDown Then
Text 0, 40, "DOWN"
End If

Flip
mx = MouseXSpeed()
my = MouseYSpeed()
If IsMouseDown Then
lx = MouseXSpeed()
ly = MouseYSpeed()
End If
Wend
End
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group