RotateCamera - lokal relativ drehen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

RotateCamera - lokal relativ drehen

Beitrag von STARGÅTE »

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!
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
Benutzeravatar
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

Beitrag von NicTheQuick »

Da musst du wohl die absolute Version von RotateCamera() nehmen und deine Drehung selbst berechnen. Du kennst dich doch mit Matrizenberechnung aus, oder?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: RotateCamera - lokal relativ drehen

Beitrag von STARGÅTE »

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?
Jo klar, aber ich kann RotateCamera() keine Matrix übergeben ...
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
Benutzeravatar
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

Beitrag von kapege »

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
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: RotateCamera - lokal relativ drehen

Beitrag von Derren »

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...
Signatur und so
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: RotateCamera - lokal relativ drehen

Beitrag von STARGÅTE »

@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:

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
Drehe ich die Camera relativ erhalte ich nicht das gewünschte Ergebnis.
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
Antworten