【问题标题】:OpenGL independent rotationOpenGL独立旋转
【发布时间】:2020-12-27 09:29:39
【问题描述】:

我正在尝试在下面绘制这些形状:

What I want

试过这段代码:

    glLoadIdentity();
    glColor3f(0.98f, 0.83f, 0.73f);
    glBegin(GL_POLYGON);
    for (float i = 0; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i)-10;
        y = 115 * sin(i)+270;
        glVertex2f(x, y);
    }
    glEnd();

    glRotatef(-135.0f, 0.0f, 0.0f, 1.0f);   
    glColor3f(1.0f, 0.83f, 0.0f);
    glBegin(GL_POLYGON);
    for (float i = p; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i) - 10;
        y = 115 * sin(i) + 270;
        glVertex2f(x, y);
    }

但这就是我得到的:

What I get

如果我只想使用 glLoadIdentity 和 glRotatef 进行旋转,您知道如何解决它吗?

注意: 我不想使用 push/pop 或翻译

【问题讨论】:

    标签: c++ opengl drawing opengl-compat


    【解决方案1】:

    您必须围绕其中心旋转对象并将旋转的对象移动到其在世界中的位置。 glRotatef 围绕 (0, 0) 旋转顶点。在 (0, 0) 和 glTranslate 周围绘制对象以将对象移动到其在世界中的位置:

    glTranslate(-10.0f, 270.0f, 0.0f);   
    glRotatef(-135.0f, 0.0f, 0.0f, 1.0f);   
        
    glColor3f(1.0f, 0.83f, 0.0f);
    glBegin(GL_POLYGON);
    for (float i = p; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i);
        y = 115 * sin(i);
        glVertex2f(x, y);
    }
    

    注意,glRotateglTranslate 等矩阵运算指定了一个新矩阵并将当前矩阵乘以新矩阵。


    如果不允许使用glTranslate,则必须将平移向量(-10, 270)向相反方向旋转。使用三角函数sincos 旋转矢量(请参阅Rotation matrix)。因为sincos的单位是弧度,所以需要把角度倒转成Radians

    float tx = -10.0f;   
    float ty = 270.0f;
    float angle = -135.0f;
    
    float inv_angle_rad = -angle * M_PI / 180.0f;
    float tx_rot = tx * cos(inv_angle_rad) - ty * sin(inv_angle_rad); 
    float ty_rot = tx * sin(inv_angle_rad) + ty * cos(inv_angle_rad);  
    
    glRotatef(angle, 0.0f, 0.0f, 1.0f);   
       
    glColor3f(1.0f, 0.83f, 0.0f);
    glBegin(GL_POLYGON);
    for (float i = p; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i) + tx_rot;
        y = 115 * sin(i) + ty_rot;
        glVertex2f(x, y);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多