Сделать сферу с равноудаленными вершинами
Я пытаюсь сделать сферический всплеск лучей с целью проверки столкновения, но конкретные взаимодействия происходят на основе того, что или где каждый луч попал. Поэтому я использую лучи, а не что-то более простое, например OverlapSphere
.
TL; DR: Как сделать сферу с равноудаленными вершинами? Если это не отлично эквидистантный его штраф,он просто должен довольно близко. Если это произойдет, было бы здорово, если бы вы могли дать, насколько разница будет и где, если это применимо.
дополнительные примечания: Я смотрел на этой и этой, но математика путь
6 ответов
вы знаете, что сфера дано вам единством на самом деле предназначены
С этой целью в виду?
т. е. весь смысл существования сферы, встроенной в единство, заключается в том, что точки являются довольно гладким пространством ...... примерно на равном расстоянии, как вы выразились.
чтобы поднять такую сферу в единстве, просто сделайте это:
затем вы можете мгновенно получить доступ к verts, как вы знаете
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. Поскольку вершины распределены на равносторонних треугольниках, ваши вершины гарантированно будут равноудаленными.
чтобы построить икосферу, сначала вы делаете икосаэдр, а затем разделяете грани рекурсивно на меньшие треугольники, как объясняется в этом статьи.
- нарежьте сферу на N кругов
- вычислить периметр
- разделите его на тот же угол, который создает срез
- это дает вам количество вершин
- а также угловой шаг внутри круга
- лучи
вот как я закодировал его в 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
- белые линии - это ваши вершины (Белый) + направление (серый)
[Примечания]
- Не забудьте включить математику.h
- и замените материал OpenGL на ваш
Если вы хотите 4, 6, 8, 12 или 20 вершин, то вы можете иметь точно равноудаленные вершины как Платоновы тела которые все помещаются внутри сферы. Фактические координаты их должны быть легко получить. Для других чисел вершин вы можете использовать другие многогранники и масштабировать вершины, чтобы они лежали на сфере. Если вам нужно много очков, то есть геодезический купол может быть хорошей отправной точкой. С60 баки-мяч может быть хорошей базой с 60 очками. Для большинства эти вы сможете найти 3D модели из которой вы можете извлечь координаты.
Я думаю, что самый простой способ контролировать точки На сфере-использовать сферических координатах. Затем вы можете управлять положением точек вокруг сферы, используя два угла (rho и phi) и радиус.
пример кода для заполнения точек равномерно вокруг вращающейся сферы (для удовольствия):
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
}
Как уже предлагали некоторые ответы, используйте решение на основе икосаэдра. Источник для этого довольно легко найти (и я написал свой собственный несколько раз), но я нахожу отличный Примитивы Pro плагин чрезвычайно удобен при многих других обстоятельствах и всегда использует свою сферу вместо встроенной Unity one.