这就是我要做的,创建一个所有点的数组和它们的位置,让我们来谈谈这个问题,就像你将以统一的全屏模式运行它,然后创建一个新的数组来保存所有点的位置,我们希望以像素为单位的世界位置。现在代码如下:
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();
最后一部分会添加一些精灵,它具有整个屏幕的大小并将其应用到它。
所有这些只是给你一个基本的想法,你将如何去解决它,所有这些代码没有经过测试,所以你会prolly发现它的一些错误,但我把这个工作留给你。如果您在这里发现任何问题并发表评论,我会回复,因为您提出了一个有趣的问题,我非常乐意帮助您。这让我想起使用不同颜色的光源渲染白色2D纹理(这是你的点),所以试着在网上找到人们如何编写2D光渲染的脚本,你会prolly找到一些有趣和有用的东西那里。
点是否会移动或改变其影响范围?如果不是,则可以更高效地为每个点生成一个相对于其直接相邻点的影响多边形,并根据需要更新每个多边形的颜色。 – rutter
@rutter他们不会相对于彼此移动,他们的关系也不会改变。每个点生成一个多边形不是我以前考虑过的。虽然回想起来,我对Wigner-seitz细胞的第一本能就是这样,所以也许它有优点 –