Un peu de légèreté...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Un peu de légèreté...

Message par Ollivier »

Bon... Voilà... Les touches dispo sont les 4 flèches, la touche Tab, la touche A, [Entrée] et [Backspace]. 8 touches et bonne promenade!

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
        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)
            Coef.F = 400.0 / Z(i) * Zoom
            If Z(i) > 0.0
                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
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Un peu de légèreté...

Message par flaith »

...et de beauté, avec la poussière sur mon écran j'ai l'impression d'avoir la voie lactée :)
Très sympa
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Un peu de légèreté...

Message par djes »

Ah, c'est mieux sous cette forme! ;)
Il est vraiment splendide ce champ d'étoiles, et très beau code! Rah quel flagorneur, mais c'est vrai, j'aime beaucoup!
Anonyme

Re: Un peu de légèreté...

Message par Anonyme »

Sympa , par contre, il y a une erreur de perspective ( tourne a fond dans l'axe des z , tu voit le point de fuite en haut de l'écran , en 3D le point de fuite est au milieu du champs de vision , donc l'écran ;) )

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
			  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)
						Coef.F = 400.0 / Z(i) * Zoom
						If Z(i) > 0.0
                                                                DisplaySprite3D(S(i), 0, 0)
								sx1 = Dhw + (X(i) - Size2) * Coef
								sy1 = Dhh + (Y(i) - Size2) * Coef - (Dh/2)
								sx2 = Dhw + (X(i) + Size2) * Coef
								sy2 = Dhh + (Y(i) - Size2) * Coef - (Dh/2)
								sx3 = Dhw + (X(i) + Size2) * Coef
								sy3 = Dhh + (Y(i) + Size2) * Coef - (Dh/2)
								sx4 = Dhw + (X(i) - Size2) * Coef
								sy4 = Dhh + (Y(i) + Size2) * Coef - (Dh/2)
								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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Un peu de légèreté...

Message par Ollivier »

Ah oui oui oui, il y a un problème de perspective, ça c'est sûr!
Moi, je mise sur un joueur ivrogne et polluard. Donc, ben évidemment la perspective prend une baffe, cela va de soi...

Je dirais que le joueur se fait plèz. Il a trouvé un lieu virtuel où il peut conduire librement, d'une sobriété malencontreusement limitée, et surtout... A donf, sans radar ni alcootext!

Code : Tout sélectionner

