[英]OpenGL object doesn't translate to rotation axis
我在2D旋轉中遇到問題。 通過使用opengl
繪制圖元GL_LINES
繪制三角形。
情景是我想通過旋轉這個三角形E
和R
鍵,按翻譯沿其旋轉軸這個三角形up
down
left
right
箭頭鍵。
但是現在三角形是旋轉的,但不沿其旋轉軸平移。例如,用簡單的詞我將對象旋轉90度角,當用戶按下箭頭鍵時,它不會將三角形轉換為90度角,只是將對象簡單地平移下來,我一直堅持下去。
這是我的代碼:
#include<iostream>
#include <cstdlib>
#include<GL\freeglut.h>
using namespace std;
float posX = 0.0f, posY = 0.0f, move_unit = 0.01f, 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() {
//LINES Make traingle
glColor3f(1.0f, 1.0f, 0.0f);
glBegin(GL_LINES);
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();
}
void SpecialKeys(int key, int xpos, int ypos) {
if (key == GLUT_KEY_UP) {
if (posY < 0.95f) {
posY += move_unit;
}
}
else if (key == GLUT_KEY_DOWN) {
if (posY > -1.0f) {
posY -= move_unit;
}
}
else if (key == GLUT_KEY_RIGHT) {
if (posX < 0.95f) {
posX += move_unit;
}
}
else if (key == GLUT_KEY_LEFT) {
if (posX > -0.95f) {
posX = posX - move_unit;
}
}
glutPostRedisplay();
}
void KeysFun(unsigned char key, int xpos, int ypos) {
if (key == 'e' || key == 'E') {
angle++;
}
else if (key == 'r' || key == 'R') {
angle--;
}
glutPostRedisplay();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(posX, posY, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
drawFigure();
glPopMatrix();
glFlush();
}
int main(int argc, char**argv) {
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitWindowPosition(450, 50);
glutCreateWindow("C");
init();
glutDisplayFunc(display);
glutSpecialFunc(&SpecialKeys);
glutKeyboardFunc(&KeysFun);
glutMainLoop();
return EXIT_SUCCESS;
}
好的,我在閱讀代碼時誤解了您的代碼,但我在自己的PC上重現了該代碼。
就像我在評論中說的那樣,轉換的常見順序是您當前正在執行的TRS(平移,旋轉,縮放)。 這樣,您的對象將首先圍繞原點縮放,然后圍繞自身旋轉,然后才平移到另一個點。
從您的問題中我了解到的是,您希望對象繞一個點旋轉,然后希望它相對於它的新前向矢量或旋轉軸相對移動,而不是在屏幕參照中移動(始終向上等)。 然后,您必須將旋轉放置在平移之前 。
rotate( angle, 0.0f, 0.0f, 1.0f );
translate( posX, posY, 0.0f );
現在,對象應繞原點旋轉並相對於當前旋轉軸移動。 此外,如果要繞另一個點旋轉,還可以在旋轉之前添加另一個平移。
translate( centerX, centerY, 0.0f );
rotate( angle, 0.0f, 0.0f, 1.0f );
translate( posX, posY, 0.0f );
編輯:讀取為,將對象平移到點(posX, posY)
,圍繞中心點(centerX, centerY)
軸(0,0,1)
旋轉對象。
Edit2:這是centerX和centerY為(0,0)
(即(0,0)
時的外觀。 三角形開始於(0,0)
中心。
編輯3:
從注釋中,您需要更改輸入。 使用原始問題中的轉換,即 旋轉之前的平移。
// Let's assume we have a vector2 class that stores two floats
vector2 forward;
forward.x = sin( -_angle * DEG_TO_RADIANS );
forward.y = cos( -_angle * DEG_TO_RADIANS );
vector2 right;
right.x = forward.y;
right.y = -forward.x;
// Move one tenth of the length of the forward vector
float velocity = 0.1f;
if ( key == GLUT_KEY_UP ) {
pos += forward * velocity;
}
else if ( key == GLUT_KEY_DOWN ) {
pos -= forward * velocity;
}
else if ( key == GLUT_KEY_RIGHT ) {
pos += right * velocity;
}
else if ( key == GLUT_KEY_UP ) {
pos -= right * velocity;
}
當然,請根據需要更改值。 不要忘記三角函數采用弧度值。 同樣,由於默認情況下對象是面向上的,因此使用角度0 direction (0,1)
對應於常規數學中的角度90,因此您必須相應地將參數調整為三角函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.