在网络中绘制点的影响力

时间:2015-08-28 15:16:35

标签: unity3d

我遇到了一个有点烦人的问题,如果不知道正确的词汇,很难解释,但下面两张图片应该解释我在寻找什么。

我有一个连接点网络。每个点都有一个颜色属性。

Dot Network

网络中的每个点代表一个位置,由于缺少更好的术语,该位置由相应的颜色“拥有”。我现在想通过生成类似于此的东西来正确地展示每个拥有点对其附近的影响,即颜色“领土”:

Colored Dot Network

我无法看到一个简单的解决方案。我能看到的最可能的解决方案是生成一个平面,将每个点的信息传递给适当的着色器,并使用它来计算平面的纹理。然而,与此示例不同,不仅有10个点,而且可能介于1000-2000之间。

提出一些更具体的问题:

1)着色器可以处理点数(1000+)吗?

2)我不确定着色器必须具有哪种算法才能获得正确的结果。迭代所有点并将它们与所有剩余的点进行比较并产生某种重量似乎是次优的。我的背景是物理学,第一直觉是产生类似于Wigner-seitz细胞的东西。 (我会提供一个图片链接来解释我的意思,但似乎我只能用新帐户发布2个链接。但是快速谷歌图片搜索应该有很多好的结果)

3)最明显的一个问题:我缺少一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:1)

这是我要做的,创建一个包含所有点及其位置的数组,让我们谈谈这个,就像你将在全屏统一运行它,然后创建一个新的数组,保持所有点的位置,但不是我们希望以像素为单位的世界位置。现在这是代码中的那部分:

Transform[] dots;
Vector3[] position; //Vector2 is more appropriate because of 2D space but most of the Unity functions support only Vector3

void Awake(){
    for(int i =0; i < dots.Length; i++)
        position[i] = Camera.main.WorldToScreenPoint(dots[i].position);
}

现在我们在屏幕上有所有点的位置,接下来就是创建实际纹理。

Texture2D outTex = new Texture2D (Screen.height, Screen.width, TextureFormat.RGB24, false);

现在我们应该迭代这个纹理上的每个像素并创建特定的公式来确定该像素应该是什么颜色。

添加另一个Color32类型的数组变量,它将为每个点定义颜色(由谁“拥有”)。

int h = outTex.height;
int w = outTex.width;
for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) {
        //Formula for determining color is right here, here is my suggestion 
        //(the most simplest one), check the color of each dot and based on the distance 
        //between this pixel and dot's position determine how much influence that dot
        //has on this pixel, here is how it goes
        float red = 0;
        float green = 0;
        float blue = 0;
        float divider = 0;
        for(int c = 0; c < dots.Length; c++){
            float curDist = Vector3.Distance(dots[c].position, new Vector3(j, i ,0);
            curDist = 1f/(curDist+1f);
            red += dotColors[c].r * curDist;
            green += dotColors[c].g * curDist;
            blue += dotColors[c].b * curDist;
            divider++;
        }
        outTex.SetPixel (j , i, new Color32(red/divider, green/divider, blue/divider, 255);    
    }
outTex.Apply();

最后一部分是添加一些具有整个屏幕大小的精灵并将此纹理应用于它。

所有这一切只是为了让你基本了解你将如何解决它,所有这些代码都是未经测试的,因此你会在其中发现一些错误,但我将这项工作交给你。如果您发现任何问题在这里发表评论并且我会回复,我非常愿意帮助您,因为您介绍了一个有趣的问题。这一切都让我想起用它前面的不同颜色的光源渲染白色2D纹理(这是你的点),所以试着在网上找到人们如何为2D光渲染编写脚本,你会发现一些有趣和有用的东西那里。