Сделать сферу с эквидистантными вершинами

Я пытаюсь сделать сферическую вспышку лучей с целью проверки столкновения, но наличие конкретных взаимодействий происходит на основе того, что или где попадает каждый луч. Следовательно, почему я использую лучи, а не нечто более простое, например OverlapSphere .

Причина, по которой я ищу, как создать сферу, состоит в том, что я могу использовать одну и ту же математику для своих лучей, заставляя их переходить к вершинам, где будет сфера. Но каждый способ, которым я могу найти для создания сферы, линии приближаются ближе к полюсам, что имеет смысл, поскольку это довольно легко сделать. Но, как вы можете себе представить, это не так полезно для моего текущего проекта.

TL; DR: Как создать сферу с эквидистантными вершинами? Если его не совсем равноудаленный, то он просто должен быть довольно близок. Если это произойдет, было бы здорово, если бы вы могли указать, какая разница будет и где, если применимо.

Дополнительные заметки: Я посмотрел на это и это , но математика прошла через мою голову, поэтому то, что я искал, возможно, просто все время смотрело мне в лицо.

6 Solutions collect form web for “Сделать сферу с эквидистантными вершинами”

Знаете ли вы, что сфера, предоставленная вам Единством , на самом деле разработана

с этой точной целью?

т. е. весь смысл этой сферы, встроенной в Unity, состоит в том, что точки являются довольно плавным пространством … примерно равноудаленным, как вы его выражаете.

введите описание изображения здесь

Чтобы воспитывать такую ​​сферу в Единстве, просто сделайте это:

введите описание изображения здесь

Затем вы можете сразу получить доступ к вершинам, как вы знаете

 Mesh mesh = GetComponent().mesh; Vector3[] vv = mesh.vertices; int kVerts=vv.Length for (int i=0; i 

Обратите внимание, что вы можете легко проверить, в какой части сферы они находятся (например), проверяя, насколько они далеко от ваших «городов» (или что-то еще) или просто проверяют (например) значения z, чтобы увидеть, какое полушарие они являются in .. et cetera.


Более того...

Пожалуйста, обратите внимание. Что касается вашей общей причины для этого:

но наличие конкретных взаимодействий происходит на основе того, что или где попадает каждый луч

Обратите внимание, что это не может быть проще сделать с помощью PhysX. (Полностью встроенная физика игры в Unity.) Действительно, я никогда, никогда, не смотрел на столкновение, не делая что-то «специфическое» в зависимости от «где он попал!».

Например, вы можете получить информацию о том, где был контакт: http://docs.unity3d.com/ScriptReference/RaycastHit-point.html

Стоит отметить, что совершенно немыслимо писать что-то, приближающееся к производительности PhysX в случайном программировании.

Надеюсь, это упростит ситуацию!

Вы можете использовать исосферу. Поскольку вершины распределены на равносторонних треугольниках, ваши вершины гарантированно будут равноудаленными.

введите описание изображения здесь

Чтобы построить исосферу, сначала вы создадите икосаэдр, а затем разделите грани рекурсивно на меньшие треугольники, как описано в этой статье .

  1. разрезать сферу на N кругов
  2. вычислить периметр этого
  3. разделите его на тот же угол, который создает срез
    • это дает вам количество вершин
    • а также угловой шаг внутри круга
  4. литые лучи

Вот как я закодировал его в 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 

Вот как это выглядит:

сферические вершины

  • Линии R, G, B представляют собой сферическую систему координат Ax, X, Y, Z
  • Белые линии - это ваши вершины (белый) + направление (серый)

системы координат

[Заметки]

  • не забудьте включить math.h
  • и замените материал OpenGL своим

Если вы хотите 4, 6, 8, 12 или 20 вершин, тогда вы можете иметь точно эквидистантные вершины, как платоновское тело, которое все вписывается в сферу. Фактические координаты этих данных должны быть легко доступны. Для других чисел вершин вы можете использовать другие многогранники и масштабировать вершины, чтобы они лежали на сфере. Если вам нужно много очков, то геодезический купол может быть хорошей базой. C60 bucky-ball может быть хорошей базой с 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 } 

Как уже было сказано в некоторых ответах, используйте решение на основе икосаэдра. Источником для этого довольно легко прийти (и я написал свои собственные несколько раз), но я считаю, что превосходный плагин Primitives Pro очень удобен при многих других обстоятельствах и всегда использует свою сферу вместо встроенного Unity.

Ссылка на компонент Primitives Pro

Параметры Primitives Pro

  • Использование M_PI со стандартом C89
  • Как использовать NSDecimalNumber?
  • Как я могу генерировать поистине (а не псевдо) случайные числа с помощью C #?
  • К власти в C?
  • Как рассчитать Тангенс и Бинормаль?
  • Можно ли передавать арифметические операторы методу в java?
  • Как я могу рассчитать возраст человека в год, месяц, дни?
  • Как использовать nan и inf в C?
  • Обратный алгоритм Фибоначчи?
  • Как проверить, является ли число мощностью 2
  • Самый быстрый алгоритм для массива размера круга N для M позиции
  • Давайте будем гением компьютера.