c# - unity - 用等距顶点制作一个球体




unity quad (4)

为了检查碰撞的目的,我试图做一个球形的射线爆发,但是根据什么或每个射线的位置发生特定的相互作用。 因此,我为什么使用光线,而不是像OverlapSphere这样简单的东西。

我正在寻找如何制作一个球体的原因是因为我可以对我的光线使用相同的数学,让它们到达球体所在的顶点。 但是我所能找到的制造球体的方法都是靠近极点,这很有意义,因为它很容易做到。 但是,正如你可以想象的那样,它对我目前的项目没有什么用处。

TL; DR:如何制作等距顶点的球体? 如果它不是完全等距的话,它只需要非常接近。 如果发生这种情况,那么如果可以给出多少区别,以及在哪里适用,那将是非常好的。

额外的笔记:我已经看过这个这个 ,但数学已经超出了我的头,所以我一直在寻找的东西可能会一直在我面前凝视着我。

https://code.i-harness.com


如果你想要4,6,8,12或20个顶点,那么你可以有完全等距的顶点作为柏拉图立体 ,它们都适合在一个球体内。 这些的实际坐标应该很容易得到。 对于其他数量的顶点,您可以使用其他多面体并缩放这些顶点,使它们位于一个球体上。 如果你需要很多分数,那么测地圆顶可能是一个很好的基础。 C60 巴基球可以是一个很好的基础,60分。 对于其中的大多数,您应该能够找到可以从中提取坐标的3D模型。


我认为控制球体上点的最简单方法是使用球面坐标 。 然后,您可以使用两个角度(ρ和φ)和半径来控制球体周围点的位置。

围绕旋转球体均匀填充点的示例代码(为了好玩):

var time = 1; // Increment this variable every frame to see the rotation
var count = 1000;
for (int i = 0; i < count; i++)
{
    var rho = time + i; 
    var phi = 2 * Math.PI * i / count;
    var x = (float)(radius * Math.Sin(phi) * Math.Cos(rho));
    var z = (float)(radius * Math.Sin(phi) * Math.Sin(rho));
    var y = (float)(radius * Math.Cos(phi));
    Draw(x, y, z); // your drawing code for rendering the point
}

你可以使用icosphere。 由于顶点分布在等边三角形上,所以顶点保证是等距的。

为了构造icosphere,首先你要制作一个二十面体,然后按照本文所述的方法递归地分割小三角形。


你知道Unity给你的球实际上是设计的吗?

在这个确切的目标?

也就是说,统一的球体的整个存在的理由是,这些点是相当顺利的空间......大体上是等距的,就像你说的那样。

要在Unity中培养这样一个领域,只需要做到这一点:

正如你所知道的那样,你可以即刻访问vert

Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vv = mesh.vertices;
int kVerts=vv.Length
for (int i=0; i<kVerts; ++i)
  Debug.Log ... vv[i] 

请注意,您可以通过(例如)检查他们与“城市”(或其他)的距离来检查“球体的哪个部分”,或者只是检查(例如)z值以查看它们是哪个半球等等。

此外...

请注意。 关于你想要这样做的总体原因:

但是基于每个射线击中什么或哪里发生具体的相互作用

请注意,使用PhysX来做这件事情并不容易。 (Unity中完全内置的游戏物理学)。事实上,我从来没有根据“它碰到哪里”,而没有做一些“具体”的事情来看碰撞。

您可以例如获取与http://docs.unity3d.com/ScriptReference/RaycastHit-point.html的联系点

值得注意的是,在休闲编程中可以写出接近PhysX性能的东西是绝对不可思议的。

我希望这使事情变得更容易!





geometry