我有一个简单的OpenGL程序,它设置相机如下:
void
SimRenderer::render() {
glDepthMask(true);
glClearColor(0.5f, 0.5f, 0.7f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glFrontFace(GL_CW);
glCullFace(GL_FRONT);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
QMatrix4x4 mMatrix;
QMatrix4x4 vMatrix;
QMatrix4x4 cameraTransformation;
cameraTransformation.rotate(mAlpha, 0, 1, 0); // mAlpha = 25
cameraTransformation.rotate(mBeta, 1, 0, 0); // mBeta = 25
QVector3D cameraPosition = cameraTransformation * QVector3D(0, 0, mDistance);
QVector3D cameraUpDirection = cameraTransformation * QVector3D(0, 1, 0);
vMatrix.lookAt(cameraPosition, QVector3D(0, 0, 0), cameraUpDirection);
mProgram.bind();
mProgram.setUniformValue(mMatrixUniformLoc, mProjMatrix * vMatrix * mMatrix );
// render a grid....
}
但结果是一个倒置的摄像机!!
当我将视图矩阵设置为: QVector3D cameraUpDirection = cameraTransformation * QVector3D(0,-1,0);
起作用了!但是,当我的实际向上方向是正Y时,为什么要将我的向上方向设置为负Y呢?
这里的完整类:https://code.google.com/p/rapid-concepts/source/browse/trunk/simviewer/simrenderer.cpp
其他信息:在调用呈现函数之前,我将呈现到一个将FBO绑定到小部件表面的QQuickFramebufferObject。不要认为这会是一个问题,但无论如何。这根本不是一个纹理问题,没有任何纹理可以翻转等等。似乎相机正以相反的方式解释向上的方向!
http://doc.qt.digia.com/qt-maemo/qmatrix4x4.html#lookAt
最新情况:
因此,由于同时使用lookat和cameraTransformations可能不起作用,我正在尝试:
QMatrix4x4 mMatrix;
QMatrix4x4 vMatrix;
QMatrix4x4 cameraTransformation;
cameraTransformation.rotate(mAlpha, 0, 1, 0); // 25
cameraTransformation.rotate(mBeta, 1, 0, 0); // 25
cameraTransformation.translate(0, 0, mDistance);
vMatrix = cameraTransformation.inverted();
产生完全相同的结果:)
我认为相机上的轴需要在某种程度上加以考虑。
发布于 2015-01-11 13:09:23
它实际上不是相机倒置,而是纹理呈现到QML表面倒转。这确实令人困惑,因为如果您使用的是基于小部件的堆栈(QOpenGLWidget)或简单的QOpenGLWindow,则可以得到正确的方向(Y向上)。
基本上和这个问题一样。有些解释可以找到在论坛上或在窃听器追踪器中。
我认为最好的解决方案是在bug跟踪器中,它不需要对QML项或矩阵进行额外的转换:将updatePaintNode
setTextureCoordinatesTransform
重写为setTextureCoordinatesTransform
以垂直镜像.。
QSGNode *MyQQuickFramebufferObject::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *nodeData)
{
if (!node) {
node = QQuickFramebufferObject::updatePaintNode(node, nodeData);
QSGSimpleTextureNode *n = static_cast<QSGSimpleTextureNode *>(node);
if (n)
n->setTextureCoordinatesTransform(QSGSimpleTextureNode::MirrorVertically);
return node;
}
return QQuickFramebufferObject::updatePaintNode(node, nodeData);
}
https://stackoverflow.com/questions/22023591
复制相似问题