Tout d'abord, ne demandez pas pourquoi j'utilise un logiciel obsolète. Je suis juste en train de jouer avec Turbo C++ comme une façon amusante de commencer avec des programmes simples. J'essaye de créer un vieux moteur 3D d'école qui fonctionne sur le CPU. J'ai d'abord essayé de faire tourner une simple boîte 3D sur l'axe Z. Comme il tourne sur l'axe Z, il devrait ressembler à une boîte 2D tournant. Mais quand je lance le code, il ne projette même pas les sommets dans la bonne position.Problème de rotation Turbo C++ 3D
Veuillez m'excuser pour la façon dont je tape mon code.
void Render3D(float VDATA[],float CFRAME[]) {
if (VDATA!=NULL) { float POINT[2]; float OLDPOINT[2]; float AXIS=0;
for (int P=0; P<24; P=P+1) { AXIS=AXIS+1; if (AXIS==1) { POINT[0]=VDATA[P]; }
if (AXIS==2) { POINT[1]=VDATA[P]; } if (AXIS==3) { POINT[2]=VDATA[P]; if (CFRAME!=NULL) {
OLDPOINT[0]=POINT[0]; OLDPOINT[1]=POINT[1]; OLDPOINT[2]=POINT[2];
POINT[0]=OLDPOINT[0]*cos(CFRAME[8])-OLDPOINT[1]*sin(CFRAME[8]);
POINT[1]=OLDPOINT[0]*sin(CFRAME[8])+OLDPOINT[1]*cos(CFRAME[8]);
OLDPOINT[0]=POINT[0]; OLDPOINT[1]=POINT[1]; OLDPOINT[2]=POINT[2];
POINT[1]=OLDPOINT[1]*cos(CFRAME[7])-OLDPOINT[2]*sin(CFRAME[7]);
POINT[2]=OLDPOINT[1]*sin(CFRAME[7])+OLDPOINT[2]*cos(CFRAME[7]);
OLDPOINT[0]=POINT[0]; OLDPOINT[1]=POINT[1]; OLDPOINT[2]=POINT[2];
POINT[2]=OLDPOINT[2]*cos(CFRAME[6])-OLDPOINT[0]*sin(CFRAME[6]);
POINT[0]=OLDPOINT[2]*sin(CFRAME[6])+OLDPOINT[0]*cos(CFRAME[6]);
POINT[0]=POINT[0]+CFRAME[3]; POINT[1]=POINT[1]+CFRAME[4]; POINT[2]=POINT[2]+CFRAME[5]; }
cout<<POINT[0]<<","<<POINT[1]<<","<<POINT[2]<<endl;
putpixel(POINT[0],POINT[1],7); AXIS=0; POINT[0]=0; POINT[1]=0; POINT[2]=0; } } } }
void main() { int Driver=DETECT,Mode; initgraph(&Driver,&Mode,"BGI");
clrscr(); cleardevice();
float VDATA[23]; float CFRAME[8]; CFRAME[3]=200; CFRAME[4]=200; CFRAME[5]=0;
VDATA[0]=-50; VDATA[1]=-50; VDATA[2]=-50;
VDATA[3]=-50; VDATA[4]=50; VDATA[5]=-50;
VDATA[6]=50; VDATA[7]=-50; VDATA[8]=-50;
VDATA[9]=50; VDATA[10]=50; VDATA[11]=-50;
VDATA[12]=-50; VDATA[13]=-50; VDATA[14]=50;
VDATA[15]=-50; VDATA[16]=50; VDATA[17]=50;
VDATA[18]=50; VDATA[19]=-50; VDATA[20]=50;
VDATA[21]=50; VDATA[22]=50; VDATA[23]=50;
while (1>0) { clrscr(); cleardevice(); Render3D(VDATA,CFRAME);
CFRAME[8]=CFRAME[8]+0.01; getch(); }
clrscr(); cleardevice(); closegraph(); }
Le tableau VDATA [23] contient les points pour un cube. Le tableau CFRAME [8] contient les informations du cadre de coordonnées. Les trois premiers éléments peuvent être ignorés. Mais CFRAME [3], CFRAME [4], CFRAME [5] définit le décalage du cube dans XYZ. Et CFRAME [6], CFRAME [7], CFRAME [8] définit la rotation du cube dans XYZ. Mais quand je lance le code, il affiche quelque chose comme ceci:
https://i.gyazo.com/a8c0d62b03e14aa10e2bc93027fb3f05.png
Il devrait afficher une boîte, mais il ne fonctionne pas.
Veuillez mettre en retrait votre code lorsque vous postez sur SO. Beaucoup plus susceptible d'amener quelqu'un à regarder .... Aussi, vous dessinez juste des pixels de coin? Essayez de dessiner les lignes, pour mieux voir ce qui se passe. – hyde
Vous n'avez pas vraiment besoin de regarder les pixels lorsque j'affiche le XYZ des coordonnées. Il n'y a pas besoin de dessiner des lignes car cela ne changerait rien et serait encore plus déroutant de voir une seule ligne sur l'écran. J'aime aussi taper mon code de cette façon parce que je préfère voir tout le code sans les faire chevaucher la fenêtre et avoir besoin de faire défiler sur le côté pour le voir. – Jason
Pour tous ceux qui rencontrent ce sujet, s'il vous plaît ne parlez pas de le rendre «mieux» ou de demander quelque chose qui n'aidera pas l'un d'entre nous. C'est mon premier article, et je vais indenter mes futurs codages la prochaine fois que je ne veux pas avoir une conversation continue pour rendre mon code plus propre. Je vous remercie. :) – Jason