相对缩放3D空间中的对象集合

时间:2012-01-09 14:47:29

标签: algorithm math 3d scale transformation

鉴于在特定地层中空间排列的一组3D模型,如何在保持彼此之间的相对距离的同时缩放它们?

例证:我有10个网格。其中六个被安排形成一个封闭的方形房间。其余4件是放置在其内部适当位置的家具。所有网格的比例均为1.0。我希望将它增加到2.0。

3 个答案:

答案 0 :(得分:5)

我不是数学家,所以我将使用最基本的术语,我知道如何解释这个过程。您甚至可能会发现我使用的术语的简单性比数学“行话”更容易理解

你需要使用地层中所有物体的名义中心点来确定精确的形成中心(当然,这将是一个由X,Y和Z值组成的3D矢量)...

对象总数 =“阵型”中的对象总数

  • 循环通过地层中的所有物体
    • 对于每个对象(计算 Axis Total
      • 将X坐标添加到一起(给我们 Axis Total X
      • 将Y坐标加在一起(给我们 Axis Total Y
      • 将Z坐标加在一起(给我们 Axis Total Z
    • 对于每个轴总计 (计算形成中心
      • 形成中心X = 轴总计X 除以对象总数
      • 形成中心Y = 轴总计Y 除以对象总数
      • 形成中心Z = 轴总计Z 除以对象总数

您现在拥有的三个值构成阵型中心(作为3D矢量)。

注意如果您根据3D空间中的预定义固定点(例如0,0,0)排列对象,则无需执行上述操作计算,因为你的形成中心将是那个固定点。

  • 表示每个对象
    • 计算<轴的距离距离X 距离Y 距离Z )<来自形成中心的相应轴的em>对象中心 ...
      • 距离X = 形成中心X - 对象位置X
      • 距离Y = 形成中心Y - 对象位置Y
      • 距离Z = 形成中心Z - 对象位置Z
    • 按所需的比例因子
    • 缩放对象
    • 将X,Y和Z 位置值设置为当前值加上同一轴的距离值乘以比例...
      • 位置X = 位置X +(距离X * 比例因子
      • 位置Y = 位置Y +(距离Y * 比例因子
      • 位置Z = 位置Z +(距离Z * 比例因子

如果您已正确完成此操作,您的对象现在已经缩放,仍保留其形成,但相对于形成中心比例因子已移动。简单地说:这些对象之间的遮挡不再发生,因为它们的 Positions Dimensions 一起缩放。

答案 1 :(得分:1)

如果我的问题是正确的,你必须选择缩放动作的中心c,然后获得相对于该中心的对象位置(让我们调用其中一个相对向量v)。现在按一个因子(例如v = v *因子)对这些向量进行缩放,并将对象移动到它们的新位置。 (position = c + v) 之后,只需将自己的位置缩放为自己的位置作为缩放中心。

答案 2 :(得分:1)

要真正回答这个问题,我们仍然需要更多关于数据格式以及如何应用转换的信息。但这是一个猜测: 您的对象很可能表示为多边形的集合,这些多边形本身表示为相对于某些“根点”的点集合,例如对象的中心或底角。当您将对象放置在某个位置(如房间)时,可以通过对表示对象的点应用一系列矩阵乘法来实现。单个矩阵乘法通常可以完成整个变换,但如果我们编写一系列直观的变换,对我们来说更有意义。例如,您通常会

  1. 将对象缩放为您想要的尺寸。
  2. 以您想要的方式旋转对象。
  3. 将对象翻译到您想要的位置。
  4. 所有这些转换都是相对于对象的“根点”发生的,它们的顺序有很大的不同。如果您平移然后缩放或旋转,则相对于新转换的中心将进行缩放和旋转。

    因此,如果您在房间中放置了物体,并且坐标系的 [0,0,0] 恰好位于房间的中心,那么如果您缩放所有变形这些物体的点,它们都会从 [0,0,0] 增长/缩小并向外/向内推动。由于这不是你想要的,你必须首先通过翻译对象来改变原点,然后缩放,然后将原点改回原来的位置。

    如果我有两点: [3,0,0] [4,0,0] ,我想缩放它们以便它们之间的距离是 2 而不是 1 ,如果我只是乘以(比例) 2 ,我得 [6,0,0] < / strong>和 [8,0,0] 。现在它们之间的距离 2 ,但它们都移动了。如果我希望第一点保持不变,那么我首先翻译 [ - 3,0,0] ,然后我按 2 进行缩放,然后我翻译为 [3,0,0] 我有我想要的东西。相反,如果我希望这两个点的中心保持不变,那么我将翻译为 [(+/-)3.5,0,0]

    决定对象的哪些点不应移动。然后在缩放之前将该点移动到原点。然后你将它移回去。由于你不希望你的物体穿过地板,你可能会在地面上(或者它们所附着的任何表面)选择一个点。如果您有一个物体放在另一个物体上(书桌上的书),那么这些物体应该使用相同的参考点。