Нарисуйте среднюю половину сферы программно

Я пытаюсь создать среднюю половину сферы. В принципе, для создания сферы задаются номера стека и числа срезов, и есть две переменные phi (для фрагментов) и theta (для стеков), ответственных за прогресс. И этот процесс делится на создание нижней крышки, корпуса и верхней крышки (как видно ниже). Для достижения средней половины (theta среднего уровня 50%, как показано ниже), нам нужно опустить колпачки и каким-то образом изменить тело. Я играл с номерами стека (1/4*stackNumbers to 3/4*stackNumbers), но не дал результат, который я хотел.

Как мне изменить генерацию сферы для достижения средней половины ( pi/4 <theta <pi*3/4 )? Моя общая проблема заключается в том, как я могу разделить сферу на 3 разные части: верхние 25%, средние 50% и нижние 25%?

Вот популярный код для создания сферы программно:

 введите описание изображения здесь>> </a> </p>

<pre><code>---- +: = 5 = + ----</code></pre></body></html>

10 голосов | спросил Tina J 30 J0000006Europe/Moscow 2016, 21:26:17

1 ответ


2

Подумайте о своем вопросе в терминах тесселяции с вашей сферой, образованной кольцами. Если у вас коэффициент тесселяции 5, у вас будет верхняя крышка, 2 срединные секции и нижняя крышка. Нижнее двух тесселяционное кольцо представляет собой нижний колпачок 25%, а верхняя тесселяция двух колец - верхняя крышка 25%. Поэтому центр является одним кольцом на экваторе с множеством граней по обе стороны от него на 50%. Вот пример того, как тесселировать сферу, сначала вычисляя кольца на каждой высоте, а затем создавая грани между каждым кольцом.

float radius = 1.0f;
const int tesselationFactor = 5;

for (int i = 0; i <= tesselationFactor; i++)
{
    const float PI = 3.14159265359f;
    const float PIDIV2 = PI / 2.0f;

    // find height of ring
    float height = (i*PI / tesselationFactor) - PIDIV2;
    float dy = sinf(height);
    float theta = cosf(height);

    // locate verticies equally around center to form a ring
    for (int j = 0; j <= tessellation * 2; j++)
    {

        float longitude = static_cast<float>(j) * PIDIV2 / (tessellation * 2);
        float dx = sinf(longitude) * theta;
        float dz = cosf(longitude) * theta;

        Vector normal{ dx, dy, dz }; // initialize vector
        vertices.push_back(VertexPositionNormal(normal * radius, normal));
    }
}
// Fill the index buffer with triangles joining each pair of latitude rings.
int stride = tessellation * 2 + 1;
for (int i = 0; i < tesselationFactor; i++) // verticle rings
{
    for (int j = 0; j <= tessellation * 2; j++) // horizontal verticies
    {
        // 
        int i1 = i + 1;
        int j1 = (j + 1) % stride;
        /* connecting face */
         // triangle 1
        index_push_back(indices, i * stride + j);
        index_push_back(indices, i1 * stride + j);
        index_push_back(indices, i * stride + j1);
         // triangle 2
        index_push_back(indices, i * stride + j1);
        index_push_back(indices, i1 * stride + j);
        index_push_back(indices, i1 * stride + j1);
    }
}
ответил Chris 11 J000000Monday16 2016, 06:13:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132