旋转后打印出顶点的位置

时间:2014-12-11 10:58:49

标签: opengl matrix rotation transformation

我画了一个立方体,我可以旋转它。我想在旋转后打印出顶点的位置。 在一些教程中我发现我可以使用QMatrix4x4来旋转我的立方体并获得顶点的新位置。我改变了mu代码:

void MyWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    QMatrix4x4 matrix;  // new matrice for transformation
    matrix.translate(0.0, 0.0, -10.0);
    matrix.Rotate(xRot / 16.0, 1.0, 0.0, 0.0);
    matrix.Rotate(yRot / 16.0, 0.0, 1.0, 0.0);
    matrix.Rotate(zRot / 16.0, 0.0, 0.0, 1.0);

    glBegin(GL_QUADS);  //1st quad
    qglColor(Qt::green);
    glNormal3f(0.0f, 0.0f, -1.0f);
    ---
    glEnd();
}

我的问题是如何应用矩阵来绘制顶点,因为glvertex3f不能采用该矩阵。然后我将打印出如下的新位置:(矩阵* QVector3D(0.0f,0.0f,-1.0f))例如;

经过几天,感谢您给我的链接,我曾尝试阅读有关Modern OpenGL的内容:现在是我的代码:

void GLWidget :: paintGL()     { --------      QMatrix4x4 matrixTransformation;      matrixTransformation.rotate(alpha,0,1,0);      matrixTransformation.rotate(beta,0,1,0);

 QVector3D cameraPosition = matrixTransformation * QVector3D(0,0,distance);
 QVector3D cameraUpDirection = matrixTransformation * QVector3D(0, 1, 0);

vMatrix.lookAt(cameraPosition, QVector3D(), cameraUpDirection);
// display the coordinates
 foreach(const QVector3D& p, cameraPosition) {
  qDebug() << "Rotated position =" << matrixTransformation * p;
}
 shaderProgram.bind();
 shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix *mMatrix);
 shaderProgram.setUniformValue("color", QColor(Qt::white));
 shaderProgram.setAttributeArray("vertex", vertices.constData());
 shaderProgram.enableAttributeArray("vertex");
 glDrawArrays(GL_TRIANGLES, 0,vertices.size());
 shaderProgram.disableAttributeArray("vertex");
 shaderProgram.release();}

} 出现错误:错误C2039:'const_iterator':不是'QVector3D'的成员 错误C2039:'i':不是'QForeachContainer'的成员

我已经包含在我的标题中,但错误仍然存​​在。

  1. 我使用的方式是否正确获取顶点的坐标?
  2. 错误来自我的foreach循环代码,可能是关于Qt的qvector3d.h中QVector3D的声明。如何解决?
  3. 如果使用变换矩阵,如何使用变换反馈对象将来自顶点着色器的顶点位置传递回另一个缓冲对象。 我看到它是旋转后获取顶点坐标的另一种解决方案。
  4. 感谢和推荐我可能适合初学者的问题。

2 个答案:

答案 0 :(得分:0)

您可以将QMatrix4x4上传到OpenGL矩阵堆栈。使用glLoadMatrixf方法完成上传矩阵,其中数据来自QMatrix4x4的constData()函数。代码可能如下所示:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
QMatrix4x4 matrix;  // new matrice for transformation
matrix.translate(0.0, 0.0, -10.0);
matrix.Rotate(xRot / 16.0, 1.0, 0.0, 0.0);
matrix.Rotate(yRot / 16.0, 0.0, 1.0, 0.0);
matrix.Rotate(zRot / 16.0, 0.0, 0.0, 1.0);
glLoadMatrixf(matrix.constData());

//Draw as already done before

有关qt的矩阵和向量如何与OpenGL一起使用的更多信息可以在这个非常好的答案中找到here

答案 1 :(得分:0)

我知道这听起来有点太多,特别是在开始时,但是既然你提到你是OpenGL的新手,我建议你不要使用不推荐使用的固定功能管道学习OpenGL(glLoadMatrixf,glVertex3f,.. )。

您应该考虑使用顶点缓冲区对象(请参阅VBO)并放入顶点,而不是执行glVertex3f调用。

下一步是编写一个简单的通过着色器的通道,它具有在顶点着色器中定义的矩阵,您可以在绘制之前上传矩阵。

绘制对象的实际代码是单个OpenGL API调用。

正如我所说,学习它可能需要很多东西,但是如果你真的想知道并理解opengl如何工作而不使用已弃用的函数,那绝对是值得的。

在这里,您可以找到一个非常好的表格,其中显示了扩展及其状态:OpenGL Extensions Core Availability

在这里你可以找到一个很好的网站,展示一些基于OpenGL 4的教程:OpenGL 4 based tutorials