mesh in richtung maus drehen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

alliswrong

Betreff: mesh in richtung maus drehen

BeitragFr, Jul 10, 2009 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein gott, mit dem ganzen 3d zeugs muss man erstmal klar kommen.
ich habe nun folgendes problem:

ich habe vor ein spiel in b3d spaßeshalber zu schreiben. hierbei sieht man ein raumschiff "von oben". das heißt, die Z achse spielt keine rolle (bis auf die zoomstufe). nun kann ich mein raumschiff mit den pfeiltasten bewegen - soweit sogut.

Nun möchte ich aber einen schritt weiter: Mein Raumschiff soll sich immer richtung maus drehen (ROLL). Habe hierzu auch schon paar stunden im forum verbracht um eine lösung zu finden. Allerdings finde ich immer nur ausrichtungen die meinen ansprüchen nicht gerecht werden bzw. die ich scheinbar nicht nachvollziehen kann. Ich bin so ein mensch, ich möchte verstehen wie das funktioniert. Hierzu nehme ich mir immer code und nehme den auseinander bis ich weiß was er genau macht. Doch diesmal finde ich keinen code dazu und auch keine hilfestellung. Wer weiß rat?

Achso, hier mal nen beispielcode um zu sehen wie die camera ausgerichtet ist.
Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

player = CreateCube()
camera = CreateCamera()
light = CreateLight()
PositionEntity camera, 0,0,-20


While Not KeyHit(1)
   


   UpdateWorld
   RenderWorld
    Text 0,0,"X: " + x_unter
   Flip
Wend

End


vielen dank euch allen.
 

Krischan

BeitragFr, Jul 10, 2009 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm probiers mal hiermit. Der Player wird mit dem Befehl Aligntovector auf die Koordinaten des Cursors ausgerichtet (dabei muss man die Mousekoordinaten anhand der Auflösung umrechnen).

Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SetBuffer BackBuffer()

player = CreateCone()

camera = CreateCamera()
light = CreateLight()
PositionEntity camera,0,0,-20

While Not KeyHit(1)
   
   mx=-(GraphicsWidth()/2-MouseX())
   my=GraphicsHeight()/2-MouseY()
   
   AlignToVector player,mx,my,0,2,0.05
   
   UpdateWorld
   RenderWorld
   
   Text 0,0,mx+","+my
   
   Flip
Wend

End
 

alliswrong

BeitragFr, Jul 10, 2009 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo, danke für die antwort.
diese lösung habe ich auch schon erarbeitet gehabt, allerdings funktioniert das ganze nicht. denn mein code funktioniert etwas anders. undzwar so:

ich erstelle einen player und eine camera. die camera ist parent vom player. nun kann ich den player per pfeiltasten bewegen. dies geschieht mithilfe von moveentity. wenn ich nun dannach noch die funktion aligntovector benutze, so entsteht eine crazy steuerung. wenn ich nach "oben" steuere und die maus drehe so ändert sich die flugrichtung nicht dementsprechend, sondern ich fliege dann "rückwärts". dieses problem kriege ich nicht gelöst.

[edit]
habe mal eben nen lauffähiges beispiel gezaubert. schaut es euch mal an.
Steuerung per W/A/S/D. mit "1" und "2" kann man rein und rauszoomen. Die mausbedienung ist crazy Shocked

Code: [AUSKLAPPEN]

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

Type player
   ; Koordinaten
   Field x#
   Field y#
   Field z#

   ; Bewegung
   Field speed#      ; Beschleunigungsgeschwindigkeit
   Field stopspeed#   ; "Ausrollen" geschwindigkeit
   Field maxspeed#      ; Maximale geschwindigkeit
   Field move%         ; Bewegt sich der player?

   ; Kamera + Model
   Field camera_zoom
   Field camera
   Field model

   ;Temporäre Variablen
   Field tmp_speedX#
   Field tmp_speedY#
   Field tmp_lastmoveX$
   Field tmp_lastmoveY$
End Type


p.player = New player
p\x# = 0
p\y# = 0
p\z# = 0
p\speed# = 0.1
p\stopspeed# = p\speed# / 2
p\maxspeed# = 2
p\move% = 0
p\camera_zoom = -90
p\camera = CreateCamera()
p\model = CreateCube()
EntityParent p\camera, p\model
EntityType p\model, 1

; ###
;light = CreateLight()
cu = CreateSphere(32)
PositionEntity cu, 30, 0, 0
ScaleMesh cu, 20, 20, 20
EntityRadius cu, 20
EntityType cu, 2

worldl = CreateLight(2)
LightColor worldl, 0,0, 255
LightRange worldl, 100
PositionEntity worldl, 30, 0,-200

AmbientLight 100,100,0


While Not KeyHit(1)

   ; #### MOVEMENT ####
   player_movement()

   ; ### ZOOM ###
   If KeyDown(2) Then p\camera_zoom = p\camera_zoom + 10
   If KeyDown(3) Then p\camera_zoom = p\camera_zoom - 10
   PositionEntity p\camera, 0, 0, p\camera_zoom
   Collisions 1, 2, 1, 2
   ; ### ZOOM ###

   ; ### NEU ###
   mx=-(GraphicsWidth()/2-MouseX())
      my=GraphicsHeight()/2-MouseY()   
      AlignToVector p\model,mx,my,0,2,0.05
   ; ############

   UpdateWorld
   RenderWorld
   Flip
Wend

End

