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