Tachchen,
wollte fragen, ob jemand weiß, wie ich die Camera im lokalen (also gedrehten) Koordinatensystem relativ drehen lassen kann?
Mit RotateCamera(..., #PB_Relative) kann ich zwar relativ drehen, jedoch immer nur auf Basis des Weltkoordinatensystems.
Wenn ich zB Z änder, bewege ich mich bei einer Änderung in Y immer noch in der selben Ebene der Welt!
RotateCamera - lokal relativ drehen
RotateCamera - lokal relativ drehen
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: RotateCamera - lokal relativ drehen
Da musst du wohl die absolute Version von RotateCamera() nehmen und deine Drehung selbst berechnen. Du kennst dich doch mit Matrizenberechnung aus, oder?
Re: RotateCamera - lokal relativ drehen
Jo klar, aber ich kann RotateCamera() keine Matrix übergeben ...NicTheQuick hat geschrieben:Da musst du wohl die absolute Version von RotateCamera() nehmen und deine Drehung selbst berechnen. Du kennst dich doch mit Matrizenberechnung aus, oder?
Ich hatte auch schon einen Einheitsvektor mit meiner RotationsMatrix gedreht und an CameraLookAt() übergeben, nur habe ich dabei kein Roll dabei.
Desweiteren bin ich sehr verwirrt wieso das Koordinatensystem in OpenGL total "verdreht" ist.
In der mathematik ist X nach vorn, Y nach rechts und Z nach oben.
In OpenGL: X nach rechts, Y nach oben und Z nach hinten.
Es ist also nicht nur gedreht, sondern die Z-Achse zeigt in die falsche Richtung.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- kapege
- Beiträge: 39
- Registriert: 28.12.2004 17:35
- Computerausstattung: AMD Ryzen 7 3700X 8-Core Processor 3.60 GHz
Windows 10 Pro 64bit
14 GB Ram
PureBasic 6.00 LTS (Windows - x64) - Wohnort: Trostberg
Re: RotateCamera - lokal relativ drehen
Hallo Stargate,
in Photoshop, Cinema 4D etc. ist es wie in OpenGL:
+x = rechts, -x = links, +y = oben, -y = unten, +z = hinten, -z = vorne
lg Peter
in Photoshop, Cinema 4D etc. ist es wie in OpenGL:
+x = rechts, -x = links, +y = oben, -y = unten, +z = hinten, -z = vorne
lg Peter
Re: RotateCamera - lokal relativ drehen
13 Jahre Schulmathematik und immer haben wir die "falschen" Achsenbezeichnungen benutzt.
X ist doch die "erste" Dimension. Y die zweite. X und Y spannen einen zweidimensionalen Raum auf. Wie ein Blatt Papier, z.B. Oder einen Bildschirm.
Bei Gadgets und Sprites gibst du ja auch X und Y an und nicht Y und Z.
Und es heißt Z-Order und nicht X-Order, wenn es darum geht welches Sprite vorne angezeigt wird.
Z ist für die dritte Dimension, die ja auf dem Papier oder Bildschirm nicht wirklich existiert. Warum sollte man die gewohnten Achsenbezeichnungen auf einmal ändern...
X ist doch die "erste" Dimension. Y die zweite. X und Y spannen einen zweidimensionalen Raum auf. Wie ein Blatt Papier, z.B. Oder einen Bildschirm.
Bei Gadgets und Sprites gibst du ja auch X und Y an und nicht Y und Z.
Und es heißt Z-Order und nicht X-Order, wenn es darum geht welches Sprite vorne angezeigt wird.
Z ist für die dritte Dimension, die ja auf dem Papier oder Bildschirm nicht wirklich existiert. Warum sollte man die gewohnten Achsenbezeichnungen auf einmal ändern...
Signatur und so
Re: RotateCamera - lokal relativ drehen
@Derren:
Jo, aber das ich eine andere Situation. Der Bildschirm hat ja wirklich eine Aufspannung von X und Y und Z geht in die Tiefe.
Wenn ich mich aber in einer 3D-Welt bewege, dann mach ich das auf einem gedachten Boden, der meiner Meinung nach die X-Y-Ebene repräsentiert, und Z die Höhenangabe ist.
@Thema:
Habe nun einen Weg gefunden, wie ich die Camera in ihrem lokalen System drehen lassen kann:
Ich Stelle die Camera in ein Node und drehe das Node.
Komischerweise funktioniert das relative drehen von Nodes wirklich in ihrem lokalen Koordinaten System.
Wer es gerne selber sehen will, hier mal der Code:
Drehe ich die Camera relativ erhalte ich nicht das gewünschte Ergebnis.
Nutze ich stattdresse das Node, funktioniert es.
Jo, aber das ich eine andere Situation. Der Bildschirm hat ja wirklich eine Aufspannung von X und Y und Z geht in die Tiefe.
Wenn ich mich aber in einer 3D-Welt bewege, dann mach ich das auf einem gedachten Boden, der meiner Meinung nach die X-Y-Ebene repräsentiert, und Z die Höhenangabe ist.
@Thema:
Habe nun einen Weg gefunden, wie ich die Camera in ihrem lokalen System drehen lassen kann:
Ich Stelle die Camera in ein Node und drehe das Node.
Komischerweise funktioniert das relative drehen von Nodes wirklich in ihrem lokalen Koordinaten System.
Wer es gerne selber sehen will, hier mal der Code:
Code: Alles auswählen
InitEngine3D()
InitSprite()
InitMouse()
Enumeration
#Window
#Camera
#Texture
#Material
#BillboardGroup
#Node
EndEnumeration
OpenWindow(#Window, 0, 0, 800, 600, "Demo", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window), 1, 0, 0)
CreateTexture(#Texture, 1, 1)
StartDrawing(TextureOutput(#Texture))
Plot(0, 0, $FFFFFF)
StopDrawing()
CreateMaterial(#Material, TextureID(#Texture))
CreateBillboardGroup(#BillboardGroup, MaterialID(#Material), 1, 1)
For N = 1 To 10000
AddBillboard(#PB_Any, #BillboardGroup, Random(400)-200, Random(400)-200, Random(400)-200)
Next
CreateCamera(#Camera, 0, 0, 100, 100)
CreateNode(#Node)
AttachNodeObject(#Node, CameraID(#Camera), #PB_Node_Camera)
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #Null
Break
EndSelect
ForEver
ExamineMouse()
Yaw.f = MouseDeltaX()/10
Pitch.f = MouseDeltaY()/10
Roll.f = MouseWheel()*10
CompilerIf 0
RotateNode(#Node, -Pitch, -Yaw, -Roll, #PB_Relative)
CompilerElse
RotateCamera(#Camera, -Pitch, -Yaw, -Roll, #PB_Relative)
CompilerEndIf
RenderWorld()
FlipBuffers()
ForEver
Nutze ich stattdresse das Node, funktioniert es.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr