二维坐标系中的等距投影

时间:2009-07-27 18:33:29

标签: iphone math traversal isometric

在二维空间中的等距平面上移动一个点需要什么方程?

我在管上看了好几个地方。 Mostly here.我无法破译它。不幸的是,我不是数学专业。

我需要做的是在由10px块组成的等距平面上将点从(0,0)移动到(1,0)或(0,1)。在normal-ville中,我只会(x + 10,y + 0)或(x + 0,y + 10)在我的2d平面上移动自己。

如果能提供更好的上下文,我会在iPhone上的Core Animation中完成大部分工作。

感谢您的时间。

DP

3 个答案:

答案 0 :(得分: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”是您希望旋转的角度值,并且刻度将是(a x,b y),a是沿x轴的比例因子,b是沿y轴的比例因子。 (统一尺度是两个轴具有相等比例因子的尺度,因此(a x,a y)。(

组合简单变换允许您根据需要移动对象,并且使用matrix multiplication组合简单变换的最简单方法是使用。{/ p>

......实际上,通过自学或某种数学课,你可能会更好地学习这类东西,因为我现在意识到,即使你开始,我自己也会花费太多关于实际了解这些事情,但我会告诉你我现在能找到的其他参考资料。

http://en.wikipedia.org/wiki/Transformation_(geometry)
http://en.wikipedia.org/wiki/Transformation_matrix
http://en.wikipedia.org/wiki/Euclidean_vector(可能不适合你,可能不是。)

无论如何......当你可以简单地使用你在网上某个地方找到的转换方程式时,了解转换实际上是如何工作并学习如何自己应用它们要好得多,因为它允许你更灵活,能够以不同的方式进行变换,如果需要,还可以让你自己做更复杂的变换。

我希望这对你有所帮助;它可能不是你可能想要的直接答案,但是如果你愿意投入时间和精力来自学(或者被教导,如果你决定去某个地方上课[毕竟,自我教学不是“对每个人来说都是如此”)如何使用矩阵和矩阵变换等,你可能会发现自己正在理解你想要做的更多。

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

答案 1 :(得分:4)

如果您正在使用Core Animation,您可以通过正确应用三维变换轻松完成此操作。使用如下代码创建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的背衬层)上使用适当的属性应用该转换将使图层以3-D倾斜。子层在该层上的移动仍将发生在正常的笛卡尔坐标空间中,但您将在这些子层上有等距视角。

作为警告,您可能需要手动调整变换的m34组件以防止发生透视效果。

答案 2 :(得分:1)

你应该计算你的等距变换;也就是说,你应该有一个变换,告诉你从原始坐标,等轴测投影上的东西。例如,等角投影可能类似于((isox = x +(y / 2)),(isoy = y))(只是一个蹩脚的例子)。从这个等式中,你可以得到你的“normal-ville”x和y坐标,并从中得出你的预测。