为什么没有显示飞机的另一侧?

Why the other side of the plane is not being shown?

我在 Blender 中创建了一个平面并将其添加为 QCustom3DItem on 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

因为面部剔除发生了。

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

不幸的是,这似乎在 Qt 中被硬编码了,如 class 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 冲突...