DisableDebugger
N = 3999
Global.F Dim X(N), Dim Y(N), Dim Z(N), Dim S(N), Dim R(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
        R(I) = 1.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)
            If CameraSpeed < 1000.0
               CameraSpeed + 1.0
            EndIf
        EndIf    
        If CameraSpeed > 1.0
            If Random(1)
               AAA.F + 0.05
               no = Random(N)
               x(no) = Cos(AAA) * 2000
               y(no) = Sin(AAA) * 2000
               z(no) = 0.0
               no = Random(N)
               x(no) = Cos(AAA + 2*#PI/3) * 2000
               y(no) = Sin(AAA + 2*#PI/3) * 2000
               z(no) = 0.0
               no = Random(N)
               x(no) = Cos(AAA - 2*#PI/3) * 2000
               y(no) = Sin(AAA - 2*#PI/3) * 2000
               z(no) = 0.0
            EndIf
        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 CameraSpeed = 0
               Zoom = 1.0
            Else
               Zoom = 1000.0 / (1000.0 + CameraSpeed * 10)
            EndIf
            Coef.F = 400.0 / Z(i) * Zoom
            If Z(i) > 0.0
                DisplaySprite3D(S(i), 0, 0)
                sx1 = Dhw + (X(i) - Size2) * Coef * R(I)
                sy1 = Dhh + (Y(i) - Size2) * Coef * R(I)
                sx2 = Dhw + (X(i) + Size2) * Coef * R(I)
                sy2 = Dhh + (Y(i) - Size2) * Coef * R(I)
                sx3 = Dhw + (X(i) + Size2) * Coef * R(I)
                sy3 = Dhh + (Y(i) + Size2) * Coef * R(I)
                sx4 = Dhw + (X(i) - Size2) * Coef * R(I)
                sy4 = Dhh + (Y(i) + Size2) * Coef * R(I)
                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.9999
        Stop3D()
        FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)
    CloseScreen()
    End
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Un peu de légèreté...

Message par Ollivier »

D'autres erreurs?
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Un peu de légèreté...

Message par venom »

sa dechire. le rendu est sympa ont pourrais s'en servir comme "visualisateur" pour un player audio avec des chemin prédéfini.
si non chez moi niquel





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
mdsv41
Messages : 25
Inscription : mar. 08/sept./2009 15:49

Re: Un peu de légèreté...

Message par mdsv41 »

Bonsoir,

Chez moi, quand je fais un copier coller du cope dans PureBasic 4.31, il plante à la ligne 3

[22:25:31][COMPILER] Line 3: Syntax error.

Mais avec la 4.40Beta5 pas de problème

@+
mdsv41
Grand débutant en PureBasic 4.41
Linux Mint 9 - Mandriva powerpack 2010.0
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Un peu de légèreté...

Message par Ar-S »

C'est normal, protected.f, global.f rgba().. sont utilisables uniquement en 4.40..

En tout cas c'est très joli ollivier. bravo
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Un peu de légèreté...

Message par Ollivier »

Je tiens à vous remercier pour vos avis encourageants, que ce soit Flaith (très imaginatif, bonjour au passage, car on cause rarement), Djes (désolé pour le Purepunch...), Cpl.Bator, Venom, Mdsv(les délais ne sont pas retardés) et Ar-S.

@Cpl.Bator

En étant sérieux deux minutes, tu as entièrement raison: la perspective est archi-non réaliste. Mais ce que je souhaite c'est partager mon point de vue 3D. Et même si je semble m'étioler sur des jolies âneries, je suis un protocole strict d'explicatifs.

Si on apprends dans le désordre, on oublie facilement ou c'est agaçant, etc... Là, le 1er code évoque les 3 rotations orthonormales dans l'espace. C'est court et les calculs maths sont directs. Ensuite, une fois que les 3 rotations Oxyz sont comprises avec des calculs "humains" (la macro Ro() ), on peut passer à l'utilisation des "matrices spatiales" et puis au changement de référentiel. Je n'ai pas encore le code correct aussi impeccable que le premier, mais j'ai son tutoriel inachevé. Comme je vais lâcher un peu le language quelques jours, je poste de suite ce code-tuto, même s'il est à l'arrache et qu'il "casse" un peu le côté ludique du sujet.

Toutes les commandes de rotations (les 6 touches tab+A+4flèches) restent exactement les mêmes. Il n'y a plus de vitesse. Il n'y a que le changement d'échelle de référence [Entrée] et [Backspace]. En rouge, c'est tout ce qui se rapporte au décor (comme les étoiles, etc...) et en bleu, c'est tout ce qui se rapport à la caméra (qui symbolise n'importe quel objet 3D à venir).

La routine importante c'est la procédure Tr() qui décompose de manière ordonnée le mélange de 3 angles (d'où la possibilité ensuite de gérer correctement la perspective avec cette routine).

Vous noterez que l'objet bleu (considérée comme étant la caméra) ne subit ainsi aucun blocage de cardan.

Code : Tout sélectionner

;{ /!\ }

    ;{ Directives du compilateur }
DisableDebugger
    ;}
    ;{ Structures }

        ;{ Ecran }
Structure DeskInfo
    Width.I
    Height.I
    Depth.I
EndStructure
        ;}
        ;{ 3D }
Structure V3
    X.F
    Y.F
    Z.F
EndStructure

Structure RefInfo
    O.V3
    X.V3
    Y.V3
    Z.V3    
EndStructure
        ;}

    ;}
    ;{ Variables globales }
Global Desk.DeskInfo
    ;}
    ;{ Procédures }
Procedure InitScreen()
    InitSprite()
    InitSprite3D()
    InitKeyboard()
    InitMouse()
    ExamineDesktops()
    Desk\Width = DesktopWidth(0)
    Desk\Height = DesktopHeight(0)
    Desk\Depth = DesktopDepth(0)
    OpenScreen(Desk\Width, Desk\Height, Desk\Depth, "")
EndProcedure

Procedure.F Dist(X.F, Y.F, Z.F = 0.0)
    Protected Result.F
        Result = Sqr(X * X + Y * Y + Z * Z)
    ProcedureReturn Result
EndProcedure

Procedure Poke(*Adr, Length.I, Char.I)
    Protected I.I
    For I = 0 To Length - 1
        PokeB(*Adr + I, Char)
    Next
