多次生成一个插入对象

Posted

技术标签:

【中文标题】多次生成一个插入对象【英文标题】:Generate one inserted object multiple times 【发布时间】:2017-10-24 23:17:28 【问题描述】:

我正在尝试为我的游戏创建 5x5x5 立方体。现在,我有这段代码,它在相机视图中只显示一个立方体。显然,它只被“插入”了一次。

void onIdle() override 

        // Animate using time when activated
        if (animationEnabled) time = (float) glfwGetTime();

        // Set gray background
        glClearColor(.5f, .5f, .5f, 0);

        // Clear depth and color buffers
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // Create object matrices
        auto cubeMat = rotate(mat4, time, 1.0f, 1.0f, 0.0f);
        //auto cubeMat = mat4(1.0f);
        auto sphereMat = rotate(mat4, (float)time, 0.5f, 1.0f, 0.0f);
        cubeMat = scale(cubeMat, 0.2f, 0.2f, 0.2f);

        // Camera position/rotation - for example, translate camera a bit backwards (positive value in Z axis), so we can see the objects
        auto cameraMat = translate(mat4, 0, 0, -4.0f);

        program.setUniform("ViewMatrix", cameraMat);

        // Update camera position with perspective projection
        program.setUniform("ProjectionMatrix", perspective((PI / 180.f) * 60.0f, 1.0f, 0.1f, 10.0f));

        program.setUniform("LightDirection", normalize(vec31.0f, -1.0f, 1.0f));
        // Render objects

        // Central box
        program.setUniform("Texture", cubeTexture);
        for (int i = 0; i < 5*5*5; ++i)
        
        program.setUniform("ModelMatrix", cubeMat[i]);
        cube.render();
        
    
;

如何生成 5x5x5 的立方体,这样我就不必手动插入很多次了?此外,每次插入都应为每个立方体提供特定位置,以创建一个充满 5x5x5 小立方体(如魔方)的大 3D 立方体,甚至更好,这是一个很好的example。

【问题讨论】:

你必须调用cube.render(); 5*5*5 次并且你必须设置 5*5*5 个体模型矩阵 - for (int i = 0; i &lt; 5*5*5; ++ i) rogram.setUniform("ModelMatrix", cubeMat[i]); cube.render(); @Rabbid76 谢谢,但是当我运行程序时,它编译得很好,但我得到运行时错误:glm/detail/type_mat4x4.inl, Line 2 48. Expression: i &lt; this-&gt;length(). This application has requested the Runtime to terminate it in an unusual way. @Rabbid76 看起来cubeMat[i] 造成了一些麻烦。有任何想法吗?到目前为止,我检查了type_mat4x4.inl 文件,mat4x4 函数的定义如下this-&gt;value[0] = col_type(s, 0, 0, 0); this-&gt;value[1] = col_type(0, s, 0, 0); this-&gt;value[2] = col_type(0, 0, s, 0); this-&gt;value[3] = col_type(0, 0, 0, s);,其中它只有从03 的值,因为它是4x4。 f(i) 是什么? 【参考方案1】:

您需要一个为单个立方体生成模型矩阵的函数:

mat4 CubeMat( int x, int y, int z )

    mat4 cubeMat;
    //cubeMat = rotate(cubeMat, time, 1.0f, 1.0f, 0.0f);
    //cubeMat = scale(cubeMat, 0.2f, 0.2f, 0.2f);
    cubeMat = translate(cubeMat, 1.5f*(float)x-4.0f, 1.5f*(float)y-4.0f, 1.5f*(float)z-4.0f);
    return cubeMat;

您必须调用cube.render(); 5*5*5 次,并且您必须设置 5*5*5 个单独的模型矩阵:

for (int x = 0; x < 5; ++x)

    for (int y = 0; y < 5; ++y)
    
        for (int z = 0; z < 5; ++z)
        
            mat4 cubeMat = CubeMat(x, y, z);
            program.setUniform("ModelMatrix", cubeMat);
            cube.render();
        
    

【讨论】:

以上是关于多次生成一个插入对象的主要内容,如果未能解决你的问题,请参考以下文章

多次插入 SQL 数据库

如何在使用 jooq 生成的 dao 插入/更新后获取插入/更新的对象

更新时生成 SQL 插入以及更新

python列表(list)+索引切片+修改+插入+删除+range函数生成整数列表对象

生成器

javascript-jquery-更改jquery对象