Blender创建的平面导入Qt QCustom3DItem后无法显示另一面的原因?
问题:Blender导出的平面在Qt Chart 3D中旋转后看不到另一面
我在Blender里创建了一个平面,导出为OBJ文件后,通过QCustom3DItem添加到Qt的Q3DBars图表中,但旋转图表时发现无法看到平面的另一面,这是什么原因?
我的代码
#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导出的OBJ文件内容
# 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
原因分析
核心问题出在3D渲染的背面剔除(Backface Culling)机制,以及你导出的OBJ文件只包含了平面的单面数据:
- 默认情况下,Qt Data Visualization会开启背面剔除——渲染引擎会自动剔除法线朝向与相机视角相反的面,以此提升渲染效率。
- 看你导出的OBJ文件,两个面都使用了同一个法线
vn 1.0000 -0.0000 0.0000(X轴正方向),说明这个平面在Blender里是单面的,只定义了一个朝向的面,另一面没有对应的几何数据,所以旋转到背面时,渲染引擎会把这个“不存在”的面剔除,自然看不到。
解决办法
方法一:在Blender中修改平面为双面后重新导出
这是最稳妥的方案,从源头上解决面数据缺失的问题:
- 选中平面,切换到材质属性面板,找到设置选项卡,取消勾选「背面剔除」,或者直接勾选「双面」;
- 或者进入编辑模式,选中平面的面,按
Shift+D复制一个面,再按Ctrl+M选择镜像轴(比如X轴)翻转,最后用M键合并顶点,这样平面就有正反两个方向的面了,导出的OBJ会包含两组法线相反的面数据。
方法二:在Qt代码中全局关闭背面剔除
如果你不想修改OBJ文件,可以通过关闭Qt 3D图表的背面剔除功能来显示反面:
在你的代码中添加一行:
graph->renderSettings()->setBackfaceCullingEnabled(false);
不过注意,这个设置是全局的,会影响图表中所有3D元素的渲染,可能会降低一些性能,所以只推荐临时测试或者场景简单时使用。
内容的提问来源于stack exchange,提问作者KcFnMi
相关产品推荐
相关产品推荐

