You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件只包含了平面的单面数据:

  1. 默认情况下,Qt Data Visualization会开启背面剔除——渲染引擎会自动剔除法线朝向与相机视角相反的面,以此提升渲染效率。
  2. 看你导出的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:17:52