首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么QMatrix4x4::lookAt()会导致倒置相机

为什么QMatrix4x4::lookAt()会导致倒置相机
EN

Stack Overflow用户
提问于 2014-02-25 18:56:00
回答 2查看 4.5K关注 0票数 0

我有一个简单的OpenGL程序,它设置相机如下:

代码语言:javascript
运行
复制
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可能不起作用,我正在尝试:

代码语言:javascript
运行
复制
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();

产生完全相同的结果:)

我认为相机上的轴需要在某种程度上加以考虑。

EN

Stack Overflow用户

发布于 2015-01-11 13:09:23

它实际上不是相机倒置,而是纹理呈现到QML表面倒转。这确实令人困惑,因为如果您使用的是基于小部件的堆栈(QOpenGLWidget)或简单的QOpenGLWindow,则可以得到正确的方向(Y向上)。

基本上和这个问题一样。有些解释可以找到在论坛上在窃听器追踪器中

我认为最好的解决方案是在bug跟踪器中,它不需要对QML项或矩阵进行额外的转换:将updatePaintNode setTextureCoordinatesTransform 重写为setTextureCoordinatesTransform以垂直镜像.

代码语言:javascript
运行
复制
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);
}
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22023591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档