2015-09-26 1 views
0

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.

+0

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

+0

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

+0

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

Répondre

0

Le premier problème que vous avez est, vous avez un élément des réseaux trop court, par exemple

float POINT[2]; 

puis dans de nombreux endroits que vous accédez POINT[2] ... En C, lorsque vous définissez un tableau, vous dites le nombre d'éléments dedans, donc au-dessus vous créez POINT tableau avec deux éléments, qui sont avec les index 0 et 1. L'accès POINT[2] sort des limites de tableau, qui est undefined comportement.

donc ce que vous voulez est, par exemple:

float POINT[3]; // valid indexes 0..2 

Et bien sûr même correctif pour tous les tableaux où vous avez la même erreur.


Un compilateur décent avec des avertissements activé devrait vous avertir sur le code comme ça, puisque le compilateur connaît la taille du tableau au moment de la compilation.

Le code peut avoir d'autres problèmes, mais il est inutile d'essayer de les corriger aussi longtemps que vous avez un comportement non défini, parce que cela signifie essentiellement, votre programme peut faire tout ce qu'un programme peut faire (y compris le travail apparemment correctement, et la vidange votre compte bancaire la prochaine fois que vous utilisez les services bancaires par Internet, et tout entre et au-delà).

+0

Dans Turbo C++, un tableau commence à 0. Je ne sais pas pourquoi mais c'est ainsi que cela fonctionne. Et je me suis assuré qu'il a tous les points en les imprimant que vous avez vu dans l'image. Mais merci pour l'aide. :) J'ai réécrit le code dans Lua cette fois et ça fonctionne parfaitement. J'ai plus tard compris le problème que j'avais et résolu. Voici la version de lua que j'ai faite: https://i.gyazo.com/0c20c30404a4a284cf5265823dafe660.gif – Jason

+0

Dans les index de tableau C commencent à 0, donc "Une raison quelconque" est la norme C. Lorsque vous définissez array, vous ne spécifiez pas le dernier index, vous spécifiez * size *, donc le dernier index valide est un de moins. Quoi qu'il en soit, passer à Lua pour apprendre/jouer est probablement une bonne idée, beaucoup plus agréable, moins de temps passé à déboguer des bogues de bas niveau comme des index de tableaux hors limites. – hyde

+0

Btw, comme vous êtes nouveau chez SO: si vous considérez que le problème est résolu, vous pouvez accepter la meilleure réponse (à votre avis) (coche dans le coin supérieur gauche). Bien sûr, si vous voulez plus de réponses, ou si aucune des réponses n'est assez bonne, laissez-la non acceptée. – hyde