Turbo c++ 3D旋转问题
Turbo C++ 3D rotation issue
首先,请不要问我为什么使用过时的软件。我只是把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
当然,同样的修复每个数组,你有同样的错误。
一个启用了警告功能的编译器应该对这样的代码发出警告,因为编译器在编译时就知道数组的大小。
代码可能有其他问题,但试图修复它们是毫无意义的,只要你有未定义的行为,因为这本质上意味着,你的程序可以做任何程序可以做的事情(包括看似正确地工作,并在下次使用网上银行时清空你的银行账户,以及两者之间的一切)。
相关文章:
- ASCII 旋转光标 (TUI) 动画出现问题
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- 从iPhone相机拍摄的视频似乎被OpenCV旋转了90度?我该如何解决这个问题?
- 2D旋转问题C Directx
- glulookat() - 旋转问题
- AVL二进制树旋转和删除树的C 问题
- AVL 树旋转问题
- 将矩阵逆时针旋转 180 度的问题
- 四元数 -> 欧拉角 -> 旋转矩阵问题 (GLM)
- C++OpenGl相机旋转使用四元数问题
- OpenGl 自定义旋转问题
- 这种在Qt中渲染旋转椭圆的尝试有什么问题
- OpenGL 旋转问题
- OpenGL:问题使图标旋转
- Turbo c++ 3D旋转问题
- 向量旋转问题
- OpenGL旋转的问题
- 检测Qt问题中的屏幕旋转
- 虚幻引擎中的四元数旋转框架问题