; Spielerbewegung
Function player_movement()
   For players.player = Each player
      players\move% = 0   
      If KeyDown(17) Then players\tmp_speedY# = players\tmp_speedY# + players\speed# players\tmp_lastmoveY$ = "up" players\move% = 1
      If KeyDown(31) Then players\tmp_speedY# = players\tmp_speedY# - players\speed# players\tmp_lastmoveY$ = "down" players\move% = 1
      If KeyDown(30) Then players\tmp_speedX# = players\tmp_speedX# - players\speed# players\tmp_lastmoveX$ = "left" players\move% = 1
      If KeyDown(32) Then players\tmp_speedX# = players\tmp_speedX# + players\speed# players\tmp_lastmoveX$ = "right" players\move% = 1
   
   
      If players\move% = 0 And players\tmp_lastmoveY$ = "up" Then players\tmp_speedY# = players\tmp_speedY# - players\stopspeed#
      If players\move% = 0 And players\tmp_lastmoveY$ = "up" And players\tmp_speedY# < 0 Then players\tmp_speedY# = 0 players\tmp_lastmoveY$ = ""
   
      If players\move% = 0 And players\tmp_lastmoveY$ = "down" Then players\tmp_speedY# = players\tmp_speedY# + players\stopspeed#
      If players\move% = 0 And players\tmp_lastmoveY$ = "down" And players\tmp_speedY# > 0 Then players\tmp_speedY# = 0 players\tmp_lastmoveY$ = ""
   
      If players\move% = 0 And players\tmp_lastmoveX$ = "left" Then players\tmp_speedX# = players\tmp_speedX# + players\stopspeed#
      If players\move% = 0 And players\tmp_lastmoveX$ = "left" And players\tmp_speedX# > 0 Then players\tmp_speedX# = 0 players\tmp_lastmoveX$ = ""
   
      If players\move% = 0 And players\tmp_lastmoveX$ = "right" Then players\tmp_speedX# = players\tmp_speedX# - players\stopspeed#
      If players\move% = 0 And players\tmp_lastmoveX$ = "right" And players\tmp_speedX# < 0 Then players\tmp_speedX# = 0 players\tmp_lastmoveX$ = ""
   
      If players\tmp_speedX# > players\maxspeed# Then players\tmp_speedX# = players\maxspeed#
      If players\tmp_speedX# < -players\maxspeed# Then players\tmp_speedX# = -players\maxspeed#
      If players\tmp_speedY# > players\maxspeed# Then players\tmp_speedY# = players\maxspeed#
      If players\tmp_speedY# < -players\maxspeed# Then players\tmp_speedY# = -players\maxspeed#
   
      players\x# = players\tmp_speedX#
      players\y# = players\tmp_speedY#
   
      MoveEntity players\model, players\x#, players\y#, players\z#
   Next
End Function
[/code]
  • Zuletzt bearbeitet von alliswrong am Fr, Jul 10, 2009 19:48, insgesamt einmal bearbeitet
 

Krischan

BeitragFr, Jul 10, 2009 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, das stand so nicht da Smile Wenn ich mich recht erinnere hatte ich mal ein ähnliches Problem - beschäftige Dich mal mit einem Pivot, an dem der Player und die Kamera als Childs gehängt werden, und Du bewegst nur den Pivot, also quasi von der Kamerasteuerung entkoppelt.
 

alliswrong

BeitragFr, Jul 10, 2009 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
mir fehlt ein bisschen das verständnis eines pivots. ist das nur ein unsichtbares entity?

[edit]
schau dir mal mein beispiel oben an.
 

Krischan

BeitragFr, Jul 10, 2009 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ein Pivot kann man wie ein 3D-Objekt ansprechen, es ist aber unsichtbar. Also nur ein Punkt im 3D-Raum. Ich habe da mal was mit einem Raumschiff gemacht, schau Dir mal die Funktion InitPlayer an:

http://www.blitzbasic.com/code...?code=2393
 

alliswrong

BeitragFr, Jul 10, 2009 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
habe das ganze mal abgeändert. habe nen pivot erzeugt, mein player model als parent dran gehangen und die camera als parent drangehangen. nun folgt mein player dem mauszeiger. allerdings fliegt der player immer noch rückwärts, wenn ich ihn um 180 grad mit der maus drehe und dann nach "vorne" drücke.
lasse ich den ganzen per alignvecotor ausrichten ist die steuerung noch abgefahrener.
 

alliswrong

BeitragMi, Jul 15, 2009 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
so leute, es funktioniert leider noch immer nicht. habe schon alles versucht, angefangen von rotateentity bishin zu pivot. kriege es nicht hin. vielleicht kann sich mal jemand dazu äußern? selbst das beispiel von kirschan bringt mich nicht weiter...

AnniXa

BeitragSo, Jul 26, 2009 11:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde eine unsichtbare Flache auf höhe des raumschiffes machen (createplane) und dann mit ScreenPick auf dieser fläche eine position im 3d raum ermitteln, und dann das raumschif mit pointentity auf pickedX u.s.w ausrichten.
|moonForge|
Ich bin Pokémon Meisterin seit 1998!
 

SiSoFlo

BeitragSo, Jul 26, 2009 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Dazu braucht man doch keine plane, man kann doch direkt MouseX und MouseY verwenden, oder?
So wie ihr von anderen Menschen behandelt werden wollt so behandelt sie auch!

Silver_Knee

BeitragSo, Jul 26, 2009 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du lust hast rumzurechnen (von wegen ATan und 2Dxy->3Dxyz) ja =) wenn du die rechnerei im besten fall der graka zuschieben willst mach das plane

Nicdel

BeitragSo, Jul 26, 2009 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ist CameraPick und eine Plane wirklich eine Sinnvolle Lösung. Das funktioniert ja mit MouseX und MouseY.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group