为什么四边形的顶点和四边形的localScale在Unity中不匹配?

时间:2018-03-17 08:20:57

标签: unity3d

我有一个四边形,它的顶点是我这样打印的:

public MeshFilter quadMeshFilter;
for(var vertex in quadMeshFilter.mesh.vertices)
{
  print(vertex);
}

localScale就像这样:

public GameObject quad;
print(quad.transform.localScale);

顶点是这样的:

(-0.5, -0.5), (0.5, 0.5), (0.5, -0.5), (-0.5, 0.5)

localScale是:

(6.4, 4.8, 0)

这怎么可能 - 因为顶点构成squarelocalScale没有。

如何使用顶点并在四边形前面绘制另一个正方形?

2 个答案:

答案 0 :(得分:2)

我不熟悉网格问题,但我相信我知道这个问题的答案。

<强>答案

  

这怎么可能

缩放是网格在给定方向(x,y,z)上乘以大小的值。标度为1是默认大小。 2的比例是双倍大小,依此类推。然后,您的localSpace坐标将乘以此比例。

假设localSpace坐标为(1,0,2),但比例为(3,1,3)。意味着结果是(1 * 3,0 * 1,2 * 3)。

  

如何使用顶点并在四边形前面绘制另一个正方形?

我个人只是创建对象,然后通过Unity的Transform系统移动它。因为它允许您使用transform.position = new Vector3(1f, 5.4f, 3f);

更改worldSpace坐标

您也可以在WorldSpace中移动每个顶点,但我之前没有尝试过。

我认为它与这段代码有关:vertices[i] = transform.TransformPoint(vertices[i]);因为TransformPoint会根据使用它的Transform将localSpace转换为worldSpace。

<强>精化

为什么我的空间坐标中有很多0和5,尽管他们在世界上有其他位置?

如果我使用下面的脚本打印四边形的顶点。我得到这些结果,它们有3个坐标,可以通过localScale加倍。

打印结果:

Quad vertices

脚本:

Mesh mesh = GetComponent<MeshFilter>().mesh;
var vertices = mesh.vertices;
Debug.Log("Local Space.");
foreach (var v in vertices)
{
   Debug.Log(v);
}

第一个结果就是我们所说的本地空间。

还存在一种名为WorldSpace的东西。您可以在local-和worldSpace之间进行转换。

localSpace是与对象本身相关的对象网格顶点,而worldSpace是Unity场景中的对象位置。

然后你得到如下所示的结果,首先是localSpace坐标,如第一张图片,然后是从这些本地坐标转换的WorldSpace坐标。

world- and localSpace vertices of quad

以下是我用来打印上述结果的脚本。

Mesh mesh = GetComponent<MeshFilter>().mesh;
var vertices = mesh.vertices;
Debug.Log("Local Space.");
foreach (var v in vertices)
{
    Debug.Log(v);
}
Debug.Log("World Space");
for (int i = 0; i < vertices.Length; ++i)
{
    vertices[i] = transform.TransformPoint(vertices[i]);
    Debug.Log(vertices[i]);
}

祝你未来的学习过程顺利。

答案 1 :(得分:2)

一旦了解了Transform层次结构的工作原理,这一点就变得清晰了。它是一个树,其中父变换[3x3]矩阵(位置,旋转,缩放(旋转实际上是一个四元数,但为了简单起见,我们假设它的euler,以便数学运作)。通过这种哲学的扩展,网格本身可以看作孩子到持有它的gameoobject。

如果你想象一个1x1四边形(这是你的顶点所描述的),一个游戏对象的父级,并且该游戏对象的变换有一个非局部的尺度,网格中的所有顶点都会乘以该值,并且所有这些职位已被添加。

现在,如果您将该对象表示为另一个gameObject,并为其提供另一个localScale,则会再次将所有顶点位置乘以该比例,并按其位置等进行转换。

回答你的问题 - 你的顶点的全局位置与源网格中包含的位置不同,因为它们通过一连串的变换一直到场景根目录。

这也是我们只有localScale而不是缩放的原因,这也是为什么包含旋转子节点的对象的非均匀缩放有时会产生非常奇怪的结果的原因。转换堆栈。