Vol libre dans un champ d'étoiles

Généralités sur la programmation 3D
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Vol libre dans un champ d'étoiles

Message par Ollivier »

Bon, pour l'instant je n'ai pas plus d'info sur la nouvelle manière dont les Dim se comportent donc j'adopte, au moins temporairement la méthode de Comtois, mais je ne la comprends pas très bien car le redimensionnement devient alors chose impossible.

Sinon dans le code du post 1 de ce sujet, vue que la perspective se trouve en une seule ligne (Ligne n° 76), et que je persiste à dire qu'il y a une multitude de méthodes de perspectives puisque, je me cite, la perspective est une illusion, ben j'en mets une autre au pif: la perspective Oeil du Judas par exemple. Comme ça, dans Colle Off d'outil, le soldat peut anticiper un tir à travers une porte de HLM. M'enfin moi, la guerre, ce n'est pas mon trip...

J'ai rajouté aussi le réglage du zoom (2 lignes de +) avec les touches O et P pour bien faire voir le truc. Sinon, n'oubliez pas: il y a TROIS rotations! Comme le titre l'indique, c'est un vol vraiment libre, qui ne rame pas, et qui ne plante pas avec une IMA par ci ou par là...

Vous pouvez comparer par rapport au premier code: pas vraiment de modification. Donc pas vraiment beaucoup de boulot de fait, je suis désolé, voilà.

Et... Viva el PorBAJICOS compilatores !

Code : Tout sélectionner

