Почему другая сторона самолета не показывается? - PullRequest
0 голосов
/ 19 января 2020

Я создал плоскость в Blender и добавил ее как QCustom3DItem на Qt chart .

Но, поворачивая график, я заметил, что не вижу с другой стороны плоскости, почему?

enter image description here

#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 Ответ

3 голосов
/ 19 января 2020

Потому что происходит отбор лица .

Средство рендеринга настроено так, чтобы показывать только треугольники, нормали которых направлены в направлении камеры. Треугольники, ориентированные наоборот, считаются «задними гранями» и поэтому пропускаются по соображениям производительности.

К сожалению, это кажется жестко закодированным в 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-бой ...

...