【问题标题】:Why Rotation along from center origin为什么从中心原点旋转
【发布时间】:2016-07-10 01:08:25
【问题描述】:

我正面临一个旋转问题,即使用 opengl 绘图原语绘制的三角形。我正在使用 glut 键功能通过按ER 键来逆时针和顺时针旋转三角形。然后还使用 glut 特殊键功能通过按updownleftright这样的键来平移三角形x轴和y轴

但是在将这个三角形转换到另一个位置而不是按旋转键之后,它不会从它停留的最后一个位置旋转。它从中心原点旋转如何解决这个问题。

我不知道我做错了什么。

代码:

#include<iostream>
#include <cstdlib>
#include<GL\freeglut.h>

using namespace std;

float posX = 0.0f;
float posY = 0.0f;

float movethis = 0.1f;
float angle = 0.0f;


void init(void) {

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, -1.0);

}


void drawFigure() {
    glPointSize(4);
    glColor3f(1.0f, 1.0f, 0.0f);

    glBegin(GL_LINES);

    //Total 4 liens 9 vertex
    glVertex2f(0.1f, 0.0f);
    glVertex2f(-0.1f, 0.0f);
    glVertex2f(0.0f, 0.1f);
    glVertex2f(-0.1f, 0.0f);
    glVertex2f(0.0f, 0.1f);
    glVertex2f(0.1f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(0.0f, 0.1f);
    glVertex2f(0.0f, 0.0f);

    glEnd();

    glBegin(GL_POINTS);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex2f(0.0f, 0.1f);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex2f(0.0f, 0.0f);


    glEnd();

}

void SpecialKeys(int key, int xpos, int ypos) {

    if (key == GLUT_KEY_UP) {
            posY = posY + movethis;

        }

    else if (key == GLUT_KEY_DOWN) {
            posY = posY - movethis;
    }

    else if (key == GLUT_KEY_RIGHT) {
            posX = posX + movethis;
    }

    else if (key == GLUT_KEY_LEFT) {
            posX = posX - movethis;
    }


    glutPostRedisplay();
}


void KeysFun(unsigned char key, int xpos, int ypos) {
    if (key == 'e' || key == 'E') {
        angle=angle+10;
    }



    else if (key == 'r' || key == 'R') {
        angle=angle-10;
    }

    glutPostRedisplay();

}


void display() {

    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    glRotatef(angle, 0.0f, 0.0f, 1.0f);
    glTranslatef(posX, posY, 0.0f);

    drawFigure();
    glFlush();

}



int main(int argc, char**argv) {
    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(450, 50);
    glutCreateWindow("Frame");
    init();
    glutDisplayFunc(display);
    glutSpecialFunc(&SpecialKeys);
    glutKeyboardFunc(&KeysFun);
    glutMainLoop();

    return EXIT_SUCCESS;
}

【问题讨论】:

  • 我最近回答了一个问题,我认为这与您遇到的问题相同:OpenGL object doesn't translate to rotation axis(另外,请阅读 cmets 了解有关编辑的上下文)
  • @aslg 我看到了那个答案,但这不是明确的答案
  • 您需要将旋转放置在翻译之后。
  • 如果您认真考虑使用像 OpenGL 这样的低级图形 API,那么学习矩阵变换的数学知识对您大有裨益。特别是:所有基本变换矩阵都围绕原点进行操作,但您可以将矩阵相乘以创建更复杂的变换。
  • @MannDeep 我明白了。您是该问题中的同一个人,只是在不同的帐户下。我仍然认为我的回答相当明确。你应该用谷歌搜索向量。

标签: c++ opengl


【解决方案1】:

您必须“向后”阅读矩阵乘法链中的运算顺序。你首先要旋转,然后翻译,但如果你把它写成

rotate
translate
vertices

数据“向上”传播,因此顶点“看到”首先是平移,然后是旋转。解决方法:颠倒旋转和平移的顺序。

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多