DisableDebugger
#N = 3999
Global.F Dim X(#N), Dim Y(#N), Dim Z(#N), Dim S(#N), H, R, A
Macro Ro(CoA, CoB, CoC) ; Macro d'une procédure de rotation
Procedure R#CoA(i, Angle.F)
    Protected.F X, Y, Z
    X = X(i)
    Y = Y(i)
    Z = Z(i)
    H = CoA
    R = Sqr((CoB * CoB) + (CoC * CoC) )
    A = ACos(CoC / R): If CoB < 0.0: A = 0.0 - A: EndIf
    CoA#(i) = H
    CoB#(i) = Sin(A + Angle) * R
    CoC#(i) = Cos(A + Angle) * R
EndProcedure
EndMacro
Ro(x,y,z):Ro(y,z,x):Ro(z,x,y) ;3 procs pour les 3 rotations X, Y et Z
    InitSprite()
    InitSprite3D()
    InitKeyboard()
    InitMouse()
    ExamineDesktops()
    Dw = DesktopWidth(0)
    Dh = DesktopHeight(0)
    Dd = DesktopDepth(0)
    Dhw = Dw / 2: Dhh = Dh / 2
    OpenScreen(Dw, Dh, Dd, "")
    KeyboardMode(#PB_Keyboard_International)
    For I = 0 To #N
        S(I) = 0  
        X(I) = Random(1000000) / 10.0 - 50000.0
        Y(I) = Random(1000000) / 10.0 - 50000.0
        Z(I) = Random(1000000) / 10.0 - 50000.0
    Next I
    Zoom.F = 1.0
    Size = 512
    CreateImage(0, Size, Size, 32)
    StartDrawing(ImageOutput(0) )
        For I = 0 To (Size / 2)
            G = I * 511 / Size
            Circle(Size / 2, Size / 2, (Size - (I * 2) ) / 2, RGBA(G, G, G, 255) )
        Next I
    StopDrawing()
    CreateSprite(0, Size, Size, #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
    StartDrawing(SpriteOutput(0) )
        DrawAlphaImage(ImageID(0), 0, 0)
        DrawingMode(#PB_2DDrawing_AlphaChannel)
        DrawAlphaImage(ImageID(0), 0, 0)
    StopDrawing()
    CreateSprite3D(0, 0)
    PitchCamera.F = 0.0: PitchCameraAccel.F = 0.001
    TurnCamera.F = 0.0: TurnCameraAccel.F = 0.001
    RollCamera.F = 0.0: RollCameraAccel.F = 0.001
    CameraSpeed.F = 0.0: Size2 = Size / 2
    Repeat
        Delay(1)
        ExamineKeyboard()
        ExamineMouse()
        ClearScreen(RGBA(0, 0, 0, 0) )
        Start3D()
        Sprite3DBlendingMode(5, 7)
        If KeyboardPushed(#PB_Key_Left): RollCamera - RollCameraAccel: EndIf
        If KeyboardPushed(#PB_Key_Right): RollCamera + RollCameraAccel: EndIf
        If KeyboardPushed(#PB_Key_Down): PitchCamera + PitchCameraAccel: EndIf
        If KeyboardPushed(#PB_Key_Up): PitchCamera - PitchCameraAccel: EndIf
        If KeyboardPushed(#PB_Key_Tab): TurnCamera + TurnCameraAccel: EndIf
        If KeyboardPushed(#PB_Key_A): TurnCamera - TurnCameraAccel: EndIf
        If KeyboardPushed(#PB_Key_Back): CameraSpeed / 1.1: EndIf
        If KeyboardPushed(#PB_Key_Return): CameraSpeed + 10.0: EndIf
        If KeyboardPushed(#PB_Key_O): Zoom * 1.01: EndIf
        If KeyboardPushed(#PB_Key_P): Zoom / 1.01: EndIf
        For I = 0 To #N
            Z(I) - CameraSpeed: If Z(I) < - 50000.0: Z(I) + 100000.0: EndIf
            Rx(I, PitchCamera)
            Ry(I, TurnCamera)
            Rz(I, RollCamera)
            If Z(i) > 0.0
                Coef.F = 400.0 / Sqr(X(i) * X(i) + Y(i) * Y(i) + Z(i) * Z(i) ) * Zoom
                DisplaySprite3D(S(i), 0, 0)
                sx1 = Dhw + (X(i) - Size2) * Coef
                sy1 = Dhh + (Y(i) - Size2) * Coef
                sx2 = Dhw + (X(i) + Size2) * Coef
                sy2 = Dhh + (Y(i) - Size2) * Coef
                sx3 = Dhw + (X(i) + Size2) * Coef
                sy3 = Dhh + (Y(i) + Size2) * Coef
                sx4 = Dhw + (X(i) - Size2) * Coef
                sy4 = Dhh + (Y(i) + Size2) * Coef
                sz.F = Coef * 100
                TransformSprite3D(S(I), sx1, sy1, sz, sx2, sy2, sz, sx3, sy3, sz, sx4, sy4, sz)
            EndIf
        Next I
        PitchCamera * 0.99
        TurnCamera * 0.99
        RollCamera * 0.99
        CameraSpeed * 0.999
        Stop3D()
        FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)
    CloseScreen()
    End
Avatar de l’utilisateur
venom
Messages : 3136
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Vol libre dans un champ d'étoiles

Message par venom »

Sympa ce code Ollivier,

j'aime bien bravo.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Vol libre dans un champ d'étoiles

Message par G-Rom »

qui ne rame pas, et qui ne plante pas avec une IMA par ci ou par là...
Excuse moi d'être mauvais...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Vol libre dans un champ d'étoiles

Message par Ollivier »

G-Rom a écrit :Excuse moi
Je me permets d'enlever le superflu et j'accepte tes excuses.

Pour moi, je considère que tu n'avais pas à payer quoique ce soit pour t'épargner de me présenter simplement tes excuses. Pour les miens qui sont extrêmement nombreux, présenter ses excuses n'a pas de prix. C'est-à-dire que présenter ses excuses vaut tout l'or du Monde, le même or que la France a payé à des entreprises d'armement outre-atlantique pour que le débarquement puisse avoir lieu quelques mois plus tard. En effet, quand on respecte ce qui n'a pas de prix, l'argent se met soudain à avoir une odeur. On refuse alors une vente au plus offrant par exemple, même si c'est bien plus que celui à qui l'on décide de vendre son bien.

Si des sujets sur ce forum semblent altérer l'image que tu souhaites véhiculer, des sujets dont j'en suis l'auteur, ce texte y compris, je coopérerai pour bien les nettoyer à ta guise. Car, évidemment cette coopération, elle non plus n'a pas de prix.

Comme je l'ai écrit il y a déjà plus d'un an ici,
« Qui que tu sois, tu as mon respect. Point! Et Cette notion est carré! Après, si à n'importe quelle échelle de temps, de lieu ou d'importance, tu ne fais pas idem, je n'y pourrai rien. »
Répondre