在等距投影中将 3D 坐标转换为 2D

标签 c math graphics

我在将 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/

相关文章:

c++ - openGL中的随机点生成

java - 大型数组中元素的并行求和

Java Applet 不适用于 Eclipse 中的任何代码

c - 如何将核心转储位置/路径配置为特定于进程?

algorithm - 编写一个 36 位随机数生成器

java - 与线相交的垂直射线

javascript - 在 javascript 中使 3D 相机绕物体旋转

c++ - 尝试在 openGL 中创建空白窗口时出现异常输出

c - 如何使用指向结构的指针

c++ - 了解文件格式和图像格式的剖析