【问题标题】:Unity Mesh Renderer generating polygons on the wrong sideUnity Mesh Renderer 在错误的一侧生成多边形
【发布时间】:2020-02-24 10:55:49
【问题描述】:

所以我需要使用具有 n 个顶点的 Unity Mesh 组件生成一个多边形。我正在使用一个自定义的 Triangulate() 函数,该函数能够找到 mesh.triangles 的索引。

问题在于,根据我为该函数提供的顶点,多边形在错误的一侧生成,有时相机看不到(除非我将相机翻转到另一侧)。

现在我知道这与 Unity 的顺时针缠绕顺序有关,但我如何确保多边形始终在正确的一侧生成,无论我提供的顶点是什么?或者有没有办法知道网格在哪一侧生成,以便我可以相应地调整相机?

The Triangulator function I use

【问题讨论】:

  • 您是否尝试过将for (int i=0; i<vertices.Length; i++) { 更改为for (int i=vertices.Length-1; i>=0; i--) { 时会发生什么?代码有点乱,所以我只是即兴创作(以相反的方式构建网格)
  • 最终我的第二个即兴创作是将 Snip 函数执行下添加的 a、b、c 更改为 c、b、a 即 indices.Add(c); indices.Add(b); indices.Add(a);
  • 谢谢,但代码的问题是有时它使用特定的顺序,有时它会切换它,所以我相信只是反转操作仍然不能让它 100% 的工作
  • 问题的屏幕截图可能有用
  • 我最终使用了两个不同的网格,它们的 mesh.triangles 数组颠倒了,所以当一个不可见时,另一个是。我知道这不是最好的解决方案,但它现在是一个很好的补丁

标签: c# unity3d mesh


【解决方案1】:

这是三角形的法线向量n

三角形的可见性基于其法线。计算撞击三角形、反射并进入您的眼睛(Unity 相机)的光线的数学使用三角形的法线。基本上,如果该向量 n 指向您的眼睛,则意味着您可以看到照射到该表面的 [部分] 光。

要知道你是否能看到三角形,你需要知道法线是否指向你。没有进一步的数学,通过计算三角形顶点定义的向量的叉积来给出法线。

例如,三角形 A-B-C 可以由向量 AB 和 BC 定义(与上图无关)。或者您可以反转这个三角形的“方向”并将其定义为 AC 和 CB。 AB/BC 的法线有一个方向,而 AC/CB 的法线有相反的方向,因为......数学 - 如果你用谷歌搜索这些东西,你可以知道为什么,有很多教程。

所以我写了所有这些来告诉你已经知道的事情:顶点的顺序定义了可见性。但那是因为它定义了法线的方向。现在看看这段代码:

        var a = new Vector3(0f, 0f, 0f);
        var b = new Vector3(0.5f, 0.5f, 0f);
        var c = new Vector3(0f, 1f, 0f);

        var ab = b - a;
        var bc = c - b;
        Debug.Log(Vector3.Cross(ab, bc)); // this prints (0.0, 0.0, 0.5)

        var ac = c - a;
        var cb = b - c;
        Debug.Log(Vector3.Cross(ac, cb)); // this prints (0.0, 0.0, -0.5)

请注意,在第二种情况下,z 是负数,因此它指向您(您的相机可能设置为 (0, 0, -10) 或类似的值)。因此,如果您以这种方式定义三角形,您将能够看到它。

长话短说:要知道是否可以看到三角形,请测试顶点叉积的 z 分量的信号。如果结果不是您想要的信号,请反转顶点。

我没有从您的三角函数中读取代码,但我看到它使用的是 2D。这意味着它可能可以进一步简化。它似乎也在计算InsideTriangle() 中的叉积,因此您可能可以使用那里已经进行的计算来检查信号,而性能损失[几乎]为零。

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 2014-04-05
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多