CODINGSDCC TUT'S PAR STEPHBB75 ★ 3D Temps réel basic ★

Sdcc - 16 - 3D - Temps Reel BasicCoding Sdcc Tut's Par Stephbb75

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

ANNÉE: 2013
★ AUTEUR: Stephbb75

Page précédente : Sdcc - 15 - Animation Par Sprite

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 126 millisecondes et consultée 1065 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.