为什么没有显示飞机的另一侧?
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 冲突...
我在 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 冲突...