用等距顶点制作一个球体
为了检查碰撞的目的,我试图做一个球形的射线爆发,但是根据每个射线在什么地方或什么地方击中了具体的相互作用。 因此,我为什么使用光线,而不是像OverlapSphere
这样简单的东西。
我正在寻找如何制作一个球体的原因是因为我可以对我的光线使用相同的math,让它们到达球体所在的顶点。 但是我所能find的制造球体的方法都是靠近极点,这很有意义,因为它很容易做到。 但是,正如你可以想象的那样,它对我目前的项目没有什么用处。
TL; DR:如何制作等距顶点的球体? 如果它不是完全等距的话,它只需要非常接近。 如果发生这种情况,那么如果可以给出多less区别,以及在哪里适用,那将是非常好的。
额外的笔记:我已经看过这个和这个 ,但math已经超出了我的头,所以我一直在寻找的东西可能会一直在我面前凝视着我。
你是否知道Unity提供给你的范围实际上是devise的
在这个确切的目标?
也就是说,统一的球体的整个存在的理由是,这些点是相当平滑的空间……大体上是等距的,就像你说的那样。
要在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性能的东西是绝对不可思议的。
我希望这使事情变得更容易!
你可以使用icosphere。 由于顶点分布在等边三angular形上,所以顶点保证是等距的。
为了构造icosphere,首先你要制作一个二十面体,然后按照本文所述在较小的三angular形中recursion地分割面。
- 将球体切成N个圈
- 计算它的周长
- 将其与创build切片的相同angular度分开
- 这给你的顶点数量
- 也是圈内的angular步
- 投射光线
这是我如何在C ++ + OpenGL编码:
// draw unit sphere points (r=1 center=(0,0,0)) ... your rays directions int ia,na,ib,nb; double x,y,z,r; double a,b,da,db; na=16; // number of slices da=M_PI/double(na-1); // latitude angle step for (a=-0.5*M_PI,ia=0;ia<na;ia++,a+=da) // slice sphere to circles in xy planes { r=cos(a); // radius of actual circle in xy plane z=sin(a); // height of actual circle in xy plane nb=ceil(2.0*M_PI*r/da); db=2.0*M_PI/double(nb); // longitude angle step if ((ia==0)||(ia==na-1)) { nb=1; db=0.0; } // handle edge cases for (b=0.0,ib=0;ib<nb;ib++,b+=db) // cut circle to vertexes { x=r*cos(b); // compute x,y of vertex y=r*sin(b); // this just draw the ray direction (x,y,z) as line in OpenGL // so you can ignore this // instead add the ray cast of yours double w=1.2; glBegin(GL_LINES); glColor3f(1.0,1.0,1.0); glVertex3d(x,y,z); glColor3f(0.0,0.0,0.0); glVertex3d(w*x,w*y,w*z); glEnd(); } }
这是它的样子:
- R,G,B线是球坐标系轴X,Y,Z
- 白线是你的顶点(白色)+方向(灰色)
[笔记]
- 不要忘记包含math.h
- 并用你的代替OpenGL的东西
如果你想要4,6,8,12或20个顶点,那么你可以有完全等距的顶点作为柏拉图的实体 ,它们都适合在一个球体内。 这些的实际坐标应该很容易得到。 对于其他数量的顶点,您可以使用其他多面体并缩放这些顶点,使它们位于一个球体上。 如果你需要很多分数,那么测地圆顶可能是一个很好的基础。 C60 巴基球可以是一个很好的基础,60分。 对于其中的大多数,您应该能够find可以从中提取坐标的3D模型。
我认为控制球体上点的最简单方法是使用球坐标 。 然后,您可以使用两个angular度(ρ和φ)和半径来控制球体周围点的位置。
围绕旋转球体均匀填充点的示例代码(为了好玩):
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 }
正如一些答案已经build议,使用基于二十面体的解决scheme。 这个源代码很容易(我自己写了几次),但是我发现在许多其他情况下,优秀的Primitives Pro插件非常方便,并且始终使用他们的球体而不是内置的Unity。
链接到基元Pro组件
Primitives Pro选项