写这这个博文的目的是记录下使用OCC自带的显示AIS时需要注意的一些事项。本人花了点时间学习了下OCC的AIS,实现了一个简单的模型浏览器功能。主要功能有:
一、step模型装配体显示
读取装配体的功能在我前面博客中提到过,具体可以参考前面的文章,参考效果如下:
二、视角动画切换
三、显示样式切换
四、拾取、高亮、隐藏
相关代码如下:
1.显示样式:Context->SetDisplayMode(AIS_Shaded, Standard_False);(实体模式)
Context->DefaultDrawer()->SetFaceBoundaryDraw(true);
Context->DefaultDrawer()->SetFaceBoundaryAspect(
new Prs3d_LineAspect(Quantity_NOC_YELLOW, Aspect_TOL_SOLID, 10.));
Context->DefaultDrawer()->SetIsoOnTriangulation(true); (显示线框)
2.拾取面、线、点
Context->Activate(AIS_Shape::SelectionMode(TopAbs_ShapeEnum::TopAbs_FACE));(拾取面,其他类似)
3.切换动画
增加一个基于qt动画类QAbstractAnimation的类,将OCC显示切入即可。
class V3dViewCameraAnimation : public QAbstractAnimation {
public:
V3dViewCameraAnimation(const Handle_V3d_View& view, QObject* parent = nullptr);
int duration() const override;
void setDuration(int msecs);
void setCameraStart(const Handle_Graphic3d_Camera& camera);
void setCameraEnd(const Handle_Graphic3d_Camera& camera);
const QEasingCurve& easingCurve() const;
void setEasingCurve(const QEasingCurve& easingCurve);
void configure(const std::function<void(Handle_V3d_View)>& fnViewChange);
protected:
void updateCurrentTime(int currentTime) override;
private:
Handle_V3d_View m_view;
Handle_Graphic3d_Camera m_cameraStart;
Handle_Graphic3d_Camera m_cameraEnd;
QEasingCurve m_easingCurve; // Linear by default
int m_duration_ms = 1000;
};
核心代码:
void V3dViewCameraAnimation::configure(const std::function<void(Handle_V3d_View)>& fnViewChange)
{
if (this->state() == QAbstractAnimation::Running)
this->stop();
const bool wasImmediateUpdateOn = m_view->SetImmediateUpdate(false);
m_cameraStart->Copy(m_view->Camera());
fnViewChange(m_view);
m_cameraEnd->Copy(m_view->Camera());
m_view->Camera()->Copy(m_cameraStart); // Restore
m_view->SetImmediateUpdate(wasImmediateUpdateOn);
}
void V3dViewCameraAnimation::updateCurrentTime(int currentTime)
{
const double t = m_easingCurve.valueForProgress(currentTime / double(m_duration_ms));
const bool prevImmediateUpdate = m_view->SetImmediateUpdate(false);
const Graphic3d_CameraLerp cameraLerp(m_cameraStart, m_cameraEnd);
Handle_Graphic3d_Camera camera = m_view->Camera();
cameraLerp.Interpolate(t, camera);
m_view->SetCamera(camera);
m_view->ZFitAll();
m_view->SetImmediateUpdate(prevImmediateUpdate);
m_view->Update();
}
以上是实现这些功能的主要核心,在做了几组测试下发现,OCC对STEP的渲染优化还是很不错了,也值得学习下AIS。