在2D坐标系中的等轴投影

5

在二维空间中的等轴投影平面上移动一个点需要使用什么方程?

我已经在网络上搜索了多个地方,主要是这里,但我无法理解。不幸的是,我不是数学专业的。

我需要做的是在由10像素块组成的等轴投影平面上将一个点从(0,0)移动到(1,0)或(0,1)。在普通的二维平面上,我只需使用(x+10,y+0)或(x+0,y+10)来移动自己。

如果这有助于更好地理解,我在iPhone上的核心动画中完成了大部分工作。

谢谢您的时间。

DP

3个回答

12
如果你打算做更多的图形游戏编程,我建议至少考虑数学专业的副修。
但是,如果你继续做这样的图形工作,最好掌握三角函数、矩阵代数和向量代数的知识。使用向量和矩阵可以使更复杂的变换(如透视投影)更容易,也可以帮助简单的变换,如等角变换。
总之(其中一些,如果不是大部分,可能会对你来说是复习):实际上,所谓的“图形变换”是通过一些组合的平移、旋转、缩放、反射和剪切的字面变换来变换点;对于二维坐标系,大多数这些概念应该对你来说很熟悉,并且可以相当简单地表达。在以下示例中,我将使用以“(x1,y1),(x2,y2)”形式表示的由两个点定义的线段;你可能想在一张图纸或其他东西上画出它们以便更容易理解。
示例:平移将从(0,0),(1,0)到(1,0),(2,0),或从(0,0),(1,0)到(0,1),(1,1);旋转将从(0,0),(1,0)到(0,0),(0,1);缩放将从(0,0),(1,0)到(0,0),(2,0)或从(0,0),(1,0)到(0,0),(0.5,0)。
使用更简单的符号,一个点(x, y)的翻译可以表示为(x + a, y + b),其中a和b是所有实数范围内的常量。旋转将是(x*cos(theta), y*sin(theta)),其中"theta"是您希望旋转的角度值,缩放将是(ax, by),其中a是沿x轴的比例因子,b是沿y轴的比例因子。(均匀缩放是两个轴具有相等比例因子的缩放,因此将是(ax, ay)。)
结合简单的变换允许您以几乎任何方式移动对象,最简单的组合简单变换的方法是使用矩阵乘法
...实际上,这种东西可能更适合您通过自学或某种数学课程来学习,因为我现在意识到,即使是开始理解这些事情也需要太多的时间,但我会给您其他参考资料。 http://en.wikipedia.org/wiki/Transformation_(geometry)
http://en.wikipedia.org/wiki/Transformation_matrix
http://en.wikipedia.org/wiki/Euclidean_vector (对您可能是必要的,也可能不是。)
无论如何,虽然你可以简单地使用在网络上找到的转换方程式,但更好的方法是学习转换实际上是如何工作的,并学会如何自己应用它们,因为这使你更加灵活,能够以不同的方式进行转换,如果需要的话,也能够进行更复杂的转换。
我希望这对你有所帮助;这可能不是你想要的直接答案,但如果你愿意花时间和精力自学(或者在某个地方上课学习[毕竟,自学并不适合每个人])如何使用矩阵和矩阵变换等,你可能会发现自己更理解你正在尝试做的事情。

编辑:当然,如果您已经定义了图形变换并且不必自己担心它们,那么在三维空间中沿任意轴平行于任何平面移动点非常容易。基本上,在内存中,点位于(或应该位于)一个“normal-ville”三维笛卡尔坐标系中。假设运动发生的平面是平面z = 0,并且点的坐标以等效于(x,y,z)的格式存储,则可以简单地使用(x + 10,y,0)或(x,y + 10,0)移动点;如果您有一个点位于比其他点更高的平面上,则只需设置更高的z值(如果您有一个点位于较低的平面上,则设置z< 0的值)。一旦将运动应用于点本身,如果您尚未这样做,则可以将图形变换应用于环境,从而为其在输出设备上进行正确显示(在您的情况下,是iPhone)。应用变换比这稍微复杂一些,但是如果您有预先编写的方法来执行此操作,那么就可以了。


4

如果你正在使用核心动画,通过正确应用3D变换,你可能很容易就能实现这一点。可以使用以下代码创建一个CATransform3D:

CATransform3D perspectiveRotation = CATransform3DMakeRotation(-40.0 * M_PI / 180.0, 0.0, 1.0, 0.0);
perspectiveRotation = CATransform3DRotate(perspectiveRotation, -55.0 * M_PI / 180.0, perspectiveRotation.m11, perspectiveRotation.m21, perspectiveRotation.m31);

然后,使用适当的属性在CALayer(或UIView的后备层)上应用该变换将使图层在3D中倾斜。该层上子图层的移动仍会在正常的笛卡尔坐标空间中发生,但您将对这些子图层具有等距透视。

需要注意的是,您可能需要手动调整变换的m34分量,以防止出现透视效果。


1
你应该计算出等角变换;也就是说,你应该有一个变换,告诉你从原始坐标开始,在等角投影中某个物体的位置在哪里。例如,等角投影可能是这样的 ((isox = x + (y / 2)), (isoy = y))(只是一个糟糕的例子)。从这个方程式中,你可以取出你的“正常”的x和y坐标,并从中计算出你的投影。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接