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 ... stephbb75
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser... |
|
|