簡體   English   中英

應用 glTranslatef 和 glRotatef(OpenGL,C++)后頂點的新坐標

[英]New Coordinates of the vertices after appliying glTranslatef and glRotatef (OpenGL, C++)

首先,讓我告訴我我是使用 OpenGL 和 C++ 的新手。 但是,我想參與這兩個主題。

所以讓我解釋一下我的情況,我一直在尋找如何在應用glTrasnlatefglRotatefglTrasnlatef對象的新坐標。 但是,我沒有找到查找信息,實際上我找到了一些關於 Java 的信息,但我沒有得到它,因為我告訴過你我正在使用 C++。

我讀到有一些東西可以處理glPushMatrix(); 功能,但不知道如何處理它。

我知道在應用一些 trnaslation 和旋轉之后,我正在對實際矩陣進行更改。

最后,這樣做的主要目的是因為我不使用菱形面體中的那些頂點並進行大量平移和旋轉,這些也將是必需的。

到目前為止,這是我的代碼(順便說一句,我正在處理線條和頂點,因為我只需要這些)。

如果有人能通過正確的途徑解決我的問題,我將不勝感激。

提前致謝 阿爾貝托

#include <GL/glut.h>
#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

// Global variables
double rotate_y=0; 
double rotate_x=0;

int width = 640;
int height = 640;

#define PI 3.14159265

float theta = 60;
float edgeLength = 1;
float sinThetaOverHypotenuse = (sin((theta*PI)/180))/edgeLength;

vector<vector<float>> coordinates{{0.0, 0.0, 0.0},
{1.0, 0.0, 0.0},

{1.0, 0.0, 0.0},
{1.5, sinThetaOverHypotenuse, 0.0},

{1.5, sinThetaOverHypotenuse, 0.0},
{0.5, sinThetaOverHypotenuse, 0},

{0.5, sinThetaOverHypotenuse, 0},
{0.0, 0.0, 0.0}};

void rhombohedrom()
{
    vector<vector<float>> rotated {};
//    glClearColor(1,1,0,0)
    //  Clear screen and Z-buffer
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH ) / 300.0;
    double h = glutGet( GLUT_WINDOW_HEIGHT ) / 300.0;
    glOrtho( -1 * w, 1 * w, -1 * h, 1 * h, 10, -10);

glMatrixMode( GL_MODELVIEW );

    // Reset transformations
    glLoadIdentity();

    // Rotate when user changes rotate_x and rotate_y
    glRotatef( rotate_x, 1.0, 0.0, 0.0 );
    glRotatef( rotate_y, 0.0, 1.0, 0.0 );
/*
    FACE 0
    FACE 0
    FACE 0
    FACE 0
*/
    // random color side - front
    glBegin(GL_LINE_LOOP);
        glColor3f( 0.7, 0.3, 0.8 );
        for (int i = 0; i < 8; ++i)
        {
            glVertex3f(coordinates[i][0], coordinates[i][1], coordinates[i][2]);
        }
    glEnd();
/*
    FACE 1
    FACE 1
    FACE 1
    FACE 1
*/
    glPushMatrix();
    glTranslatef(0.0,0.0,0.0);
    glRotatef(90.0, 1.0, 0.0, 0.0);
    glBegin(GL_LINE_LOOP);
        glColor3f( 1.0, 1.0, 1.0 );
        for (int i = 0; i < 8; ++i)
        {
            glVertex3f(coordinates[i][0], coordinates[i][1], coordinates[i][2]);
        }        
    glEnd();
    glPopMatrix();

/*
    FACE 2
    FACE 2
    FACE 2
    FACE 2
*/

    glPushMatrix();
    glTranslatef(0.5,0.0,sinThetaOverHypotenuse);
    glBegin(GL_LINE_LOOP);
        glColor3f( 0.5, 0.5, 0.0 );
        for (int i = 0; i < 8; ++i)
        {
            glVertex3f(coordinates[i][0], coordinates[i][1], coordinates[i][2]);
        }        
    glEnd();
    glPopMatrix();

/*
    FACE 3
    FACE 3
    FACE 3
    FACE 3
*/

    glPushMatrix();
    glTranslatef(0.5,sinThetaOverHypotenuse,0.0);
    glRotatef(90.0, 1.0, 0.0, 0.0);
    glBegin(GL_LINE_LOOP);
        glColor3f( 0.5, 0.0, 0.0 );
        for (int i = 0; i < 8; ++i)
        {
            glVertex3f(coordinates[i][0], coordinates[i][1], coordinates[i][2]);
        }        
    glEnd();
    glPopMatrix();

    glFlush();
    glutSwapBuffers();
}

void specialKeys(int key, int x, int y)

{
    //  Right arrow - increase rotation by 5 degree
    if (key == GLUT_KEY_RIGHT)
        rotate_y += 5;
 
    //  Left arrow - decrease rotation by 5 degree
    else if (key == GLUT_KEY_LEFT)
        rotate_y -= 5;
 
    else if (key == GLUT_KEY_UP)
        rotate_x += 5;
 
    else if (key == GLUT_KEY_DOWN)
        rotate_x -= 5;
 
    //  Request display update
    glutPostRedisplay();
}

int main(int argc, char *argv[])
{

    //  Initialize GLUT and process user parameters
    glutInit(&argc,argv);

    glutInitWindowSize(width,height);
    // Position of the window
    glutInitWindowPosition(10,10);

    //  Request double buffered true color window with Z-buffer
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

    // Create window
    glutCreateWindow("rhombohedrom");

    //  Enable Z-buffer depth test
    glEnable(GL_DEPTH_TEST);

    // Callback functions
    glutDisplayFunc(rhombohedrom);
    glutSpecialFunc(specialKeys);

    //
    glutMainLoop();
    
    return 0;
} 

首先,我想發表一些評論,例如:

glPushMatrix()是一種舊方法,嘗試使用 MVP 技術來幫助您解決問題。 所以,你必須編寫你的頂點着色器並通過 OpenGL 中所謂的uniform傳遞矩陣。 顯然,您必須使用新的例程。 glPopMatrix()也是一個老例程。

如果您想了解更多關於這些言論的信息,我很樂意回答您的進一步問題。

使用頂點着色器而不是使用 CPU 的簡單演算!

您可以通過lookAt更改glTranslatef()glRotatef()以便您可以更改比例、旋轉和平移。

使用頂點着色器,而不是通過圖形演算來使用或強調 CPU。 即使您擁有 Intel 集成 GPU

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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