【问题标题】:Unity3d: How to calculate the surface area of different colors in a colored meshUnity3d:如何计算彩色网格中不同颜色的表面积
【发布时间】:2019-08-01 08:23:34
【问题描述】:

我在运行时创建了一个带有特殊共享的网格。共享具有以下属性:
1.第一次上色时颜色为蓝色
2.第二次上色时颜色为黄色
3.第三次上色时颜色为红色
4.当它被着色为第四个或更多时,颜色变为绿色

以下是彩色区域的示例:

在上图中,绿色区域有很多层。我无法通过对网格中的三角形求和来计算面积,因为有很多重叠。

编辑!我正在更新问题,提供更多信息
网格是使用以下代码生成的(它不是整个代码,足以大致了解网格是如何生成的)

for (int i = start; i<colorUntil; i++)
{
    parent.position = currentPosition;
    Vector3 relativePos = points[i + 1] - points[i];
    if (relativePos.magnitude > 0.5)
    {
        parent.rotation = Quaternion.LookRotation(relativePos);
    }

    currentPosition = points[i];
    Vector3 offset = parent.right * width / 2f;
    vertices.Add(currentPosition - offset);
    vertices.Add(currentPosition + offset);

    uvs.Add(new Vector2(0, 1));
    uvs.Add(new Vector2(1, 1));

    if (vertices.Count< 4)
    {
        return;
    }

    int c = vertices.Count;
    triangles.Add(c - 1);
    triangles.Add(c - 2);
    triangles.Add(c - 3);
    triangles.Add(c - 3);
    triangles.Add(c - 2);
    triangles.Add(c - 4);

    Vector3[] v = new Vector3[c];
    Vector2[] uv = new Vector2[c];
    int[] t = new int[triangles.Count];
    vertices.CopyTo(v, 0);
    uvs.CopyTo(uv, 0);
    triangles.CopyTo(t, 0);

    mesh.vertices = v;
    mesh.triangles = t;
    mesh.uv = uv;
}

现在我必须计算每种颜色的面积。鉴于上面的网格是否可以计算每种颜色的面积?欢迎提出任何建议。

编辑 2!
显然,没有办法使用 mash 信息计算彩色区域(至少根据我的研究)。我如何寻找一种创造性的方式来实现我想要的。我会欢迎并感谢任何建议。

【问题讨论】:

  • 您可以添加用于着色它们的代码吗?一般来说:遍历MeshFilter.mesh -> Mesh.trinagles,计算每个triangles area并将相应的区域相加
  • 如果您可以访问网格,那么您可以访问三角形吗?你知道每个三角形的颜色吗?如果是,就循环遍历它们。
  • 哦,好吧..您应该使用该信息更新问题,因为尚不清楚这是关于重叠网格的。再说一遍:您问题中的图像是如何生成的?首先是什么负责为网格着色?
  • 你也看到this了吗?您是否尝试过我们之前提到的任何事情?
  • 恕我直言,由于区域不规则,几乎不可能获得准确的结果,如果近似结果还可以,您可以将此场景渲染为大纹理,然后计算绿色像素。

标签: c# unity3d shader


【解决方案1】:

一个简单的脚本来截取屏幕然后计算绿色像素。

将脚本放在渲染相机上,将m_TakeScreenshot设置为true,它将在当前帧中工作。

public class ScreenshotCamera : MonoBehaviour
{
    public bool m_TakeScreenshot;
    public Texture2D m_OutputTexture;

    void OnPostRender()
    {
        if (m_TakeScreenshot)
        {
            m_TakeScreenshot = false;

            //Take screenshot
            if (m_OutputTexture == null)
                m_OutputTexture = new Texture2D(Screen.width, Screen.height);
            m_OutputTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
            m_OutputTexture.Apply();

            //Get all pixels, count green pixels
            var pixels = m_OutputTexture.GetPixels(0, 0, m_OutputTexture.width, m_OutputTexture.height);
            int greenPixels = 0, otherPixels = 0;
            foreach (var color in pixels)
            {
                //green
                if (color.g > 0.8f && color.r < 0.1f && color.b < 0.1f)
                    greenPixels++;
                //not black
                else if (color.r > 0.1f || color.g > 0.1f || color.b > 0.1f)
                    otherPixels++;
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我将只取一组绿色顶点,计算其 Delaunay 三角剖分,然后找到其面积。或者,为了获得更精确的结果 - 计算凹壳轮廓而不是 Delaunay,然后使用this pretty formula 计算任意多边形的面积。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多