目录
视图立方体是一个在三维图形界面或建模软件中常见的功能组件,用于帮助用户快速切换和定位不同的视图方向。它通常位于屏幕的某个角落,由一系列图标或按钮组成,允许用户直观地选择和调整当前的视图角度。
1、视图立方体的核心功能
多视图切换:视图立方体通常包含代表不同视图方向的图标或面,如正面、侧面、顶面等。用户可以通过点击这些图标或面来快速切换视图,以便从不同角度观察三维模型或场景。
视图定位:视图立方体还可以显示当前视图的定位方向,让用户清楚地知道他们正在查看的是模型的哪一部分。
视角调整:除了基本的视图切换,视图立方体还可能提供视角微调的功能,允许用户通过拖动或旋转视图立方体来调整视图的角度或倾斜度。
在Open CASCADE这样的三维造型库中,视图立方体可能是其可视化界面的一部分。通过合理配置和使用视图立方体,用户可以更加高效地进行三维建模、编辑和查看工作。
视图立方体的使用通常很简单直观。用户只需将鼠标指针悬停在视图立方体上,然后点击或拖动相应的图标或面即可实现视图的切换和调整。此外,视图立方体可能还包含一些额外的按钮或选项,用于进一步定制视图的显示方式或属性。
在Open CASCADE中,视图立方体的设置与显示通常涉及对视图和渲染参数的精确配置。视图立方体作为一种用户界面元素,允许用户直观地在不同的视图方向之间切换,以便更好地观察和理解三维模型。
2、设置视图立方体
定义视图方向:首先,您需要确定视图立方体应包含哪些视图方向。这通常包括正面、背面、侧面、顶面等标准视图,但也可能包括自定义的视图方向。
配置视图参数:对于每个视图方向,您可能需要设置相应的相机位置、朝向和视野角度等参数。这些参数将决定每个视图的具体显示效果。
集成视图立方体:将配置好的视图立方体集成到Open CASCADE的用户界面中。这通常涉及编写代码来创建视图立方体的UI元素,并将其与相应的视图切换逻辑关联起来。
3、显示视图立方体
渲染视图:当用户点击视图立方体上的某个视图方向时,Open CASCADE会根据预先设置的参数来渲染该视图。这包括计算相机的变换矩阵、应用透视投影等步骤。
更新用户界面:渲染完成后,Open CASCADE会更新用户界面,以显示新的视图。这可能涉及绘制三维模型的投影图像、更新视图边界和其他UI元素等。
交互反馈:为了确保良好的用户体验,视图立方体还应提供交互反馈。例如,当用户将鼠标悬停在某个视图方向上时,可以显示提示信息或改变视图图标的外观。
4、案例
Displaywin::Displaywin(QWidget* parent)
: QWidget(parent)
{
resize(parent->width(), parent->height());
//提供X server的连接,在window和Mac中不起作用
Handle(Aspect_DisplayConnection) hAspect_DisplayConnect = new Aspect_DisplayConnection;
//创建3D接口定义图形驱动
Handle(OpenGl_GraphicDriver) driver = new OpenGl_GraphicDriver(hAspect_DisplayConnect);
//该类的方法允许编辑、询问连接该类的其他参数(如视图、光)
viewer = new V3d_Viewer(driver);
viewer->SetDefaultLights();
viewer->SetLightOn();
view = viewer->CreateView();
view->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.1, V3d_ZBUFFER);//这是显示小坐标系的代码
WId win_handle = winId();
//在已有的窗口上创建窗口
Handle(WNT_Window) window = new WNT_Window((Aspect_Handle)win_handle);
view->SetWindow(window);
if (!window->IsMapped())
{
window->Map();//打开窗口
}
view->SetBackgroundColor(Quantity_NOC_GRAY60);
view->MustBeResized();
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setBackgroundRole(QPalette::NoRole);
setFocusPolicy(Qt::StrongFocus);
//交互式上下文
context = new AIS_InteractiveContext(viewer);
context->SetDisplayMode(AIS_Shaded, Standard_True);
//creat viewbox
//myView->TriedronErase(); 隐藏坐标系
Handle(AIS_ViewCube) viewCube = new AIS_ViewCube();
context->Display(viewCube, Standard_True);
viewCube->SetBoxColor(Quantity_NOC_WHITE); //设置视方体为白色
viewCube->SetTransparency(0.5); //设置透明度
//设置视方体每个面的字体为黑色
viewCube->SetTextColor(Quantity_Color(Quantity_NOC_BLACK));
viewCube->SetFontHeight(18); //设置视方体每个面字体的高度
//设置视方体每个面的边界线
//首先创建一个Prs3d_Drawer 对象,一切属性的修改在myDraw 下进行
const Handle(Prs3d_Drawer)& myDrawer = viewCube->Attributes();
myDrawer->SetupOwnFaceBoundaryAspect(); //设置的预前工作(十分重要)
myDrawer->SetFaceBoundaryDraw(true);
//设置边界线的颜色为蓝色
myDrawer->FaceBoundaryAspect()->SetColor(Quantity_NameOfColor::Quantity_NOC_LIGHTSKYBLUE);
myDrawer->FaceBoundaryAspect()->SetWidth(2.0);//设置边界线的宽度
//H_AisViewCube->SetMaterial(Graphic3d_MaterialAspect(Graphic3d_NOM_DEFAULT));//设置材质
//设置视方体基准线
myDrawer->SetDatumAspect(new Prs3d_DatumAspect()); //设置的预前工作(十分重要)
const Handle_Prs3d_DatumAspect& datumAspect = viewCube->Attributes()->DatumAspect();
//设置轴颜色
datumAspect->ShadingAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
datumAspect->ShadingAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
datumAspect->ShadingAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);
//设置X,Y,Z文本颜色
datumAspect->TextAspect(Prs3d_DP_XAxis)->SetColor(Quantity_NOC_RED);
datumAspect->TextAspect(Prs3d_DP_YAxis)->SetColor(Quantity_NOC_GREEN);
datumAspect->TextAspect(Prs3d_DP_ZAxis)->SetColor(Quantity_NOC_BLUE);
viewCube->SetTransformPersistence(
new Graphic3d_TransformPers(
Graphic3d_TMF_TriedronPers,
Aspect_TOTP_RIGHT_UPPER/*设置在右上角*/,
Graphic3d_Vec2i(100, 100)));
//display model
//TopoDS_Shape boxShape = occ.MakeBottle(50, 70, 30);
view->FitAll();
}