【问题标题】:Creating arrays using for loops in OpenGL在 OpenGL 中使用 for 循环创建数组
【发布时间】:2011-10-25 18:42:51
【问题描述】:

我要做的是使用数组创建一个由 8 个三角形组成的正方形,所有三角形的大小都相同。正方形四个角的坐标分别是,(-10, -10, 10), (-10, -10, -10), (10, -10, -10), (10, -10, 10) .这是从左上角开始逆时针方向。

在将值输入数组之前我已经创建了它,但现在我必须弄清楚如何在 C++ 中使用 for 循环来完成它。所以我知道对于每个数组(我需要创建一个顶点、索引和颜色数组)我需要创建一个 for 循环,并且该 for 循环必须在其中有一个 for 循环。

【问题讨论】:

  • 为什么不在并行数组中定义点和颜色,然后简单地遍历它们一次?
  • @user931794 首先我不完全确定我理解你的意思(就像我说我对此很陌生),我真的不知道并行数组是什么。但是,如果我有点理解您的意思,那么我认为这不会起作用,因为我无法对任何值进行硬编码,我必须纯粹通过 for 循环来创建数组。对不起,如果我不够清楚,就像我说我对此很陌生,所以我有点不确定如何解释事情。
  • 您可能需要指定您使用的语言,否则人们会在INTERCAL 中为您提供解决方案。
  • @genpfault 是的,我只是想到了这一点,感谢您帮助编辑:)
  • 听起来你想在每个方向上将一个矩形细分为两个。

标签: c++ arrays opengl for-loop vertex


【解决方案1】:

我喜欢将Eigen::Vector2f 用于Vec,但任何具有类似界面的东西都应该可以工作:

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

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

template< typename Vec >
void glQuad2d
    (
    const Vec& A,  // lower left coord
    const Vec& B,  // lower right coord
    const Vec& C,  // upper right coord
    const Vec& D,  // upper left coord
    unsigned int divs = 2,
    const Vec& At = Vec(0,0),
    const Vec& Bt = Vec(1,0),
    const Vec& Ct = Vec(1,1),
    const Vec& 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 循环操作添加显式堆栈。

【讨论】:

  • 感谢您的帮助,但不幸的是,这超出了我目前所知道的范围。我在大学学习游戏编程,这是我的第一门课程,所以我真的不太了解。但我真的很感谢所有的帮助!
  • 那是一些高质量的代码。十分优雅。尽管就像您提到的那样,如果您要多次调用它,您可能希望使用在堆上分配的显式堆栈而不是系统堆栈(即更改函数使其不递归)以避免堆栈溢出的可能性.
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多