为啥没有显示飞机的另一面?

Posted

技术标签:

【中文标题】为啥没有显示飞机的另一面?【英文标题】:Why the other side of the plane is not being shown?为什么没有显示飞机的另一面? 【发布时间】:2020-05-05 12:03:09 【问题描述】:

我在 Blender 中创建了一个平面并将其添加为 QCustom3DItem 到 Qt chart。

但是在旋转图表时我发现​​我看不到飞机的另一边,为什么?

#include <QtWidgets>
#include <Q3DBars>
#include <QCustom3DItem>

using namespace QtDataVisualization;

MainWidget::MainWidget(QWidget *parent) : QWidget(parent)

    resize(800,600);
    auto vLayout = new QVBoxLayout(this);
    auto graph = new Q3DBars;
    auto widget = QWidget::createWindowContainer(graph);
    vLayout->addWidget(widget);

    auto bar = new QCustom3DItem;
    bar->setMeshFile(":mesh/planey.obj");
    bar->setScaling(QVector3D(.1f,.8f,.1f));

    graph->addCustomItem(bar);


# Blender v2.81 (sub 16) OBJ File: ''
# www.blender.org
o Plane
v 0.000000 2.000000 1.000000
v -0.000000 0.000000 1.000000
v 0.000000 2.000000 -1.000000
v -0.000000 0.000000 -1.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
vn 1.0000 -0.0000 0.0000
s off
f 2/1/1 3/2/1 1/3/1
f 2/1/1 4/4/1 3/2/1

【问题讨论】:

【参考方案1】:

因为发生了面部剔除

渲染器设置为仅显示法线朝向相机方向的三角形。朝向相反方向的三角形被视为“背面”,因此出于性能原因而被跳过。

不幸的是,这在 Qt 中似乎是硬编码的,如类 abstract3drenderer.cpp 中所示:

void Abstract3DRenderer::initializeOpenGL()

    m_context = QOpenGLContext::currentContext();
    // Set OpenGL features
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    // ...

我不确定你是否可以覆盖它,因为 3D 渲染器是私有的。

一种可能的解决方法是提供一个具有两个平面的 .obj 文件,一个具有面向一个方向的法线,另一个具有旋转 180° 的法线。虽然这可能会产生其他问题,例如 Z-fighting...

【讨论】:

以上是关于为啥没有显示飞机的另一面?的主要内容,如果未能解决你的问题,请参考以下文章

鲜为人知的另一面?比尔·盖茨被曝猛料!

线程与进程的另一面

《五四的另一面》PDF,五四的另一面 epub,txt,mobi,awz3 下载 电子书下载

为啥在导航之前加载了我的另一个屏幕?

为啥即使显示正确,在获取 nodeValue 时 null 仍会不断返回?

字节一面:网站显示不出来,怎么排查?