CameraFollow() und die Drehung um die x-Achse

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Darth Thopur
Beiträge: 4
Registriert: 20.04.2021 10:51

CameraFollow() und die Drehung um die x-Achse

Beitrag von Darth Thopur »

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
:coderselixir: Ein Coder ist ein Werkzeug, dass Kaffee trinkt und Code pinkelt. :coderselixir:
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: CameraFollow() und die Drehung um die x-Achse

Beitrag von Benubi »

Hi,

da müßtest Du schon etwas Code posten, damit man schauen kann woran das liegen könnte.
Benutzeravatar
Darth Thopur
Beiträge: 4
Registriert: 20.04.2021 10:51

Re: CameraFollow() und die Drehung um die x-Achse

Beitrag von Darth Thopur »

Hallo,

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
Ich hoffe, ihr erkennt, was ich meine und könnt helfen.

Grüße aus Berlin sendet Darth
:coderselixir: Ein Coder ist ein Werkzeug, dass Kaffee trinkt und Code pinkelt. :coderselixir:
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: CameraFollow() und die Drehung um die x-Achse

Beitrag von Benubi »

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).
Antworten