gpt4 book ai didi

c++ - 为什么从中心原点旋转

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:02 26 4
gpt4 key购买 nike

我正面临一个使用 opengl 绘图基元绘制的三角形的旋转问题。我使用 glut 键功能通过按 ER 键逆时针和顺时针旋转三角形。然后还使用 glut 特殊键功能通过按 up down left right 平移三角形 x 轴和 y 轴> 这样的键

Rotation and Translation

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

Doesn't rotate where last time stay

我不知道我做错了什么。

代码:

#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;
}

最佳答案

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

rotate
translate
vertices

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

关于c++ - 为什么从中心原点旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com