簡體   English   中英

OpenGL對象無法平移到旋轉軸

[英]OpenGL object doesn't translate to rotation axis

我在2D旋轉中遇到問題。 通過使用opengl繪制圖元GL_LINES繪制三角形。

圖像訓練

情景是我想通過旋轉這個三角形ER鍵,按翻譯沿其旋轉軸這個三角形up down left right箭頭鍵。

圖片2

但是現在三角形是旋轉的,但不沿其旋轉軸平移。例如,用簡單的詞我將對象旋轉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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM