Accueil

CPC


 Dev C sur CPC :

  • le C sur CPC
  • SDCC débuter
  • fichier BAT pour compiler
  • Dessiner Sur CPC
  • Optimiser le dessin
  • Ecrire du texte
  • Lire un fichier
  • Ecrire un fichier
  • Swap d'écran
  • CLS ultra rapide
  • H line
  • Attaquer le CRTC
  • Full Overscan
  • Put pixel très rapide
  • Afficher une image
  • Slide show 1
  • Bézier
  • faire un fichier pour Bézier

  • Quelque fonctions utile

  • Animation
  • 3D
  • Raster
  • Manche a balais

    Le plan du Site

  •  
      Ici les nouvelle du site  
     
    Recherche ?
    Saissisez un mot clé

     
      Quelques chiffres
    Visiteurs:4062
    Visiteurs aujourd'hui:17
     
     
    Me contacter
    Donnez votre avis
     
    Le site de Steph : Le CPC

    3D temps réel


    On vas faire afficher un cube en 3D, bons, je suis claire d'entrée, c'est de la 3D temps réel, mais du temps du CPC !
    Déjà, on a un Z80 à pas très vite, des composants graphiques d'une technologie des années 80... avec un ramdac de heuuu proche de zéro, aucun pipeline, encore moins un nombre impressionnant de GPU, ...
    De plus mon code pour la 3D n'est pas forcément des plus optimisé, les matheux pourront surement trouver des calcules plus rapide, des optimisations, ...

    Bon, je vais changer le titre de la page :

    3D temps IREEL


    Et pour bien débuter, on va repasser sur le basic, oui notre cher basic...
    Le principe du programme :
    - Calcule des tables de sinus et cosinus
    - Rotation par calcule de matrice
    - Projection
    - Affichage, soit en point ou fil de fer pour le moment !

    Pour faire cela j'utiliser perso l'émulateur PC-CPC, car il a une fonction qui est super pratique, pouvoir directement lire sur un disque du PC come ci c'était une disquette, et la touche F2 pour le turbo, vous comprendrez plus tard ;-).

    Voici notre petit programme en BASIC :

    1 ' 3D en basic
    2 ' cube3.bas, FilDeFer avec rotation du cube
    9 ' coord = coordonee, 0=x, 1=y, 2=z , 3=xy
    10 dim coord(4,7)
    11 dim Point3D(3,7)
    12 dim Point2D(2,7)
    13 dim matrice(3,3)
    14 dim tSin(360) : dim tCos(360)
    
    20 coord(0,0) = -100: coord(1,0) = -100: coord(2,0) = -100
    21 coord(0,1) =  100: coord(1,1) = -100: coord(2,1) = -100
    22 coord(0,2) =  100: coord(1,2) =  100: coord(2,2) = -100
    23 coord(0,3) = -100: coord(1,3) =  100: coord(2,3) = -100
    24 coord(0,4) =  100: coord(1,4) = -100: coord(2,4) =  100
    25 coord(0,5) = -100: coord(1,5) = -100: coord(2,5) =  100
    26 coord(0,6) = -100: coord(1,6) =  100: coord(2,6) =  100
    27 coord(0,7) =  100: coord(1,7) =  100: coord(2,7) =  100
    28 Xoff = 160:Yoff = 100: Zoff = 600
    29 p1=0:p2=0
    
    30 mode 1
    
    49 print "Initalisation des table SIN ET COS"
    50 'initalisation des table sin et cos
    51 for i=0 to 360
    52 tSin(i)=sin(i * pi / 180)
    53 tCos(i)=cos(i * pi / 180)
    54 locate 1,2:print i
    55 next i
    59 print "Fin initalisation des table sin et cos"
    
    70 print "Affichage Point ou Fil de fer (P / F) ?"
    71 a$=INKEY$
    72 IF a$="" THEN 71
    73 IF a$="p" OR a$="P" THEN 80
    74 IF a$="f" OR a$="F" THEN 90
    75 GOTO 71
    
    80 cls:print "Affichage en Point"
    81 a$="p":goto 110
    
    90 cls:print "Affichage en Fil de fer"
    91 a$="f"
    
    110 Xa=0:Ya=0:Za=0
    
    111  ' Animation de note cube jusqu'a pression d'une touche
    120 c$=""
    121 tour=0
    130 while( c$="" )
    132 locate 1,1 : print tour
    140 gosub 5000 'Rotation xa,ya,za
    150 gosub 3000 'Projection
    155 clg
    160 if a$="p" then gosub 1300 else gosub 1200  'affichage
    170 Xa=(Xa+2) mod 360
    171 Ya=(Ya+6) mod 360
    172 Za=(Za+2) mod 360
    180 c$=inkey$
    182 tour = tour + 1
    190 wend
    200 end
    
    1000 'sous programme de tracer de ligne
    1010 'prend p1 et p2 comme variable
    1020 'repositione le curseur
    1030 move Point2D(0,p1), Point2D(1,p1)
    1040 draw Point2D(0,p2), Point2D(1,p2)
    1050 return
    
    1100 'sous programme de tracer de ligne
    1110 'prend p1 et p2 comme variable
    1120 'NE repositione PAS le curseur
    1130 draw Point2D(0,p2), Point2D(1,p2)
    1140 return
    
    1200 'sous programme d'affiche fil de fer
    1210 'On affiche la face avant
    1211 P1=0:P2=1:gosub 1000
    1212 P1=1:P2=2:gosub 1100
    1213 P1=2:P2=3:gosub 1100
    1214 P1=3:P2=0:gosub 1100
    1220 'Puis la face arriere
    1221 P1=4:P2=5:gosub 1000
    1222 P1=5:P2=6:gosub 1100
    1223 P1=6:P2=7:gosub 1100
    1224 P1=7:P2=4:gosub 1100
    1230 'Et enfin les aretes restantes
    1231 P1=0:P2=5:gosub 1000
    1232 P1=1:P2=4:gosub 1000
    1233 P1=2:P2=7:gosub 1000
    1234 P1=3:P2=6:gosub 1000
    1240 return
    
    1300 ' sous programme d'affichage point
    1310 for i=0 to 7
    1320 plot Point2D(0,i), Point2D(1,i)
    1330 next i
    1340 return
    
    
    3000 ' sous programme de Projection
    3010 for p=0 to 7
    3020 Point2D(0,p)=(Point3D(0,p)*256)/(Point3D(2,p)+Zoff)+Xoff
    3030 Point2D(1,p)=(Point3D(1,p)*256)/(Point3D(2,p)+Zoff)+Yoff
    3040 next p
    3050 return
    
    
    5000 ' sous programme de Rotation6Mul
    5010 ' Prand Xa, Ya et Za comme variable d'entrée
    5020 ' modifi Point3D
    
    5100 matrice(0,0) = tCos(Za)*tCos(Ya)
    5110 matrice(1,0) = tSin(Za)*tCos(Ya)
    5120 matrice(2,0) = -tSin(Ya)
    
    5130 matrice(0,1) = tCos(Za)*tSin(Ya)*tSin(Xa) - tSin(Za)*tCos(Xa)
    5140 matrice(1,1) = tSin(Za)*tSin(Ya)*tSin(Xa) + tCos(Xa)*tCos(Za)
    5150 matrice(2,1) = tSin(Xa)*tCos(Ya)
    
    5160 matrice(0,2) = tCos(Za)*tSin(Ya)*tCos(Xa) + tSin(Za)*tSin(Xa)
    5170 matrice(1,2) = tSin(Za)*tSin(Ya)*tCos(Xa) - tCos(Za)*tSin(Xa)
    5180 matrice(2,2) = tCos(Xa)*tCos(Ya)
    
    5200  a0=-(matrice(0,1)*matrice(0,0))
    5210  a1=-(matrice(1,1)*matrice(1,0))
    5220  a2=-(matrice(2,1)*matrice(2,0))
    
    5300 for j=0 to 7
    5340 Point3D(0,j) = (matrice(0,0) * coord(0,j)) + (matrice(1,0) * coord(1,j)) + (matrice(2,0) * coord(2,j))
    5350 Point3D(1,j) = (matrice(0,1) * coord(0,j)) + (matrice(1,1) * coord(1,j)) + (matrice(2,1) * coord(2,j))
    5360 Point3D(2,j) = (matrice(0,2) * coord(0,j)) + (matrice(1,2) * coord(1,j)) + (matrice(2,2) * coord(2,j))
    5370 next j
    
    5400 return
    

    Explication rapide :
    - des lignes 10 à 29 : initialisation des variables
    - des lignes 49 à 59 : initialisation des table de sin et cos, la c'est très long ...
    - des lignes 130 à 190 : la boucle du programme, celles ci appel le sous programme de calcule et d'affichage
    - des lignes 1000 à 1140 : Le tracé de ligne, pour gagner un peut de temps, on ne fait pas tout le temps un move pour repositionner le curseur graphique
    - des lignes 1200 à 1240 : le tracer en fil de fer
    - des lignes 1300 à 1340 : le tracer de point
    - des lignes 3000 à 3050 : calcule de projection
    - des lignes 5000 à 5400 : calcule de rotation

    A l'exécution du programme on peut s'apercevoir que le calcule de remplissage des tableaux de sin et cos sont très lent...
    On peut voire aussi que le temps de calcule est long aussi...
    ET que même le temps d'affichage des lignes à l'écran est long … :-)


    L'animation est fidèle en temps vis à vis d'un CPC


    En basic on est donc bien loin de pouvoir faire de la 3D temps réel, mais y avez vous crus une seule seconde ?

    Comme d'hab, le tout se trouve dans se ZIP, le programme basic, cela vous éviteras de le ressaisir ;-)

    On va voire ce que l'on peut faire avec le C ...