EndProcedure
    ;}
    ;{ Reste-à-choux }

Structure AB
    A.I
    B.I
EndStructure

Structure Zone
    Dep.I
    Fin.I
EndStructure

Nb = 4999
Global Option.I
Global Dim V.V3(Nb)
Global.F H, R, A
Global Dim Fil.AB(99)
Global Dim Corps.Zone(9)

Macro Local(Co)
    Co = Co#(i)
EndMacro
Macro Ro(CoA, CoB, CoC): Procedure R#CoA(i, Angle.F)
        Protected.F X, Y, Z
        X = V(i)\X
        Y = V(i)\Y
        Z = V(i)\Z
        H = CoA
        R = Sqr((CoB * CoB) + (CoC * CoC) )
        If R > 0.0
            A = ACos(CoC / R): If CoB < 0.0: A = 0.0 - A: EndIf
        Else
            A = 0.0
        EndIf
        V(i)\CoA = H
        V(i)\CoB = Sin(A + Angle) * R
        V(i)\CoC = Cos(A + Angle) * R
EndProcedure: EndMacro
Macro For2Nb(SubMacro)
    For I = 0 To Nb
        SubMacro
    Next
EndMacro
    Ro(x,y,z):Ro(y,z,x):Ro(z,x,y)

Procedure RefReset(*Adr)
    Poke(*Adr, 48, 0)
    PokeF(*Adr + 12, 1.0)
    PokeF(*Adr + 28, 1.0)
    PokeF(*Adr + 44, 1.0)
EndProcedure

Procedure Tr(AA, B)
    ;Protected.F X, Y, Z
    Protected Sauvegarde.RefInfo
    RefReset(@V(B)\X)
    CopyMemory(@V(AA)\X, @Sauvegarde, SizeOf(RefInfo) )
    ; On couche l'axe X sur le plan XZ par rotation sur l'axe Z
    AngleZ.F = ACos(V(AA + 1)\X / Dist(V(AA + 1)\X, V(AA + 1)\Y) )
    If V(AA + 1)\Y < 0.0
        AngleZ = 0.0 - AngleZ
    EndIf    
    For I = 0 To 7
        Rz(I, AngleZ)
    Next I
    ; On couche l'axe X sur le plan YZ par rotation sur l'axe Y
    AngleY.F = ACos(V(AA + 1)\X / Dist(V(AA + 1)\X, V(AA + 1)\Z) )
    If V(AA + 1)\Z > 0.0
        AngleY = 0.0 - AngleY
    EndIf    
    For I = 0 To 7
        Ry(I, AngleY)
    Next I
    ; On couche l'axe Y sur le plan XY par rotation sur l'axe X
    AngleX.F = ACos(V(AA + 2)\Z / Dist(V(AA + 2)\Y, V(AA + 2)\Z) )
    If V(AA + 2)\Y < 0.0
        AngleX = 0.0 - AngleX
    EndIf    
    AngleX = #PI / 2.0 - AngleX
    For I = 0 To 7
        Rx(I, AngleX)
    Next I
    CopyMemory(@Sauvegarde, @V(AA)\X, SizeOf(RefInfo) )    
EndProcedure

