C# Unity3d:如何计算彩色网格中不同颜色的表面积
我在运行时创建了一个网格,并使用一个特殊的共享。共享文件具有以下属性:C# Unity3d:如何计算彩色网格中不同颜色的表面积,c#,unity3d,shader,C#,Unity3d,Shader,我在运行时创建了一个网格,并使用一个特殊的共享。共享文件具有以下属性: 1.第一次上色时,颜色为蓝色 2.第二次着色时,颜色为黄色 3.第三次着色时,颜色为红色 4.当第四次或更多次着色时,颜色变为绿色 下面是一个彩色区域的示例: 在上图中,绿色区域有许多糖浆层。我无法通过对网格中的三角形求和来计算面积,因为存在许多重叠。 编辑我正在用更多信息更新问题 网格是使用以下代码生成的(这不是完整的代码,它足以给出如何生成网格的一般概念) for(int i=start;i 0.5) { parent
1.第一次上色时,颜色为蓝色
2.第二次着色时,颜色为黄色
3.第三次着色时,颜色为红色
4.当第四次或更多次着色时,颜色变为绿色
下面是一个彩色区域的示例:
在上图中,绿色区域有许多糖浆层。我无法通过对网格中的三角形求和来计算面积,因为存在许多重叠。
编辑我正在用更多信息更新问题
网格是使用以下代码生成的(这不是完整的代码,它足以给出如何生成网格的一般概念)
for(int i=start;i 0.5)
{
parent.rotation=Quaternion.LookRotation(relativePos);
}
当前位置=点[i];
Vector3偏移=父级。右*宽度/2f;
顶点。添加(当前位置-偏移);
顶点。添加(当前位置+偏移);
添加(新向量2(0,1));
添加(新矢量2(1,1));
如果(顶点数<4)
{
返回;
}
int c=顶点数;
三角形。添加(c-1);
三角形。添加(c-2);
三角形。添加(c-3);
三角形。添加(c-3);
三角形。添加(c-2);
三角形。添加(c-4);
Vector3[]v=新的Vector3[c];
Vector2[]uv=新Vector2[c];
int[]t=新的int[triangles.Count];
顶点。复制到(v,0);
uvs.CopyTo(uv,0);
三角形。CopyTo(t,0);
网格顶点=v;
mesh.triangles=t;
网格uv=uv;
}
现在我要计算每种颜色的面积。给定上述网格,是否可以计算每种颜色的面积?欢迎提出任何建议
编辑2显然,没有办法使用mash信息计算彩色区域(至少根据我的研究)。我是如何寻找一种创造性的方式来实现我想要的。我欢迎并感谢任何建议 我只取一组绿色顶点,计算它的Delaunay三角剖分,然后找到它的面积。或者,为了得到更精确的结果-计算凹面外壳的轮廓,而不是Delaunay,然后使用任意多边形的面积。一个简单的脚本来截图,然后计算绿色像素 将脚本放在渲染摄影机上,将
m_TakeScreenshot
设置为true,它将在当前帧中工作
公共类截屏摄像机:单一行为
{
公共图书馆m_截图;
公共纹理2D m_输出纹理;
void OnPostRender()
{
如果(m_截图)
{
m_TakeScreenshot=错误;
//截图
if(m_OutputTexture==null)
m_OutputTexture=新纹理2d(屏幕宽度、屏幕高度);
m_OutputTexture.ReadPixels(新的矩形(0,0,Screen.width,Screen.height),0,0);
m_OutputTexture.Apply();
//获取所有像素,计算绿色像素
var pixels=m_OutputTexture.GetPixels(0,0,m_OutputTexture.width,m_OutputTexture.height);
int绿色像素=0,其他像素=0;
foreach(以像素为单位的颜色变量)
{
//绿色的
if(color.g>0.8f&&color.r<0.1f&&color.b<0.1f)
绿色像素++;
//不黑
else if(color.r>0.1f | | color.g>0.1f | | color.b>0.1f)
其他像素++;
}
}
}
}
能否添加用于着色的代码?一般情况下:运行->,计算每一个并将相应的面积相加如果您可以访问网格,那么您可以访问三角形?你知道每个通道的颜色吗?如果是的话,就把它们循环一下。。你应该用这些信息更新这个问题,因为现在还不清楚这是关于重叠网格的。再说一遍:问题中的图像是如何生成的?首先是什么使网格着色?你也看到了吗?你尝试过我们之前提到的任何事情吗?嗯,由于区域不规则,几乎不可能获得准确的结果,如果近似结果正常,你可以将此场景渲染为大纹理,然后计算绿色像素。
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;
}