You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中如何缩放旋转正方形实现45度角递归嵌套效果

OpenGL嵌套旋转正方形问题修复方案

现有代码问题

  • 缩放逻辑错误:采用固定步长递减缩放值的方式完全不符合几何适配要求,循环10次后缩放值会变为负数,且首次循环就会将初始缩放从1.0降到0.844,缺失最大层的正方形。
  • 缩放比例数值错误:要实现旋转45度的正方形刚好内嵌,相邻两层的缩放比例应为1/√2 ≈ 0.7071,而非固定减0.156。这个比例的推导逻辑是:外层正方形边长等于内层旋转45度正方形的对角线长度,因此内层边长为外层的1/√2,对应缩放比例就是0.7071。
  • 角度处理逻辑冗余:如果transformObject接收的是绝对旋转角度,直接用循环次数乘以45度即可,不需要维护单独的angle变量做自减操作。

修正后代码(适配transformObject接收绝对参数的场景)

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vao);

    const float SCALE_FACTOR = 1.0f / sqrt(2.0f); // 固定适配缩放系数
    for (int i = 0; i < 10; i++)
    {
        float current_scale = pow(SCALE_FACTOR, i);
        float current_angle = i * 45.0f;
        transformObject(current_scale, Z_AXIS, current_angle, glm::vec3(0.0f, 0.0f, 0.0f));
        glDrawArrays(GL_LINE_LOOP, 0, 4);
    }
    // 保留你原有代码的缓冲交换逻辑,比如glutSwapBuffers()等
}

如果你的transformObject是累积变换逻辑(在当前矩阵基础上叠加变换),可以参考以下实现:

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vao);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    const float SCALE_FACTOR = 1.0f / sqrt(2.0f);

    // 先画最外层无旋转无缩放的正方形
    transformObject(1.0f, Z_AXIS, 0.0f, glm::vec3(0.0f));
    glDrawArrays(GL_LINE_LOOP, 0, 4);

    for (int i = 1; i < 10; i++)
    {
        // 叠加旋转和缩放
        transformObject(SCALE_FACTOR, Z_AXIS, 45.0f, glm::vec3(0.0f));
        glDrawArrays(GL_LINE_LOOP, 0, 4);
    }
    // 保留原有缓冲交换逻辑
}

内容的提问来源于stack exchange,提问作者BigFungus05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:06:03