3D Rotation

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

3D Rotation

Beitrag von Kevin »

Hi,

ich habe zwei Fragen bezüglich der Rotation im 3D-Raum

Mein erstes Problem ist das ich eine simple Flugzeugsteuerung haben möchte, nur spielt da die Engine nicht mit...
eigentlich müsste es ja ganz einfach sein:
x-Achse ändern für hoch runter
y-Achse um das Flugzeug nach Links und Rechts zu drehen
z-Achse für eine Rolle
nur leider funktioniert dass nicht da die x und z Achse mal um 180° steigen und wieder sinken...
wahrscheinlich muss ich die Rotation mit einer Matrix oder so was berechnen nur leider habe ich keine Ahnung auf diesem Gebiet...

mein zweites Problem:
Ich möchte ein Mesh passend zu einem anderen Mesh hin/mitdrehen wie in diesem Code nur im 3-Dimensionalen z.B. um ein Objekt aus verschiedenen zusammenbauen zu können.
wahrscheinlich benötige ich dort auch Matrizen wie bei meiner ersten Frage

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenWindow(0,0,0,800,600,"test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)

player_x=400
player_y=300
player_ro=0

Macro GX(w)
  Cos((w-90)/180*#PI)
EndMacro
Macro GY(w)
  Sin((w-90)/180*#PI)
EndMacro

Repeat
  FlipBuffers()
  ClearScreen(0)
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_A)
    player_ro-5
    If player_ro<0:player_ro+360:EndIf
  EndIf
  If KeyboardPushed(#PB_Key_D)
    player_ro+5
    If player_ro>360:player_ro-360:EndIf
  EndIf
  
  If KeyboardPushed(#PB_Key_W)
    player_x+GX(player_ro)*3
    player_y+GY(player_ro)*3
  EndIf
  If KeyboardPushed(#PB_Key_S)
    player_x-GX(player_ro)*3
    player_y-GY(player_ro)*3
  EndIf
  
  
  If StartDrawing(ScreenOutput())
    
    ; player
    Circle(player_x, player_y, 10, #Red)
    
    ; in welche richtung man schaut
    bufx= GX(player_ro)*10
    bufy= GY(player_ro)*10
    Circle(player_x+bufx, player_y+bufy, 5, #Blue)
    
    ; linker arm
    bufx= GX(player_ro-90)*24
    bufy= GY(player_ro-90)*24
    Circle(player_x+bufx, player_y+bufy, 5, #Green)
    
    ; linker arm2
    bufx+GX(player_ro)*16
    bufy+GY(player_ro)*16
    Circle(player_x+bufx, player_y+bufy, 5, #Green)
    
    ; rechter arm
    bufx= GX(player_ro+90)*24
    bufy= GY(player_ro+90)*24
    Circle(player_x+bufx, player_y+bufy, 5, #Green)
    
    ; rechter arm2
    bufx+GX(player_ro)*16
    bufy+GY(player_ro)*16
    Circle(player_x+bufx, player_y+bufy, 5, #Green)
    
    
    DrawText(5, 5, "rotation: "+Str(player_ro))
    StopDrawing()
  EndIf
  
Until WindowEvent()=#PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)
End
möchte mich jetzt schon mal Bedanken

mfg
kevin
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 3D Rotation

Beitrag von STARGÅTE »

Wozu hast du diesen Code dazu gepostet, dort ist garkein 3D drin?

Zu deinen Fragen:
  1. Ich nehme mal an, dass du dich frei im Raum bewegen möchtest, dann solltest du RotateEntity() im Modus #PB_Relative verwenden, um immer auf die aktuelle Lage im Raum zu reagieren.
  2. Meshs werden nicht bewegt oder gedreht. Meshs sind "Vorlagen" für die Entitys und die kannst du dann bewegen.
    Um zwei Entity mit einander zu "verketten" kannst du ein Node erstellen CreateNode() und diesem dann beide Entitys zuweise.
    Danach brauchst du dann nur das Node bewegen/drehen und beide Entitys folgen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: 3D Rotation

Beitrag von Kevin »

Vielen Dank für die schnelle Antwort,
STARGÅTE hat geschrieben:Wozu hast du diesen Code dazu gepostet, dort ist garkein 3D drin?
das sollte nur ein Beispiel sein um zu zeigen was ich im 3-Dimensionalen haben möchte
STARGÅTE hat geschrieben:Ich nehme mal an, dass du dich frei im Raum bewegen möchtest, dann solltest du RotateEntity() im Modus #PB_Relative verwenden, um immer auf die aktuelle Lage im Raum zu reagieren.
Meshs werden nicht bewegt oder gedreht. Meshs sind "Vorlagen" für die Entitys und die kannst du dann bewegen.
Um zwei Entity mit einander zu "verketten" kannst du ein Node erstellen CreateNode() und diesem dann beide Entitys zuweise.
Danach brauchst du dann nur das Node bewegen/drehen und beide Entitys folgen.
Sorry hab es vergessen dazuzuschreiben dass es nicht um Ogre geht ist aber auch egal da ich keine Engine Funktionen haben möchte sondern einfach nur ein Beispiel oder eine Erklärung wie man das ohne Lösen kann.

mfg
kevin
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 3D Rotation

Beitrag von STARGÅTE »

Kevin hat geschrieben:[...] da ich keine Engine Funktionen haben möchte sondern einfach nur ein Beispiel oder eine Erklärung wie man das ohne Lösen kann.
Man kann es nicht ohne eine 3D-Engine lösen.
Entweder du nutzt eine vorhandene, oder du schreibst sie dir selber.
Da du aber wie oben erwähnt, keine Anhung von Matrizen usw. hast, fällt das schon mal weg.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: 3D Rotation

Beitrag von Kevin »

STARGÅTE hat geschrieben:
Kevin hat geschrieben:[...] da ich keine Engine Funktionen haben möchte sondern einfach nur ein Beispiel oder eine Erklärung wie man das ohne Lösen kann.
Man kann es nicht ohne eine 3D-Engine lösen.
Entweder du nutzt eine vorhandene, oder du schreibst sie dir selber.
Da du aber wie oben erwähnt, keine Anhung von Matrizen usw. hast, fällt das schon mal weg.
Ok dann schau ich mir mal ein paar Matrizen-Tutorials an...

Für mich wäre dass wichtig da man es überall braucht... z.B. man möchte die Kamera über dem Entity positionieren Pseudocode:

Code: Alles auswählen

GetEntityPosition(Entity,@pos.vec3)
SetCameraPosition(Cam,pos\x,pos\y+5,pos\z)
bei diesem Code ist die Kamera nur über dem Entity wenn nur die y-Achse gedreht wurde da bei pos\y+5 die Rotation vom Entity nicht beachtet wird... und ein Node über dem Entity zu setzen und mit im zu verknüpfen um dann die Kamera auf die Position dieses Nodes zu setzen ist umständlich...

mfg
kevin
Antworten