Создание массивов с использованием циклов for в OpenGL

#c #arrays #opengl #for-loop #vertex

#c #массивы #opengl #for-цикл #вершина

Вопрос:

Что мне нужно сделать, так это создать квадрат, состоящий из 8 треугольников одинакового размера, с использованием массивов. Координаты четырех углов квадрата, (-10, -10, 10), (-10, -10, -10), (10, -10, -10), (10, -10, 10). И это начинается с верхнего левого угла и идет против часовой стрелки.

Я уже создал его, прежде чем просто вводить значения в массив, но теперь мне нужно выяснить, как это сделать, используя циклы for в C . Итак, я знаю, что для каждого массива (мне нужно создать массив вершин, индексов и цветов) мне нужно создать цикл for и что в этом цикле for внутри него должен быть цикл for .

Комментарии:

1. почему бы не определить точки и цвета в параллельных массивах, а затем просто повторить их один раз?

2. @user931794 во-первых, я не совсем уверен, что понимаю, что вы имеете в виду (как я уже сказал, я очень новичок в этом), я действительно не знаю, что такое параллельный массив. Но если я вроде понимаю, что вы имеете в виду, то я не думаю, что это сработает, поскольку я не могу жестко запрограммировать ни одно из значений, я должен создавать массивы исключительно через циклы for . Извините, если я недостаточно ясно выражаюсь, как я уже сказал, я очень новичок в этом, поэтому я немного не уверен, как это объяснить.

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

4. @genpfault да, я только что подумал об этом, спасибо за помощь в редактировании 🙂

5. Похоже, вы хотите разделить прямоугольник на два в каждом направлении.

Ответ №1:

Мне нравится использовать Eigen::Vector2f for Vec , но все, что имеет аналогичный интерфейс, должно работать:

 template< typename Vec >
void glVec2d( const Vecamp; vec )
{
    glVertex2d( vec.x(), vec.y() );
}

template< typename Vec >
void glTex2d( const Vecamp; vec )
{
    glTexCoord2d( vec.x(), vec.y() );
}

template< typename Vec >
void glQuad2d
    (
    const Vecamp; A,  // lower left coord
    const Vecamp; B,  // lower right coord
    const Vecamp; C,  // upper right coord
    const Vecamp; D,  // upper left coord
    unsigned int divs = 2,
    const Vecamp; At = Vec(0,0),
    const Vecamp; Bt = Vec(1,0),
    const Vecamp; Ct = Vec(1,1),
    const Vecamp; Dt = Vec(0,1)
    )
{
    // base case
    if( divs == 0 )
        {
        glTex2d( At );
        glVec2d( A );

        glTex2d( Bt );
        glVec2d( B );

        glTex2d( Ct );
        glVec2d( C );

        glTex2d( Dt );
        glVec2d( D );

        return;
        }

    Vec AB = (A B) * 0.5;
    Vec BC = (B C) * 0.5;
    Vec CD = (C D) * 0.5;
    Vec AD = (A D) * 0.5;
    Vec ABCD = (AB CD) * 0.5;

    Vec ABt = (At Bt) * 0.5;
    Vec BCt = (Bt Ct) * 0.5;
    Vec CDt = (Ct Dt) * 0.5;
    Vec ADt = (At Dt) * 0.5;
    Vec ABCDt = (ABt CDt) * 0.5;

    // subdivided point layout
    // D   CD   C
    // 
    // AD ABCD BC 
    //
    // A   AB   B

    // subdivide
    glQuad2d( A, AB, ABCD, AD, divs - 1, At, ABt, ABCDt, ADt );
    glQuad2d( AB, B, BC, ABCD, divs - 1, ABt, Bt, BCt, ABCDt );
    glQuad2d( ABCD, BC, C, CD, divs - 1, ABCDt, BCt, Ct, CDt );
    glQuad2d( AD, ABCD, CD, D, divs - 1, ADt, ABCDt, CDt, Dt );
}
  

В настоящее время это рекурсивно, но вы всегда можете добавить явный стек для некоторого действия цикла for.

Комментарии:

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

2. это довольно качественный код. очень элегантно. хотя, как вы упоминали, если вы собираетесь вызывать это много раз, вы можете захотеть использовать явный стек, выделенный в куче, вместо системного стека (т. Е. Изменить функцию, чтобы она не была рекурсивной), чтобы избежать возможности ПЕРЕПОЛНЕНИЯ СТЕКА.