我在将 3D 坐标转换为 2D 然后在 C 中打印等距投影中的所有点时遇到问题。
我试过这个:
u = x / z;
v = y / z;
但是当 z = 0 时,我的函数进入无限循环。
我还在谷歌上找到了一些东西,但这对负 Z 不起作用(我想要 Z > 0 时的颠簸和 Z < 0 时的坑)
这是我的工作方式。我的函数得到一个看起来像这样的文件
0 0 0 0 0 0 0 0 0 0
0 9 9 9 9 9 9 9 9 0
0 9 9 9 9 9 9 9 9 0
0 9 9 9 -5 -5 9 9 9 0
0 9 9 9 -5 -5 9 9 9 0
0 9 9 9 -5 -5 9 9 9 0
0 9 9 9 -5 -5 9 9 9 0
0 9 9 9 9 9 9 9 9 0
0 9 9 9 9 9 9 9 9 0
0 0 0 0 0 0 0 0 0 0
数字代表 z 坐标,原点 (0;0;0) 位于左上角。
最佳答案
听起来你在混淆概念。只有当您将 3D 原点视为您的相机,并且将 z=1 平面视为您的屏幕时,除以第三坐标才有意义。在那种情况下,z=0 的点被投影到无穷大。通常你有一个视锥体来裁剪这样的无限坐标。如果您的输入预期有 z=0,那将无法工作。
无论如何,它不是isometric ,因为 z 轴扮演的角色与所有其他轴不同。等距投影是平行投影的特例,而您的划分建议使用中心投影,除非它是平面投影变换后的去均匀化步骤。
对于等距投影,我建议您改为尝试以下方法:
u = x*cos(α) + y*cos(α+120°) + z*cos(α-120°)
v = x*sin(α) + y*sin(α+120°) + z*sin(α-120°)
尽管对于 C,您必须转换为弧度。 α 将旋转您的 View ,选择您想要对齐的东西。如果您选择 α 作为 30° 的倍数,您将得到相当不错的数字,仅包含一个简单的平方根。 sin/cos 对简单地描述了彼此成 120° 的三个单位长度 vector 。您将这些用作 3D 单位 vector 的图像。如果愿意,您也可以将其写成矩阵乘以 vector 乘法。
关于在等距投影中将 3D 坐标转换为 2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28607713/