opencascade AIS_PointCloud源码学习 原创
AIS_PointCloud
前言
交互对象用于一组点。
表示支持两种显示模式:
点。
用于高亮显示的边界框。
表示通过边界框提供选择。
选择和高亮显示可以通过将默认选择模式设置为 -1 来禁用。
这样在交互视图中将无法选择对象。任何调用
AIS_InteractiveContext::AddOrRemoveSelected 的操作也应被禁止,
以避免程序化高亮显示(解决方法是设置不支持的高亮模式,例如 100)。
方法
//! 此点云对象支持的显示模式
enum DisplayMode
{
DM_Points = 0, //!< 作为普通点显示,默认表示
DM_BndBox = 2 //!< 作为边界框显示,默认用于高亮显示
};
//! 此点云对象支持的选择模式
enum SelectionMode
{
SM_Points = 0, //!< 通过点检测
SM_SubsetOfPoints = 1, //!< 检测点云中的点而不是整个对象
SM_BndBox = 2, //!< 通过边界框检测
};
public:
1.
构造函数。
Standard_EXPORT AIS_PointCloud();
2.
从点数组中设置点。
该方法不会复制输入数据 - 数组将作为句柄存储。
@param thePoints [in] 点数组
Standard_EXPORT virtual void SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints);
3.
设置带有可选颜色的点。
输入数据将被复制到内部缓冲区中。
输入数组应具有相同的长度,否则表示将无法计算和显示。
@param theCoords [in] 坐标数组
@param theColors [in] 可选的颜色数组
@param theNormals [in] 可选的法线数组
Standard_EXPORT virtual void SetPoints (const Handle(TColgp_HArray1OfPnt)& theCoords,
const Handle(Quantity_HArray1OfColor)& theColors = NULL,
const Handle(TColgp_HArray1OfDir)& theNormals = NULL);
4.
获取点数组。
方法可以被重写以动态填充来自应用程序数据结构的点数组。
@return 点数组
Standard_EXPORT virtual const Handle(Graphic3d_ArrayOfPoints) GetPoints() const;
5. //! 获取表示的边界框。
Standard_EXPORT virtual Bnd_Box GetBoundingBox() const;
6.
设置自定义颜色。仅在未分配每点颜色属性时影响表示。
Standard_EXPORT virtual void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE;
7.
恢复默认颜色。
Standard_EXPORT virtual void UnsetColor() Standard_OVERRIDE;
8.
设置自定义材质。仅在定义了法线时影响表示。
Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theMat) Standard_OVERRIDE;
9.
恢复默认材质。
Standard_EXPORT virtual void UnsetMaterial() Standard_OVERRIDE;
protected:
10.
为此对象准备表示。
Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode) Standard_OVERRIDE;
11.
为此对象准备选择。
Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
const Standard_Integer theMode) Standard_OVERRIDE;
用法示例
AIS_PointCloud
类在 OpenCascade 中用于表示和管理点云数据。下面是一个简单的用法示例,展示如何创建和显示点云对象:
#include <AIS_PointCloud.hxx>
#include <Graphic3d_ArrayOfPoints.hxx>
#include <V3d_View.hxx>
#include <AIS_InteractiveContext.hxx>
#include <Quantity_Color.hxx>
void CreateAndDisplayPointCloud(const Handle(AIS_InteractiveContext)& aContext)
{
// 创建点云对象
Handle(AIS_PointCloud) aPointCloud = new AIS_PointCloud();
// 创建点数组
Handle(Graphic3d_ArrayOfPoints) aPoints = new Graphic3d_ArrayOfPoints(3);
// 添加点到点数组
aPoints->AddVertex(gp_Pnt(0.0, 0.0, 0.0));
aPoints->AddVertex(gp_Pnt(10.0, 0.0, 0.0));
aPoints->AddVertex(gp_Pnt(0.0, 10.0, 0.0));
// 设置点云对象的点
aPointCloud->SetPoints(aPoints);
// 设置点云对象的颜色
aPointCloud->SetColor(Quantity_NOC_RED);
// 将点云对象添加到上下文中
aContext->Display(aPointCloud, Standard_True);
}
int main()
{
// 初始化OpenCascade的Viewer和Context
Handle(Aspect_DisplayConnection) aDisplayConnection = new Aspect_DisplayConnection();
Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection);
Handle(V3d_Viewer) aViewer = new V3d_Viewer(aGraphicDriver);
Handle(V3d_View) aView = aViewer->CreateView();
Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext(aViewer);
// 创建和显示点云
CreateAndDisplayPointCloud(aContext);
// 设置视图参数并开始交互
aView->SetBackgroundColor(Quantity_NOC_BLACK);
aView->MustBeResized();
aView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.1, V3d_ZBUFFER);
// 在此添加其他交互逻辑或视图更新逻辑
aView->Redraw();
return 0;
}
这个示例展示了如何在 OpenCascade 中创建一个点云对象并将其显示在视图中。代码的主要步骤包括:
- 创建
AIS_PointCloud
对象。 - 创建
Graphic3d_ArrayOfPoints
对象,并向其中添加点。 - 使用
SetPoints
方法将点数组设置到AIS_PointCloud
对象中。 - 使用
SetColor
方法设置点云的颜色。 - 使用
AIS_InteractiveContext
对象将点云对象显示出来。
此示例还包括 OpenCascade Viewer 和 Context 的初始化,以及基本的视图设置。