Turbo c++ 3D旋转问题

Turbo C++ 3D rotation issue

本文关键字:问题 旋转 3D c++ Turbo      更新时间:2023-10-16

首先,请不要问我为什么使用过时的软件。我只是把Turbo c++作为一种有趣的方式来开始简单的程序。我正在尝试创建一个运行在CPU上的老式3D引擎。我首先尝试让它在Z轴上旋转一个简单的3D盒子。因为它在绕Z轴旋转,所以它看起来应该像一个旋转的二维盒子。但是当我运行代码时,它甚至不能将顶点投影到正确的位置。

请原谅我输入代码的方式。

    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

它应该显示一个框,但它没有。

第一个问题是,你有一个元素太短的数组,例如

float POINT[2];

然后在很多地方访问POINT[2]…在C语言中,当您定义一个数组时,您告诉它的元素数量,因此上面您创建了包含两个元素的POINT数组,它们的索引分别为0和1。访问POINT[2]超出数组边界,这是未定义行为

所以你想要的是,例如:

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

当然,同样的修复每个数组,你有同样的错误。


一个启用了警告功能的编译器应该对这样的代码发出警告,因为编译器在编译时就知道数组的大小。

代码可能有其他问题,但试图修复它们是毫无意义的,只要你有未定义的行为,因为这本质上意味着,你的程序可以做任何程序可以做的事情(包括看似正确地工作,并在下次使用网上银行时清空你的银行账户,以及两者之间的一切)。