2014-02-25 61 views
0

我有一個有一個簡單的OpenGL程序,它會調整相機設置如下:爲什麼QMatrix4x4 ::的lookAt()導致倒掛相機

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.... 
} 

但結果卻是顛倒的相機!

Upside down camera1

當我將視圖矩陣設置爲: 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(); 

產生完全相同的結果:)

我認爲相機上軸nee ds以某種方式被解釋。

回答

1

通常這種影響是由幾件事情之一引起的。

  • 混合起來弧度和度
  • 忘記設置模型視圖矩陣到反相機的變換
  • 搞砸了的輸入注視

我懷疑的問題與此是最後一個。

QVector3D cameraUpDirection = cameraTransformation * QVector3D(0, 1, 0); 

你爲什麼用這個變換乘上向量?我可以理解乘上距離,以便相機位置變換,旋轉發送到查看函數的上軸將導致我懷疑的怪異。

通常,使用相機矩陣和使用lookat進行變換有點奇怪。如果已經有一個正確旋轉的相機矩陣,則可以將該矩陣轉換爲所需距離,表示爲適當長度的Z向量,可能爲QVector3D(0, 0, mDistance),然後將視圖矩陣設置爲相機矩陣的逆矩陣:

vMatrix = cameraTransformation.inverted(); 
+0

好吧,我嘗試單獨使用cameraTransformation,但它仍然產生完全相同的結果(請參閱主要問題上的編輯)。我想知道現在如何決定相機的上軸。 –

2

它實際上並不是倒置的相機,而是紋理被渲染到QML表面上。這真是令人困惑,因爲如果您使用基於窗口小部件的堆棧(QOpenGLWidget)或者簡單地使用QOpenGLWindow,您確實得到了正確的方向(Y向上)。

基本上與this question相同。一些解釋可以發現on the forumin the bug tracker

我認爲最好的解決方案是一個在錯誤跟蹤,需要在任一項QML或基質沒有額外的變換:首要updatePaintNodesetTextureCoordinatesTransform垂直鏡像。

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