加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么从中心原点旋转

发布时间:2020-12-16 06:51:30 所属栏目:百科 来源:网络整理
导读:我正面临一个旋转问题,一个用opengl绘图原语绘制的三角形.我正在使用过压键功能通过按下E和R键逆时针和顺时针旋转三角形.然后还使用过滤特殊键功能通过向上按下左右键来平移三角形x轴和y轴 但是在将这个三角形转换到另一个位置而不是按下旋转键之后,它不会从
我正面临一个旋转问题,一个用opengl绘图原语绘制的三角形.我正在使用过压键功能通过按下E和R键逆时针和顺时针旋转三角形.然后还使用过滤特殊键功能通过向上按下左右键来平移三角形x轴和y轴

Rotation and Translation

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

Doesn't rotate where last time stay

我不知道我做错了什么.

码:

#include<iostream>
#include <cstdlib>
#include<GLfreeglut.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);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-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.1f);
    glVertex2f(0.1f,0.0f);
    glColor3f(0.0f,0.1f);
    glVertex2f(0.0f,0.0f);

    glEnd();

    glBegin(GL_POINTS);
    glColor3f(0.0f,1.0f);
    glVertex2f(0.0f,0.1f);
    glColor3f(1.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 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,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;
}

解决方法

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

rotate
translate
vertices

数据“向上”移动,因此顶点首先“看到”平移,然后是旋转.解决方案:翻转旋转和平移的顺序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读