OpenCascade 实现模型的缩放、平移、旋转

在 Open Cascade 中如果想对某个模型进行调整,如移动、旋转、缩放,可以使用自带的模型操纵器(AIS_Manipulator)组件。

代码示例

第一步:创建模型操纵器

// 先创建一个长方体
gp_Ax2 boxPos;
boxPos.SetLocation(gp_Pnt(10.0, 10.0, 10.0));
TopoDS_Shape boxShape = BRepPrimAPI_MakeBox(boxPos, 15, 20, 30).Shape();
Handle(AIS_Shape) aisBoxShape = new AIS_Shape(boxShape);
aisBoxShape->SetColor(Quantity_NOC_ORANGE2);
m_context->Display(aisBoxShape, Standard_False);

// 再创建一个模型操纵器
Handle(AIS_Manipulator) aManipulator = new AIS_Manipulator();
// 可以用 SetPart 禁用或启用某些轴的平移、旋转或缩放的可视部分
aManipulator->SetPart(0, AIS_ManipulatorMode::AIS_MM_Scaling, Standard_False);  // 禁用了 X 轴的缩放
aManipulator->SetPart(1, AIS_ManipulatorMode::AIS_MM_Rotation, Standard_False); // 禁用了 Y 轴的旋转
// 将操纵器附在创建的长方体上
aManipulator->Attach(aisBoxShape);
// 启用指定的操纵模式
aManipulator->EnableMode(AIS_ManipulatorMode::AIS_MM_Translation);  // 启用移动
aManipulator->EnableMode(AIS_ManipulatorMode::AIS_MM_Rotation);     // 启用旋转
aManipulator->EnableMode(AIS_ManipulatorMode::AIS_MM_Scaling);      // 启用缩放
// 激活操纵器
aManipulator->SetModeActivationOnDetection(Standard_True);

m_context->UpdateCurrentViewer();

此时运行,可以看到模型操纵器已经显示在界面中了。但是还无法响应操作。

模型操纵器效果

第二步:事件绑定

// 在 mouse press 事件中加入如下代码:
if (aManipulator->HasActiveMode())
{
    aManipulator->StartTransform(anXPix, anYPix, aV3dView); // 初始化转换,记录起始位置
}

// ...

// 在 mouse move 事件中加入如下代码:
if (aManipulator->HasActiveMode())
{
    aManipulator->Transform(anXPix, anYPix, aV3dView); // 应用鼠标从起始位置开始移动而产生的变换
    aV3dView->Redraw();
}

// ...

// 在 mouse release 事件中加入如下代码:
aManipulator->StopTransform(Standard_True); // 重置起始变换参数(函数参数为 Standard_False 则撤销本次的变换)

第三步:停止模型操纵器

aManipulator->DeactivateCurrentMode();

第四步:将模型操纵器与模型分离

aManipulator->Detach();

效果演示

效果演示

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java基础常见英语词汇(共70个)['ɔbdʒekt] ['ɔ:rientid]导向的 ...
    今夜子辰阅读 8,628评论 1 34
  • A2A integration[,inti'ɡreiʃən]A2A整合 abstract['æbstrækt, ...
    凶猛老鹰阅读 3,741评论 0 0
  • 很实用的编程英语词库,共收录一千五百余条词汇。 第一部分: application 应用程式 应用、应用程序app...
    春天的蜜蜂阅读 5,389评论 0 22
  • 计算机英语(编程词汇大全) application 应用程式 应用、应用程序 application framew...
    朱森阅读 3,821评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,312评论 0 4

友情链接更多精彩内容