【问题标题】:Isometric projection in 2d coordinate system二维坐标系中的等距投影
【发布时间】:2010-11-14 11:02:21
【问题描述】:

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

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

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

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

感谢您的宝贵时间。

DP

【问题讨论】:

    标签: iphone math traversal isometric


    【解决方案1】:

    嗯,如果你打算做更多的图形游戏编程,我建议你至少瞄准数学辅修。

    真的,不过,如果您确实继续做这样的图形工作,那么学习三角学、矩阵代数和向量代数的知识将是一个非常好的主意。使用向量和矩阵可以更轻松地进行更复杂的变换(例如透视投影),并且还可以帮助进行更简单的变换,例如等距变换。

    无论如何(其中一些,如果不是很多,可能会为您复习):实际上,所谓的“图形变换”所做的是通过平移、旋转的某种组合对点进行字面变换、尺度、反射和剪切;对于二维坐标系,这些概念中的大多数你应该很熟悉,并且可以相当简单地表达出来。在以下示例中,我将使用由两点定义的线段,以“(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, b em>y),其中 a 是沿 x 轴的比例因子,b 是沿 y 轴的比例因子。 (统一比例是两个轴的比例因子相等的比例,(ax, ay) 也是如此。)

    组合简单的变换允许您随意移动对象,组合简单变换的最简单方法是使用matrix multiplication

    ...实际上,这种事情你可能最好通过自学或某种数学课来学习,因为我现在意识到我自己甚至要开始学习你都需要太多的时间开始真正理解这些东西,但我会给你我现在能找到的其他参考资料。

    http://en.wikipedia.org/wiki/Transformation_(geometry)
    http://en.wikipedia.org/wiki/Transformation_matrix
    http://en.wikipedia.org/wiki/Euclidean_vector(你可能需要,也可能不需要。)

    无论如何...虽然您可以简单地使用您在网络上某处找到的变换方程,但最好了解变换的实际工作原理并学习如何自己应用它们,因为它允许您更灵活,能够根据需要以不同的方式进行转换,并让您自己进行更复杂的转换。

    我希望这对您有所帮助;这可能不是您可能想要的直接答案,但如果您愿意投入时间和精力自学(或被教导,如果您决定在某个地方上课[毕竟,自学是'不适合所有人])如何使用矩阵和矩阵变换等,您可能会发现自己更了解您正在尝试做的事情。

    编辑:当然,如果您已经定义了图形变换并且不必自己担心它们,那么在 3D 空间中平行于任何轴的任何平面上移动一个点是非常容易的。基本上,在内存中,这些点位于(或应该位于)“正常维尔”中,用你的话来说,是三维笛卡尔坐标系。假设发生移动的平面是平面 z = 0,并且点的坐标以等价于 (x, y, z) 的格式存储,您可以简单地使用 (x + 10, y, 0) 或 (x, y + 10, 0);如果你有一个点比其他点在更高的平面上,你只需为 z 设置一个更高的值(如果你在更低的平面上有一个点,你设置一个 z

    【讨论】:

      【解决方案2】:

      如果您正在使用 Core Animation,则可以通过正确应用 3-D 变换轻松完成此操作。使用如下代码创建 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 组件以防止发生透视效果。

      【讨论】:

        【解决方案3】:

        你应该计算出你的等距变换;也就是说,你应该有一个变换,它告诉你从原始坐标,什么东西在等轴测投影上。例如,等距投影可能类似于 ((isox = x + (y / 2)), (isoy = y)) (只是一个糟糕的例子)。从这个等式中,您可以获取“正常维尔” x 和 y 坐标,并从中计算出您的投影。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多