Sphère animée 1440 points

Sphère animée 1440 points

Messagede Fantomas » Ven 24 Avr 2009 16:42

En attendant le suite du tutorial, une petite pause avec l'adapation en GFW d'un programme Blitz Basic de Tracer: une sphère animée de 1440 points. Fluide sur mon PC même non compilé !

Bouton droit de la souris pour quitter ;)

Code: Tout sélectionner
' **********************************
' *    DEPTH COLORED 3D DOT BALL   *
' **********************************
' *  ORIGNAL BLITZ CODE BY: TRACER *
' *   ADAPTED TO GFW BY: FANTOMAS  *
' **********************************

dots_in_ball% = 1440           ' Nombre de points de la sphère

numpoints% = dots_in_ball%     ' Numbre de points dans la table.
distance%  = 400               ' Utilisé pour la perspective.

' --- Tableau utilisés pour 3D
DIM points%(numpoints%, 3)     

OPENW #1,100,100,640,480,$30
' --------------------------------------------
' Gestion des écrans Logique/Physique
' --------------------------------------------
HiddenBMP1& = CREATEBMP(640,480)      ' Crée un bitmap de 640x480 en mémoire
HiddenDC1& = MEMDC(_DC(1))            ' Compatibles avec l'écran "physique"
SETBMP HiddenDC1&,HiddenBMP1&

SETDC HiddenDC1&
RGBCOLOR RGB(0,0,0)
DEFFILL 0
PBOX 0,0,640,480

' --- Calcul des points de la surface de la sphère:
' x = cos(theta) * cos(phi)
' y = cos(theta) * sin(phi)
' z = sin(theta)
' ou theta = -90 to 90
' et phi = 0 to 360
FOR t = 1 TO dots_in_ball%
  xd = RANDOM (180) - 90
  x0 = (COS(xd) * 10) * (COS(t) * 10)
  y0 = (COS(xd) * 10) * (SIN(t) * 10)
  z0 = SIN(xd) * 100
  points%(t,1) = x0
  points%(t,2) = y0
  points%(t,3) = z0
NEXT t
' --- Boucle jusqu'à clic droit souris:
REPEAT
  ' Efface écran logique:
  RGBCOLOR RGB(0,0,0)
  DEFFILL 0
  PBOX 180,100,460,380
  ' --- Calcul des points:
  vx = vx + 0.0125           ' vitesse de rotation X
  vy = vy + 0.0125           ' vitesse de rotation Y
  vz = vz + 0.0125           ' vitesse de rotation Z
  FOR n% = 1 TO numpoints%
    x3d = points%(n%, 1)
    y3d = points%(n%, 2)
    z3d = points%(n%, 3)
    ty = ((y3d * COS(vx)) - (z3d * SIN(vx)))
    tz = ((y3d * SIN(vx)) + (z3d * COS(vx)))
    tx = ((x3d * COS(vy)) - (tz * SIN(vy)))
    tz = ((x3d * SIN(vy)) + (tz * COS(vy)))
    ox = tx
    tx = ((tx * COS(vz)) - (ty * SIN(vz)))
    ty = ((ox * SIN(vz)) + (ty * COS(vz)))
    nx%  = 320 + 512 * (tx) / (distance% - (tz))
    ny%  = 240 - (512 * ty) / (distance% - (tz))
    ' --- Regarde la valeur de z du pixel (profondeur)
    ' et définit la couleur correspondante:
    IF tz <= 100 AND tz >= 75
      RGBCOLOR RGB(250,250,250)
    ELSE
      IF tz <= 75 AND tz >= 50
        RGBCOLOR RGB(225,225,225)
      ELSE
        IF tz <= 50 AND tz >= 25
          RGBCOLOR RGB(200,200,200)
        ELSE
          IF tz <= 25 AND tz >= 0
            RGBCOLOR RGB(175,175,175)
          ELSE
            IF tz <= 0 AND tz >= -25
              RGBCOLOR RGB(150,150,150)
            ELSE
              IF tz <= -25 AND tz >= -50
                RGBCOLOR RGB(125,125,125)
              ELSE
                IF tz <= -50 AND tz >= -75
                  RGBCOLOR RGB(100,100,100)
                ELSE
                  IF tz <= -75 AND tz >= -100
                    RGBCOLOR RGB(50,50,50)
                  ENDIF
                ENDIF
              ENDIF
            ENDIF
          ENDIF
        ENDIF
      ENDIF
    ENDIF
    ' --- Affiche le point:
    PLOT nx%,ny%
  NEXT n%
  ' --- Transfert ecran logique dans ecran physique:
  BITBLT HiddenDC1&,0,0,640,480,_DC(1),0,0,SRCCOPY
UNTIL MOUSEK = 2
SETDC _DC(1)
CLOSEW #1
END


Fantomas
Avatar de l’utilisateur
Fantomas
 
Messages: 43
Inscription: Dim 4 Jan 2009 11:52

Retourner vers GFA PC

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron