2015-09-26 52 views
0

首先,請不要問我爲什麼使用過時的軟件。我只是將Turbo C++搞亂了,作爲一種有趣的方式來開始使用簡單的程序。我正在嘗試創建一個在CPU上運行的舊式3D引擎。我首先嚐試使它在Z軸上旋轉一個簡單的3D盒子。由於它是通過Z軸旋轉的,它應該看起來像是旋轉的2D盒子。但是當我運行代碼時,它甚至不會將頂點投影到正確的位置。Turbo C++ 3D旋轉問題

請原諒我鍵入我的代碼的方式。

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(); } 

VDATA [23]數組包含一個立方體的點。 CFRAME [8]數組保存座標系信息。前三個元素可以忽略。但是CFRAME [3],CFRAME [4],CFRAME [5]設置了XYZ中立方體的偏移量。 CFRAME [6],CFRAME [7],CFRAME [8]設置XYZ中立方體的旋轉。但是,當我運行的代碼,它顯示是這樣的:

https://i.gyazo.com/a8c0d62b03e14aa10e2bc93027fb3f05.png

應該顯示一個框,但事實並非如此。

+0

當您在SO發帖時,請縮進您的代碼。更有可能讓某人去看它......而且,你正在繪製角落像素?嘗試繪製線條,以更好地看到發生了什麼。 – hyde

+0

當我顯示座標的XYZ時,您不一定需要查看像素。沒有必要畫線,因爲它不會改變任何東西,並且在屏幕上看到一條線會更混亂。我也喜歡這樣輸入我的代碼,因爲我寧願看到所有的代碼,而沒有讓它們與窗口重疊,並且需要滾動到一邊才能看到它。 – Jason

+0

對於遇到此線索的其他人,請不要談論讓它「看起來更好」,或者提出一些對我們兩個人都沒有幫助的事情。這是我的第一篇文章,下次我會縮進我未來的編碼,因爲我不想讓我的代碼看起來更整潔。謝謝。 :) – Jason

回答

0

你的第一個問題是,你有一個元素太短陣列,例如

float POINT[2]; 

,然後在你訪問POINT[2] ...在C多的地方,當你定義一個數組,你告訴在它上面的元素的數量,所以上面你創建POINT數組與兩個元素,這是與索引0和1.訪問POINT[2]超出數組界限,這是未定義的行爲

所以,你想要什麼,例如:

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

而且很多情況下你有同樣的錯誤,每個數組當然同樣的修復。


因爲編譯器知道編譯時的數組大小,所以啓用警告的體面編譯器應該警告你這樣的代碼。

代碼可能有其他的問題,但它是沒有意義的嘗試,只要你有未定義行爲來解決這些問題,因爲這基本上意味着,你的程序可以做任何一個程序可以做(包括看似正常工作,排空您下次使用網上銀行時的銀行帳戶,以及其他所有內容)。

+0

在Turbo C++中,數組從0開始。我不知道爲什麼,但它是如何工作的。我通過在照片中看到的所有要點來確保它得到了所有要點。但是,感謝您的幫助。 :)這次我重寫了Lua中的代碼,它完美地工作。後來我想出了我遇到的問題並解決了它。這是我做的lua版本:https://i.gyazo.com/0c20c30404a4a284cf5265823dafe660.gif – Jason

+0

在C數組索引從0開始,所以「某些原因」是C標準。當你定義數組時,你不指定最後一個索引,你指定* size *,所以最後一個有效索引少一個。無論如何,切換到Lua進行學習/遊戲可能是個好主意,更好,更省時間調試低級別的錯誤,比如超出範圍的數組索引。 – hyde

+0

順便說一句,因爲你是新來的SO:如果你認爲問題已經解決,你可以接受最好的答案(左上角的勾號)。當然,如果你想要更多的答案,或者如果答案都不夠好,那就不要接受。 – hyde