如何去掉 OpenCascade AIS_TextLabel 的白色背景并固定文字朝向?
去掉白色背景
将 label.SetDisplayType(1) 改为 label.SetDisplayType(Aspect_TODT_NORMAL)。对于新建标签,也可以直接删除这行,使用默认的普通文字显示模式。
原代码中的 1 对应 Aspect_TODT_SUBTITLE,会在文字背后启用填充矩形。Aspect_TODT_NORMAL 只显示文字,因此先修改显示类型即可,无需依赖 SetBackdrop(False)。OpenCascade 官方说明
使用 pythonocc-core 时,最小修改如下:
from OCC.Core.Aspect import Aspect_TODT_NORMAL
label.SetDisplayType(Aspect_TODT_NORMAL)
建议使用枚举名称,避免用数字表示显示模式。
固定文字所在平面和朝向
可以继续使用 AIS_TextLabel。通过 SetOrientation3D(gp_Ax2(...)) 指定文字在模型空间中的平面和阅读方向,避免文字始终朝向相机。AIS_TextLabel API 文档
以下示例沿用现有的 text、position、height 和 color 变量,将文字放在经过 position 且平行于 XY 平面的平面内。实际使用时,应将法向和文字横向替换为尺寸标注平面的方向。
from OCC.Core.AIS import AIS_TextLabel
from OCC.Core.Aspect import Aspect_TODT_NORMAL
from OCC.Core.Graphic3d import (
Graphic3d_HTA_CENTER,
Graphic3d_VTA_CENTER,
)
from OCC.Core.Quantity import Quantity_Color, Quantity_TOC_RGB
from OCC.Core.TCollection import TCollection_ExtendedString
from OCC.Core.gp import gp_Ax2, gp_Dir, gp_Pnt
anchor = gp_Pnt(*position)
# 示例:平面法向为 +Z,文字横向为 +X
orientation = gp_Ax2(
anchor,
gp_Dir(0.0, 0.0, 1.0),
gp_Dir(1.0, 0.0, 0.0),
)
label = AIS_TextLabel()
label.SetText(TCollection_ExtendedString(str(text)))
label.SetOrientation3D(orientation)
label.SetHeight(height)
label.SetDisplayType(Aspect_TODT_NORMAL)
label.SetHJustification(Graphic3d_HTA_CENTER)
label.SetVJustification(Graphic3d_VTA_CENTER)
label.SetColor(Quantity_Color(*color, Quantity_TOC_RGB))
label.SetFlipping(False)
label.SetZoomable(False)
self._context.Display(label, False)
self._context.UpdateCurrentViewer()
gp_Ax2 的原点确定标签位置,法向确定文字平面,X 方向确定文字横向。法向和 X 方向不能平行。SetOrientation3D() 同时设置了位置,因此示例中无需再调用 SetPosition()。
缩放时保持文字大小
SetZoomable(False) 表示文字不随视图缩放而放大或缩小。不过,其最终效果还需要结合三维朝向设置判断。
以 OCCT 7.9.0 的实现为例,启用 SetOrientation3D() 后,AIS_TextLabel 会在生成显示内容时设置 Graphic3d_TMF_ZoomPers,使标签保持模型空间中的朝向,并补偿视图缩放。该实现还会根据 SetFlipping() 的状态调整内部文字缩放属性,因此三维模式下的行为不能只看一次 SetZoomable() 调用。OCCT 7.9.0 源码
需要区分两个效果:
- 缩放视图时,文字尺寸保持稳定。
- 旋转相机时,文字仍位于指定平面,会因观察角度产生透视或投影压缩。
固定平面文字随观察角度发生的变化是正常的。例如,从接近平面侧面的方向观察时,文字会显得很窄。设置 SetFlipping(False) 后,从背面观察时文字也不会自动翻转为正向阅读。
修改后仍有背景时如何检查
如果修改的是已经显示的标签,应重新计算其显示内容:
label.SetDisplayType(Aspect_TODT_NORMAL)
self._context.Redisplay(label, True)
同时确认后续代码没有再次设置 Aspect_TODT_SUBTITLE,并检查场景中是否还保留着旧标签。
原始代码中,if hasattr(label, "SetBackdrop"): 后的语句缺少缩进;如果实际代码也如此,会先触发 Python 缩进错误。去掉背景不需要这一段,可以直接删除。
由于问题没有提供 OCCT 和 Python 绑定版本,也没有实际截图,上述判断以代码中的显示类型为依据。若绑定中缺少示例 API,应检查所安装版本的接口文档;仅凭这些材料无法进一步判断其他渲染异常。
备注:内容仅供参考。
