CATIA二次开发—视图及视点

CATIA二次开发—视图及视点,第1张

CATIA二次开发—视图及视点

0 前言

本来CATIA二次开发这个系列已经停更了,但受到开发群( 群号:1046217363,人数:550+)里的群友们的鼓励,所以打算继续更新下去。但是写这样的技术文章并非易事,一方面要保证文章质量,具有可读性;另一方面也要考虑避开所在公司的具体业务,所以需要花费笔者大量空余时间来整理并且发布,如果读者觉得对您有帮助,也希望能给予支持。好了,进入正题,本篇主要围绕视图和视点展开,并根据所学知识开发了一款交互式生成视点可视化图形的功能。

相机Camera
  • 新建相机
var newCamera = view3D.NewCamera();
newCamera.set_Name("newCamera");
  • 获取相机
var visuServices = CatiaService.catia.GetSessionService("VisuServices") as VisuServices;
visuServices.Cameras.Item("newCamera");
视图Viewer3D
SpecsAndGeomWindow specsAndGeomWindow1 = CatiaService.catia.ActiveWindow as SpecsAndGeomWindow;
Viewer3D view3D = specsAndGeomWindow1.ActiveViewer as Viewer3D;
  • 导航模式
//  *** 作模式
view3D.NavigationStyle = CatNavigationStyle.catNavigationExamine;
// 步行模式
view3D.NavigationStyle = CatNavigationStyle.catNavigationWalk;
// 飞行模式
view3D.NavigationStyle = CatNavigationStyle.catNavigationFly;

The examining navigation style. Examining means that you move the scene but you don’t move yourself.

*** 作模式,也就是说只移动模型场景,观察者的视角是不变的。

The walking navigation style. When you choose this style and moves the mouse on the scene, it changes as if you were walking in.

步行式导航,场景是根据人的位置和视角在变的。

The flying navigation style. When you choose this style and moves the mouse on the scene, it changes as if you were flying in.

飞行式导航,场景是根据飞行的位置和视角在变的。

 步行式导航和飞行式导航的区别在于飞行模式下视角的高度是可以变的。

视点Viewpoint3D

相机和视图均具有视点属性

// 三维视点
var viewpoint3D = (newCamera as Camera3D).Viewpoint3D;
// 二维视点
var viewpoint2D = (newCamera as Camera2D).Viewpoint2D;
  • 获取并设置视点的原点坐标
object[] originPt = new object[3];
view3D.Viewpoint3D.GetOrigin(originPt);
view3D.Viewpoint3D.PutOrigin(originPt);
view3D.Update();

❓上述originPt数组的定义为什么是object,换成double是否可以?

不可以。API 中参数类型为CATSafeArrayVariant,若将参数变量明确规定为浮点数,则会产生 “ 指定的数组不属于需要的类型 “ 的报错,导致程序无法正常运行。

 原因分析:存在一些 CATIA VBA 中的接口方法采用C++语言编写,虽然VB、C#和C++都是面向.NET平台的编程语言,具有跨语言互 *** 作性,但由于语言设计的差异,也会有一些例外情况,如下图,C#对类名是区分大小写的,可定义 baseBussiness 和 baseBussiness 两个类,用 VB 去继承 baseBussiness 类时,出现指代不明的报错,这是因为 VB 语言对类名不区分大小写的缘故。因此,此处是在变量类型传递时出现的类型不匹配现象。

✔️ 解决办法:不要指定数组类型,用 Object 代替。

  • 设置视线的方向
object[] originPt = new object[3];
view3D.Viewpoint3D.GetSightDirection(originPt);
view3D.Viewpoint3D.PutSightDirection(originPt);
view3D.Update();
  • 设置视线向上方向
object[] originPt = new object[3];
view3D.Viewpoint3D.GetUpDirection(originPt);
view3D.Viewpoint3D.PutUpDirection(originPt);
view3D.Update();

为什么需要视点的向上方向?因为在视线固定的情况下,我们既可以正着看,也可以斜着看。

根据上述提供的方法,笔者制作了一个交互式生成视点可视化图形的工具,转动到任意位置点击按钮即可生成一个可视化的视点,其结果如下图所示,同时也发现视线向上方向总是与视线方向垂直。如需源代码见文章结尾的付费内容。

  • 视点焦距
// 单位是mm
view3D.Viewpoint3D.FocusDistance = 40000;

模型的缩放就是调整焦距的过程,焦距越小,模型显示范围越小,模型比例也越大。

  • 视野

人眼所能看到的范围,通常以角度表示,物体超过这个角就不会被看到。

 人眼集中注意力时的​视野25度左右。

// 视野调整为10度
view3D.Viewpoint3D.FieldOfView = 10;
view3D.Update();

软件本身提供交互式视野变化功能

透视相机视野调整

正交相机视野调整

 视野变化仅在透视相机时生效,正交相机时被忽略,所谓正交和透视相机如下图所示。

正交相机(近处的羊和远处的羊一样大)

透视相机(距视点越远,羊越小)

旋转Rotate
  • Sub Rotate( CATSafeArrayVariant iAxis, double iAngle)

Applies a rotation. The rotation of iAngle degrees is applied to the viewer’s contents around the axis iAxis (an array of 3 Variants), the invariant point being the target (ie: Origin + FocusDistance*SightDirection).

SpecsAndGeomWindow specsAndGeomWindow1 = CatiaService.catia.ActiveWindow as SpecsAndGeomWindow;
Viewer3D view3D = specsAndGeomWindow1.ActiveViewer as Viewer3D;
// 绕Z轴旋转
object[] zAxis = { 0, 0, 1 }; 
view3D.Rotate(zAxis, 10);
平移Translate
object[] axis = { 0, 0, 10};
// 沿Z轴平移
Services.CatiaService.view3D.Translate(axis);
更新视图
view3D.Update();
参考文献

计算机图形学-3D观察与图像渲染流水线

Camera.fieldOfView 视野

源代码见公众号

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5610914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存