Macro AffFil(Cor, Coul, CXR, CYR)
    For J = Corps(Cor)\Dep To Corps(Cor)\Fin        

        I = Fil(J)\A
        ZCoef.F = 10.0 / Sqr(110.0 + V(I)\Z * 100.0)
        X1.F = CXR + V(I)\X * 100.0 * ZCoef
        Y1.F = CYR - V(I)\Y * 100.0 * ZCoef
                
        I = Fil(J)\B
        ZCoef.F = 10.0 / Sqr(110.0 + V(I)\Z * 100.0)
        X2.F = CXR + V(I)\X * 100.0 * ZCoef
        Y2.F = CYR - V(I)\Y * 100.0 * ZCoef
                    
        LineXY(X1, Y1, X2, Y2, Coul)
        ;DrawingMode(#PB_2DDrawing_Transparent)
        X3.F = CXR + V(I)\X * 100.0 * ZCoef * 1.1
        Y3.F = CYR - V(I)\Y * 100.0 * ZCoef * 1.1
        If Option & (1 << (J - Corps(Cor)\Dep) )
            Fond = RGB(255, 255, 255)
        Else
            Fond = 0
        EndIf
        DrawText(X3 - 8, Y3 - 8, Chr(Asc("X") + (J - Corps(Cor)\Dep) ), Coul, Fond)
    Next
EndMacro

    InitScreen()
    CX0.F = Desk\Width / 2.0
    CY0.F = Desk\Height / 2.0
    CX1.F = Desk\Width / 3.0
    CY1.F = Desk\Height / 3.0
    CX2.F = 2 * Desk\Width / 3.0
    CY2.F = 2 * Desk\Height / 3.0
    CX3.F = Desk\Width / 4.0
    CY3.F = Desk\Height / 4.0
    Count.I = Pow(Nb, 1.0 / 3.0) - 2
    Stepp.F = 120 / Count
    XX.F = 0
    L = 0
    For I = 0 To Count
        YY.F = 0
        For J = 0 To Count
            ZZ.F = 0
            For K = 0 To Count
                V(L)\X = (XX - 60.0)
                V(L)\Y = (YY - 60.0)
                V(L)\Z = (ZZ - 60.0)
                L + 1
                ZZ + Stepp
            Next
            YY + Stepp  
        Next
        XX + Stepp
    Next

    RefReset(@V(0)\X)
    Fil(0)\A = 0
    Fil(0)\B = 1
    Fil(1)\A = 0
    Fil(1)\B = 2
    Fil(2)\A = 0
    Fil(2)\B = 3
    RefReset(@V(4)\X)
    Fil(3)\A = 4
    Fil(3)\B = 5
    Fil(4)\A = 4
    Fil(4)\B = 6
    Fil(5)\A = 4
    Fil(5)\B = 7
    RefReset(@V(8)\X)
    Fil(6)\A = 8
    Fil(6)\B = 9
    Fil(7)\A = 8
    Fil(7)\B = 10
    Fil(8)\A = 8
    Fil(8)\B = 11
    Corps(0)\Dep = 0
    Corps(0)\Fin = 2

    Corps(1)\Dep = 3
    Corps(1)\Fin = 5
    
    Corps(3)\Dep = 6
    Corps(3)\Fin = 8
    
    Corps(2)\Dep = 12
    Corps(2)\Fin = Nb
    RSpeed.F = 0.04
    KeyboardMode(#PB_Keyboard_International)
    If CreateSprite(0, 16, 16)
        StartDrawing(SpriteOutput(0) )
            Box(0, 0, 16, 16, RGB(255, 255, 255) )
        StopDrawing()
    Else
        End
    EndIf
    e.F = 1.0
    Repeat
        Delay(1)
        ExamineKeyboard()
        ClearScreen(0)
        StartDrawing(ScreenOutput() )
            Corps = 2
            CorpsRef = 1
            Ref = 4
            RXX.F = V(Ref + 1)\X
            RXY.F = V(Ref + 2)\X
            RXZ.F = V(Ref + 3)\X
            RYX.F = V(Ref + 1)\Y
            RYY.F = V(Ref + 2)\Y
            RYZ.F = V(Ref + 3)\Y
            RZX.F = V(Ref + 1)\Z
            RZY.F = V(Ref + 2)\Z
            RZZ.F = V(Ref + 3)\Z
            For I = Corps(Corps)\Dep To Corps(Corps)\Fin
                u.F = V(I)\X            
                v.F = V(I)\Y
                w.F = V(I)\Z
                                            
                VX.F = (u * RXX + v * RXY + w * RXZ) * e
                VY.F = (u * RYX + v * RYY + w * RYZ) * e
                VZ.F = (u * RZX + v * RZY + w * RZZ) * e

                ZCoef.F = 300.0 / (300.0 + VZ)
                X.F = CX2 + VX * ZCoef
                Y.F = CY0 - VY * ZCoef                
                Box(X, Y, 1, 1, RGB(0, 0, 255) )
            Next
            Ref = 0
            RXX.F = V(Ref + 1)\X
            RXY.F = V(Ref + 2)\X
            RXZ.F = V(Ref + 3)\X
            RYX.F = V(Ref + 1)\Y
            RYY.F = V(Ref + 2)\Y
            RYZ.F = V(Ref + 3)\Y
            RZX.F = V(Ref + 1)\Z
            RZY.F = V(Ref + 2)\Z
            RZZ.F = V(Ref + 3)\Z
            For I = Corps(Corps)\Dep To Corps(Corps)\Fin
                u.F = V(I)\X            
                v.F = V(I)\Y
                w.F = V(I)\Z
                                            
                VX.F = (u * RXX + v * RXY + w * RXZ) * (4.0 - e)
                VY.F = (u * RYX + v * RYY + w * RYZ) * (4.0 - e)
                VZ.F = (u * RZX + v * RZY + w * RZZ) * (4.0 - e)

                ZCoef.F = 300.0 / (300.0 + VZ)
                X.F = CX3 + VX * ZCoef
                Y.F = CY0 - VY * ZCoef                
                Box(X, Y, 1, 1, RGB(255, 0, 0) )
            Next
            ;DisplaySprite(0, 0, 0)
            
            Option = 0: AffFil(0, RGB(255, 0, 0), CX3, CY0)
            Option = Modif: AffFil(3, RGB(0, 0, 255), CX3, CY0)
            Option = Modif: AffFil(1, RGB(0, 0, 255), CX2, CY0)
            Option = 0: AffFil(3, RGB(255, 0, 0), CX2, CY0)
            Dep = 1
            Fin = 3
            Modif = 0
            If KeyboardPushed(#PB_Key_Return)
                If e < 3.5
                    e + 0.1
                EndIf
            EndIf
            If KeyboardPushed(#PB_Key_Back)
                If e > 0.5
                    e - 0.1
                EndIf
            EndIf
            If KeyboardPushed(#PB_Key_Up)
                Modif | 1
                For I = Dep To Fin
                    Rx(I, RSpeed)
                Next
            EndIf
            If KeyboardPushed(#PB_Key_Down)
                Modif | 1
                For I = Dep To Fin
                    Rx(I, -RSpeed)
                Next
            EndIf
            If KeyboardPushed(#PB_Key_Left)
                Modif | 4
                For I = Dep To Fin
                    Rz(I, RSpeed)
                Next
            EndIf
            If KeyboardPushed(#PB_Key_Right)
                Modif | 4
                For I = Dep To Fin
                    Rz(I, -RSpeed)
                Next
            EndIf
            If KeyboardPushed(#PB_Key_Tab)
                Modif | 2
                For I = Dep To Fin
                    Ry(I, RSpeed)
                Next
            EndIf
            If KeyboardPushed(#PB_Key_A)
                Modif | 2
                For I = Dep To Fin
                    Ry(I, -RSpeed)
                Next
            EndIf
            Tr(0, 4)
            DrawText(0, 0, "ROTATIONS : X = Haut/Bas   Y = Tab/A   Z = Gauche/Droite     REFERENTIEL : Entrée/Backspace")
        StopDrawing()
        FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)
    ;}

;}
Anonyme

Re: Un peu de légèreté...

Message par Anonyme »

Très bon code ^^
Si tu veut te pencher sérieusement sur la 3D , tu vas devoir utilisé les calculs matricielles qui te simplifie la vie ainsi que les vecteurs / quaternions ( pour le problème de "cardan" ou glimbal lock ).

Avec des calculs vectoriels , tu pourras savoir si un triangle te fait face , si oui , avec un autre calcul ( L dot N ) tu calcule la luminosité des vertex qui compose le triangle.
avec toute ces vertex , tu écrit un code de rastérisation qui interpole la luminosité de tes vertex... et paf... tu as déjà l'embryon d'un moteur 3D software ^^

@+
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Un peu de légèreté...

Message par beauregard »

joli. :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Un peu de légèreté...

Message par Ollivier »

@Cpl.Bator

Désolé, mais les quaternions sont inutiles pour ce type d'application: Et ce code, bien qu'envahi de superflu en est la preuve...
Anonyme

Re: Un peu de légèreté...

Message par Anonyme »

Bien sur , on peut même se passer des matrices et faire toute les opérations à la main , mais c'est débille...
si tu veut aller plus loin , t'a pas le choix , sinon tu prendras vite la tête avec des codes beaucoup plus lourd....
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Un peu de légèreté...

Message par Ollivier »

Alors là, je t'arrête: « Débile » n'a qu'un seul L, c'est l'imbécillité qui en a deux! Et, dans ta phrase « on peut même se passer des matrices », si jamais « on » est un con sans matricule, j'ai l'impression que, sans même que j'ai eu besoin de me présenter comme candidat, d'office, à ce sujet, tu m'as élu...

Alors, je te pose de suite la question : Est-ce que tu me prends pour un con?
Verrouillé