Hallo ihr Lieben,
inspiriert von tft's EliteClone Serie auf YouTube wollte ich mal selber was in 3D machen. Hab also ein kleines Raumschiff ins Weltall gesetzt, habe es fliegen lassen und mit CameraFollow() verfolgt. So weit, so gut, aber nur wenn ich mich um die Y-Achse drehe. Drehe ich das Schiff um die x-Achse will die Camera nicht mehr folgen. Kann ich da was tun oder gibt es eine andere Lösung für mein Problem?
Vielen Dank für eure Hilfe im Voraus.
Grüße aus Berlin sendet Darth
CameraFollow() und die Drehung um die x-Achse
- Darth Thopur
- Beiträge: 4
- Registriert: 20.04.2021 10:51
CameraFollow() und die Drehung um die x-Achse
Ein Coder ist ein Werkzeug, dass Kaffee trinkt und Code pinkelt.
Re: CameraFollow() und die Drehung um die x-Achse
Hi,
da müßtest Du schon etwas Code posten, damit man schauen kann woran das liegen könnte.
da müßtest Du schon etwas Code posten, damit man schauen kann woran das liegen könnte.
- Darth Thopur
- Beiträge: 4
- Registriert: 20.04.2021 10:51
Re: CameraFollow() und die Drehung um die x-Achse
Hallo,
da hast du recht, Benubi. So wird das Problem für alle transparenter. Hier nun mein Beispielcode:
Ich hoffe, ihr erkennt, was ich meine und könnt helfen.
Grüße aus Berlin sendet Darth
da hast du recht, Benubi. So wird das Problem für alle transparenter. Hier nun mein Beispielcode:
Code: Alles auswählen
; PB 6.02
; mit NumPad 8 wird beschleunigt
; mit A und D wird nach links bzw. rechts navigiert
; mit W uns S nach oben und unten
; bei A und D reagiert CameraFollow wie es sein soll und verfolgt smooth das Entity
; und nun zum Problem:
; bei W und S blickt die Camera weiterhin auf das Entity, bleibt allerdings stehen,
; so das sich das Entity smooth von der Camera entfernt
EnableExplicit
Enumeration Window
#GameWin
EndEnumeration
Structure structLight
iPointLight.i
EndStructure
Structure structCamera
iMainCam.i
EndStructure
Declare CleanUpAndEnd()
Define iFlags.i = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
Define stPointLight.structLight, stCamera.structCamera
Define iCapsuleMesh.i, iCapsuleEntity.i, iPlanetSphereMesh.i
Procedure CleanUpAndEnd()
CloseWindow( EventWindow() )
End
EndProcedure
If InitEngine3D() = #False
MessageRequester( "Fehler", "InitEngine3D() fehlgeschlagen !!!" )
ElseIf InitSprite() = #False
MessageRequester( "Fehler", "InitSprite() fehlgeschlagen !!!" )
ElseIf InitKeyboard() = #False
MessageRequester( "Fehler", "InitKeyboard() fehlgeschlagen !!!" )
ElseIf InitMouse() = #False
MessageRequester( "Fehler", "InitMouse() fehlgeschlagen !!!" )
ElseIf InitSound() = #False
MessageRequester( "Fehler", "InitSound() fehlgeschlagen !!!" )
EndIf
UsePNGImageDecoder()
UseOGGSoundDecoder()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/skybox.zip", #PB_3DArchive_Zip)
If OpenWindow( #GameWin, 0, 0, 1620, 920, "3D-Stuff", iFlags )
AntialiasingMode( #PB_AntialiasingMode_x6 )
If OpenWindowedScreen( WindowID( #GameWin ), 10, 10, WindowWidth( #GameWin ) -20, WindowHeight( #GameWin ) - 20 )
SetFrameRate( 60 )
stPointLight\iPointLight = CreateLight( #PB_Any, RGB( 25, 25, 180 ), -5, 10, 5, #PB_Light_Point )
stCamera\iMainCam = CreateCamera( #PB_Any, 0, 0, 100, 100 )
CameraFOV( stCamera\iMainCam, 60 )
CameraRange( stCamera\iMainCam, 0.1, 10000 )
iCapsuleMesh = CreateCapsule( #PB_Any, 0.5, 2, 64, 64, 64 )
TransformMesh( iCapsuleMesh, 0, 0, 0, 1, 1, 1, -90, 0, 0 )
iCapsuleEntity = CreateEntity( #PB_Any, MeshID( iCapsuleMesh ), #PB_Material_None )
Dim PlanetSphereMeshArray.i(999)
Define a.i
For a = 0 To 999
iPlanetSphereMesh = CreateSphere( #PB_Any, Random( 10, 1 ), 64, 64 )
PlanetSphereMeshArray( a ) = iPlanetSphereMesh
Next
Dim PlanetSphereEntityArray.i(999)
For a = 0 To 999
PlanetSphereEntityArray( a) = CreateEntity( #PB_Any, MeshID( PlanetSphereMeshArray( a ) ), #PB_Material_None, 5000 - Random(10000, 0), 5000 - Random(10000, 0), 5000 - Random(10000, 0) )
Next
FreeArray( PlanetSphereMeshArray() )
FreeArray( PlanetSphereEntityArray() )
SkyBox("stevecube.jpg")
Repeat
Repeat
Define iWindowEvent.i = WindowEvent()
Select iWindowEvent
Case #PB_Event_CloseWindow
CleanUpAndEnd()
EndSelect
Until iWindowEvent = 0
If ExamineKeyboard()
If KeyboardPushed( #PB_Key_Escape )
CleanUpAndEnd()
EndIf
If KeyboardPushed( #PB_Key_Pad8 )
MoveEntity( iCapsuleEntity, 0, 0, -1.5, #PB_Local )
EndIf
If KeyboardPushed( #PB_Key_A )
RotateEntity( iCapsuleEntity, 0, 0.5, 0, #PB_Relative )
EndIf
If KeyboardPushed( #PB_Key_D )
RotateEntity( iCapsuleEntity, 0, -0.5, 0, #PB_Relative )
EndIf
If KeyboardPushed( #PB_Key_W )
RotateEntity( iCapsuleEntity, 0.5, 0, 0, #PB_Relative )
EndIf
If KeyboardPushed( #PB_Key_S )
RotateEntity( iCapsuleEntity, -0.5, 0, 0, #PB_Relative )
EndIf
CameraFollow( stCamera\iMainCam, EntityID( iCapsuleEntity ), 0, 3, 5, 0.1, 0.25, #True )
EndIf
RenderWorld()
FlipBuffers()
ForEver
EndIf
EndIf
Grüße aus Berlin sendet Darth
Ein Coder ist ein Werkzeug, dass Kaffee trinkt und Code pinkelt.
Re: CameraFollow() und die Drehung um die x-Achse
Möchtest Du möglicherweise dass die Kamera hinter dem Schiff bleibt, also um das Schiff rotiert? Es gibt auch Schwellwerte die eine Rolle spielen könnten, wann die Kamera erst folgen soll.
Ich glaube daß CameraFollow mehr für Flächen gedacht ist, also wenn Du auf einem Terrain läufst bzw. auf der horizontalen Ebene. Für "Purzelbäume" im Weltraum nicht so geeignet, weil die Kamera immer die Füße auf dem Boden "haben will".
Ob sich die Distanz ändert kann ich nicht feststellen, vielleicht sollte man das messen und anzeigen. Es gibt Sprünge wenn sich die Pille dreht (W und S).
Ich glaube man könnte eine eigene Funktion schreiben, so daß die Kamera sich immer wieder hinter das Schiff schiebt und korrekt mit-dreht, hierfür müsste man die Lokalkordinaten vom Entity benutzen (Punkt lokal hinter das Entity setzen in absolute Koordinaten umrechnen und die Kamera diesem Punkt nähern und rotieren).
Ich glaube daß CameraFollow mehr für Flächen gedacht ist, also wenn Du auf einem Terrain läufst bzw. auf der horizontalen Ebene. Für "Purzelbäume" im Weltraum nicht so geeignet, weil die Kamera immer die Füße auf dem Boden "haben will".
Ob sich die Distanz ändert kann ich nicht feststellen, vielleicht sollte man das messen und anzeigen. Es gibt Sprünge wenn sich die Pille dreht (W und S).
Ich glaube man könnte eine eigene Funktion schreiben, so daß die Kamera sich immer wieder hinter das Schiff schiebt und korrekt mit-dreht, hierfür müsste man die Lokalkordinaten vom Entity benutzen (Punkt lokal hinter das Entity setzen in absolute Koordinaten umrechnen und die Kamera diesem Punkt nähern und rotieren).