Как вы программно генерируете сферу?

25

Может кто-нибудь объяснить, как можно было бы создать сферу, вершины, индексы и текстурные координаты? Существует удивительное отсутствие документации о том, как это сделать, и это то, что я заинтересован в изучении.

Я пробовал очевидное: поиск в Google, поиск на gamedev.net и т. Д. Однако ничто не покрывает поколения сферических точек, их индексацию и текстурирование.

judeclarke
источник
6
Я не собираюсь понижать или голосовать, чтобы закрыть это, но вы действительно говорите мне, что ни один результат из google.com/search?q=how+to+generate+a+sphere+vertices не был полезен? Если это так, вам нужно объяснить, в чем ваша проблема, более подробно.
Та да: visualizationlibrary.org/documentation/…
замедленная
Поиск икосферы. Гораздо умнее, чем тупая «полярная сфера», которая производит бесполезные лица.
Notabene
3
Стоит отметить, что для некоторых простых целей идеальной «сферой» является четырехугольник с круглой текстурой, обращенный к камере.
аааааааааааа
Вот как я реализовал это для skydome в моей игре.
Данияр

Ответы:

36

Есть два основных подхода:

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

Самый левый называется ультрафиолетовой сферой, а самый правый - икосферой.

GLUT имеет тенденцию использовать ультрафиолетовый подход: посмотрите на функцию glutSolidSphere()в исходном коде freeglut .

Вот отличная статья о создании икосферы: http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html

УФ-сфера выглядит как глобус. Для многих целей это совершенно нормально, но для некоторых случаев использования, например, если вы хотите деформировать сферу, невыгодно, чтобы плотность вершин была больше вокруг полюсов. Здесь икосфера лучше, ее вершины распределены равномерно.

Вы также можете найти это интересным: http://kiwi.atmos.colostate.edu/BUGS/geodesic/text.html описывает подход к организации граней в зоны.

http://vterrain.org/Textures/spherical.html дает отличное описание того, как вы можете выбрать их текстуру.

Будет
источник
2
Хотя общая идея хороша, подразделение многогранника Шлефли {3,5} не единственный способ сделать это. Обычно я предпочитаю работать с семейством Шлефли {4, *} ({4,3} в случае сферы) для целей УФ-картирования.
Мартин Сойка
Точно мозаичные икосаэдрические сферы генерировать немного дороже из-за необходимости рекурсивного деления граней.
Бобобо
9

Есть 2 способа сделать это:

  1. Проходите тэту и фи в сферических координатах, создавайте лица и трис

  2. Создайте икосаэдр и рекурсивно делите грани, пока не достигнете желаемой тесселяции.

Сфера с использованием сферических координат ходьбы

Для первого способа, вы просто используете двойное гнездо, чтобы пройти тэту и фи. Когда вы идете по тэте и фи, вы вращаете треугольники, чтобы создать свою сферу.

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

Код, который делает это, будет выглядеть примерно так:

for( int t = 0 ; t < stacks ; t++ ) // stacks are ELEVATION so they count theta
{
  real theta1 = ( (real)(t)/stacks )*PI ;
  real theta2 = ( (real)(t+1)/stacks )*PI ;

  for( int p = 0 ; p < slices ; p++ ) // slices are ORANGE SLICES so the count azimuth
  {
    real phi1 = ( (real)(p)/slices )*2*PI ; // azimuth goes around 0 .. 2*PI
    real phi2 = ( (real)(p+1)/slices )*2*PI ;

    //phi2   phi1
    // |      |
    // 2------1 -- theta1
    // |\ _   |
    // |    \ |
    // 3------4 -- theta2
    //

    //vertex1 = vertex on a sphere of radius r at spherical coords theta1, phi1
    //vertex2 = vertex on a sphere of radius r at spherical coords theta1, phi2
    //vertex3 = vertex on a sphere of radius r at spherical coords theta2, phi2
    //vertex4 = vertex on a sphere of radius r at spherical coords theta2, phi1

    // facing out
    if( t == 0 ) // top cap
      mesh->addTri( vertex1, vertex3, vertex4 ) ; //t1p1, t2p2, t2p1
    else if( t + 1 == stacks ) //end cap
      mesh->addTri( vertex3, vertex1, vertex2 ) ; //t2p2, t1p1, t1p2
    else
    {
      // body, facing OUT:
      mesh->addTri( vertex1, vertex2, vertex4 ) ;
      mesh->addTri( vertex2, vertex3, vertex4 ) ;
    }
  }
}

Так что обратите внимание выше, важно наматывать верхнюю и нижнюю крышки, используя только трис, а не квад.

Икосаэдрическая сфера

Чтобы использовать икосаэдр, вы просто генерируете точки икосаэдра, а затем заводите треугольники из него. В вершинах икосаэдра сидит в нуле являются:

(0, ±1, ±φ)
1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + 5) / 2 

Затем вам нужно просто взглянуть на схему икосаэдра и граней ветра из этих вершин. У меня уже есть код, который делает это здесь .

bobobobo
источник
есть идеи, как получить половину тела, например, от тета = пи / 4 до тета = 3pi * 4? Как это изображение: i.stack.imgur.com/Jjx2c.jpg Я потратил несколько дней, чтобы решить эту проблему.
Тина Дж
3

Если точки не должны быть локально однородными, но должны быть глобально однородными, и не должны следовать какой-либо заданной схеме, вы можете использовать вариант алгоритма метания дротиков, чтобы распределить n точек на сфере с радиусом r , в среднем дистанционные точки друг от друга. Эти значения тогда примерно:

  1. Если вы хотите иметь определенное количество вершин:
    • n = (желаемое количество вершин)
    • dist = 2 × r × √ ( π / n )
  2. Если вы хотите иметь определенное среднее расстояние между вершинами:
    • n = 4 × π × ( r / dist ) 2
    • dist = (желаемое среднее расстояние)

В простейшем случае вы можете равномерно выбирать точки случайным образом, выбирая две равномерно распределенные переменные u и v из (0, 1) и вычисляя по ним полярные координаты по формулам θ = 2 × π × u и ϕ = arc cos (2 × v - 1); затем отбрасывать любые точки, которые лежат слишком близко к уже выбранным точкам. Для немного более сложного и значительно более эффективного алгоритма см. « Метание дротиков на поверхностях » Клайна, Йешке, Уайта, Раздана и Вонки.

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

В целях текстурирования вы можете затем сопоставить точки с картой куба.

Мартин Сойка
источник