【问题标题】:New Coordinates of the vertices after appliying glTranslatef and glRotatef (OpenGL, C++)应用 glTranslatef 和 glRotatef (OpenGL, C++) 后顶点的新坐标
【发布时间】:2021-12-17 15:42:57
【问题描述】:

首先,让我告诉我,我是使用 OpenGL 和 C++ 的新手。但是,我想参与这两个主题。

所以让我解释一下我的情况,在应用glTrasnlatefglRotatef 之后,我一直在寻找如何获取对象的新坐标。但是,我没有找到查找信息,实际上我找到了一些关于 java 的信息,但我没有得到它,因为我告诉过你我正在使用 C++。

我读到有一些东西要处理 glPushMatrix(); 函数,但不知道如何处理它。

我知道在应用了一些平移和旋转之后,我正在对实际矩阵进行更改。

最后,这样做的主要目的是因为错误地使用了 rombohedrom 中的那些顶点并进行了大量的平移和旋转,这些也是需要的。

到目前为止,这是我的代码(顺便说一句,我当然正在使用线条和顶点,因为我只需要这些)。

如果有人能通过正确的方式与我联系,我将不胜感激。

提前致谢 阿尔贝托

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

【问题讨论】:

标签: c++ opengl


【解决方案1】:

首先,我想谈谈一些言论,例如:

glPushMatrix() 是一种老方法,尝试使用 MVP 技术,它可以帮助您解决问题。因此,您必须编写顶点着色器并通过 OpenGL 中称为 uniform 的方式传递矩阵。显然,您必须使用新的例程。 glPopMatrix()也是老套路了。

如果您想了解有关这些言论的更多信息,我很乐意回答您的其他问题。

使用顶点着色器而不是使用 CPU 的简单微积分!

您可以将glTranslatef()glRotatef() 更改为lookAt,这样您就可以更改缩放、旋转和平移。

使用顶点着色器而不是通过图形计算来使用或强调 CPU。即使您拥有 Intel 集成 GPU

【讨论】:

  • 感谢您的回答,看来我对 C++、OpenGL 还是很陌生。我真的很想学习。因此,我正在搜索您之前已经提供的信息,但我没有看到任何线索,可能我正在搜索错误的路径,但我不明白。我知道这听起来可能很愚蠢,但正如我所说你我是编程初学者,我想了解更多,我发现编程让生活更轻松
  • 没问题,我很乐意提供帮助!我想指出的第一件事是每个程序员都依赖这个文档:docs.gl,我建议你使用它。接下来,我看到您正在使用 glut 库,这很好,但我建议您使用 GLFW 库:glfw.org 您会在那里找到一切可以帮助您启动的东西。我还建议你使用这个库来渲染 3D 内容:glew.sourceforge.net。我还建议一些教程来了解 OpenGL 和 C++ 的精髓,例如:YouTube 上的 The Cherno。您仍然可以稍后提出问题来解决您所学的问题
猜你喜欢
  • 2014-12-07
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多