在Open CASCADE(OCC)中,
V3d_View类用于管理3D视图的显示和交互。视图控制的核心原理基于相机模型(Camera Model),通过调整相机位置(Eye)、观察目标点(At)和向上方向(Up)来定义视图坐标系。以下从原理和函数使用展开说明:
视图变换的本质是构建一个观察矩阵(View Matrix),将世界坐标系转换为视图坐标系。其数学表示为:
SetEye():设置相机位置
// 将相机置于 (10, 20, 50),目标点保持 (10, 20, 30)
view->SetEye(10, 20, 50);
作用:定义相机在世界坐标系中的位置。此时相机与目标点的距离为:
SetUp():设置向上方向
// 设置视图的向上方向为Y轴正方向
view->SetUp(0, 1, 0);
// 设置向上方向为Z轴正方向(俯视视角)
view->SetUp(0, 0, 1);
作用:定义相机坐标系中的“向上”向量。若设置为(0,0,1)(0,0,1)(0,0,1),则视图变为俯视模式(类似CAD的TOP视图)。
Handle(V3d_View) view = ... // 获取视图对象
// 1. 设置目标点为原点
view->SetAt(0, 0, 0);
// 2. 将相机置于Z轴正方向10个单位处
view->SetEye(0, 0, 10);
// 3. 定义Y轴向上(标准视图方向)
view->SetUp(0, 1, 0);
// 应用所有变换
view->Update();
此时视图效果等价于:
相机位置:(0,0,10)(0,0,10)(0,0,10)观察中心:(0,0,0)(0,0,0)(0,0,0)向上方向:(0,1,0)(0,1,0)(0,1,0)
SetAt() →
SetEye() →
SetUp(),避免因依赖关系导致方向异常。修改后需调用
Update()刷新视图。可通过
ConvertToGrid()将物理坐标转换为网格坐标,实现精确对齐。
通过合理组合这三个函数,可实现任意角度的视图定位,包括等轴测、俯视、旋转视角等复杂场景。

if (myView.IsNull()) return;
myView->SetAt(0.0, 0.0, 0.0); // 目标点(原点)
myView->SetEye(0.0, -100.0, 0); // 观察点在Z轴正方向(前方)
myView->SetUp(0.0, 1.0, 0.0); // Y轴向上
myView->SetScale(5); // 合适的缩放级别
myView->Redraw();
update();

if (myView.IsNull()) return;
myView->SetAt(0.0, 0.0, 0.0); // 目标点(原点)
myView->SetEye(0.0, -100.0, 0); // 观察点在Z轴正方向(前方)
myView->SetUp(0.0, 1.0, 0.0); // Y轴向上
myView->SetScale(5); // 合适的缩放级别
myView->Redraw();
update();

if (myView.IsNull()) return;
myView->SetAt(0.0, 0.0, 0.0);
myView->SetEye(0.0, 100.0, 0);
myView->SetUp(0.0, 1.0, 0.0);
myView->SetScale(5);
myView->Redraw();
update();

if (myView.IsNull()) return;
myView->SetAt(0.0, 0.0, 0.0);
myView->SetEye(0.0, 0,-100.0);
myView->SetUp(0.0, 1.0, 0.0);
myView->SetScale(5); // 合适的缩放级别
myView->Redraw();
update();
if (myView.IsNull()) return;
myView->SetAt(0.0, 0.0, 0.0);
myView->SetEye(0.0, 0,-100.0);
myView->SetUp(0.0, -1.0, 0.0);
myView->SetScale(5);
myView->Redraw();
update();

if (myView.IsNull()) return;
myView->SetAt(0.0, 0.0, 0.0);
myView->SetEye(100.0, 0,-100.0);
myView->SetUp(0, 0, 1);
myView->SetScale(5);
myView->Redraw();
update();

if (myView.IsNull()) return;
myView->SetAt(0.0, 0.0, 0.0);
myView->SetEye(100.0, 0,-100.0);
myView->SetUp(0, 0, 1);
myView->SetScale(5);
myView->Redraw();
update();