Seite 1 von 1

RotateCamera - lokal relativ drehen

Verfasst: 28.08.2012 03:50
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!

Re: RotateCamera - lokal relativ drehen

Verfasst: 28.08.2012 17:54
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?

Re: RotateCamera - lokal relativ drehen

Verfasst: 28.08.2012 18:03
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.

Re: RotateCamera - lokal relativ drehen

Verfasst: 28.08.2012 18:12
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

Re: RotateCamera - lokal relativ drehen

Verfasst: 29.08.2012 01:56
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...

Re: RotateCamera - lokal relativ drehen

Verfasst: 29.08.2012 03:09
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.