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
相关产品推荐
相关产品推荐

