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'的成员
我已经包含在我的标题中,但错误仍然存在。
感谢和推荐我可能适合初学者的问题。
答案 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