opencascade AIS_AnimationTimer AIS-AnimationCamera AIS_AttributeFilter AIS_AnimationAxisR源码学习 动画计时器 原创
类AIS_AnimationTimer
typedef Media_Timer AIS_AnimationTimer;
它定义了一个名为 AIS_AnimationTimer 的类型别名,该别名实际上是指向 Media_Timer 的。这意味着在代码中,你可以使用 AIS_AnimationTimer 来代替 Media_Timer,但两者实际上是相同的。这种做法通常用于提高代码的可读性或为了将某个特定的功能或库与一组特定的命名空间或前缀关联起来。
动画计时器。
类 AnimationCamera
AIS_AnimationCamera是处理相机动画的类。与AIS_Animation类类似,AIS_AnimationCamera用于在3D视图中平滑地改变相机的位置、方向或焦距,从而创建出动画效果。
方法:View
用法:获取视图
方法:SetView
用法:设置试图
方法:CameraStart
用法:获取摄像机开始的位置
方法:SetCameraStart
用法:设置摄像机开始的位置
方法:CameraEnd
用法:获取摄像机结束的位置
方法:SetCameraEnd
用法:设置摄像机结束的位置
示例和测试
首先,你需要有一个AIS_InteractiveContext实例和一个V3d_View实例,它们分别代表交互上下文和视图。然后,你可以创建一个AIS_AnimationCamera对象,并设置动画的属性和行为。
以下是一个简化的概念框架
#include <AIS_AnimationCamera.hxx>
#include <AIS_InteractiveContext.hxx>
#include <V3d_View.hxx>
// 假设你已经有了一个 AIS_InteractiveContext 实例和一个 V3d_View 实例
AIS_InteractiveContext* myContext = ...; // 初始化你的 AIS 上下文
V3d_View* myView = ...; // 初始化你的视图
// 创建一个相机动画对象
Handle(AIS_AnimationCamera) myCameraAnimation = new AIS_AnimationCamera(myView);
// 设置动画的持续时间(以秒为单位)
myCameraAnimation->SetOwnDuration(5.0); // 设置动画持续时间为5秒
// 设置动画的起始和结束状态(这通常涉及到修改相机的位置、方向等)
// 在这里,你需要通过其他OpenCASCADE API来设置相机的状态
// 例如,你可能需要修改myView的变换矩阵来设置起始和结束位置
// ... 设置起始状态 ...
// ... 设置结束状态 ...
// 启动动画
myCameraAnimation->Start();
// 在你的应用程序中,确保有一个循环来更新视图
while (/* 你的应用程序运行条件 */) {
myContext->Display(Standard_True); // 更新视图以显示动画
// 在这里添加你的事件处理和其他逻辑
}
// 当你想要停止动画时
myCameraAnimation->Stop();
类 AIS_AttributeFilter
该过滤器选择具有所需宽度或颜色的交互式对象。过滤器会询问本地上下文中的每个交互式对象,以确定它是否有一个非空的所有者,如果是,则进一步判断它是否具有所需的颜色和宽度属性。如果对象在每个情况下都返回真(即满足条件),则该对象将被保留。如果不满足条件,则会被拒绝。此过滤器仅在打开的本地上下文中使用。在收集器查看器中,您只能定位到在本地上下文打开时积极回应过滤器的交互式对象。
构造方法1: AIS_AttributeFilter (const Quantity_NameOfColor aCol)
构造一个由颜色属性定义的属性过滤器对象。
构造方法2: AIS_AttributeFilter (const Standard_Real aWidth)
构造一个由线宽度属性定义的属性过滤器对象
方法:HasColor
用法:指示交互式对象在构造时具有由参数 aCol 指定的颜色设置。
方法:HasWidth
用法:指示交互式对象在构造时具有由参数 指定的线宽度设置。
方法:SetColor
用法:设置颜色
方法:SetWidth
用法:设置宽度
方法:UnsetColor
用法:从过滤器中移除颜色设置。
方法:UnsetWidth
用法:从过滤器中移除线宽度设置。
方法:IsOk
用法:指示所选的交互式对象通过了过滤器。该对象的拥有者 anObj 可以是直接拥有者或用户。直接拥有者是与构造元素相对应的对象,而用户是实体作为其中一部分的复合形状。如果交互式对象在通过鼠标被本地上下文选择器检测到时返回 Standard_True,则该对象将被保留;否则,它将被拒绝。
示例
暂无
类AIS_AnimationAxisRotation
动画定义对象的变换。
这通常指的是使用动画来展示或实现对象(如二维图形、三维模型或界面元素)的形状、位置、大小、方向等属性随时间而发生的变化。这种变换可以通过不同的动画技术和工具来实现,以达到所需的视觉效果。
构造
//! 带初始化的构造函数。
theAnimationName 动画标识符
theContext 交互式上下文,其中对象已被显示
theObject 要应用旋转的对象
theAxis 旋转轴
theAngleStart 动画开始时的旋转角度
theAngleEnd 动画结束时的旋转角度
示例
暂无
AIS_AnimationObject.
前言:
AIS_AnimationObject是用于处理对象(通常是3D模型)动画的类。这个类提供了在3D视图中平滑地改变对象位置、方向或其他属性的功能。
与AIS_AnimationCamera类似,AIS_AnimationObject也允许你设置动画的持续时间、起始和结束状态等属性。然而,与相机动画不同,对象动画直接涉及到模型或场景中的3D对象。
方法:invalidateViewer
用法:是使视图(viewer)无效化,以触发其进行正确的更新。
这通常意味着你需要执行某些操作来确保视图(也就是用户看到的3D场景)能够反映出最近对场景或视图设置所做的更改。
在OCCT中,当你修改了3D场景中的对象、相机或其他属性,并希望这些更改能够立即在视图上反映出来时,你可能需要“使视图无效化”来强制视图进行重绘或刷新。这通常是通过调用与视图或上下文相关的更新方法来实现的,而不是直接“使视图无效化”作为一个单独的函数调用。
例如,你可以使用AIS_InteractiveContext的Display方法或类似的方法来强制视图进行更新。这将导致视图重新绘制其内容,从而反映任何最近的更改。
方法:update
用法:更新视图
示例:
以下是一个简化的概念框架,展示了如何使用
1:初始化:
首先,你需要有一个AIS_InteractiveContext实例和一个或多个3D对象(这些对象可能是通过其他OCCT类创建的,如TopoDS_Shape)。
2:创建动画对象:
创建一个AIS_AnimationObject的实例,并将其与你要动画化的对象相关联。
3:设置动画属性:
使用AIS_AnimationObject的方法设置动画的持续时间、起始和结束状态等属性。起始和结束状态通常涉及到修改对象的局部变换(如位置、方向、缩放等)。
4:启动动画:
调用AIS_AnimationObject的Start方法来启动动画。在动画播放期间,OCCT将自动根据设置的属性更新对象的状态。
5:更新和显示:
在你的应用程序中,确保有一个循环来更新视图并显示动画。这通常涉及到调用AIS_InteractiveContext的Display方法。
6:停止动画:
当你想停止动画时,调用AIS_AnimationObject的Stop方法。
Handle(AIS_Animation) anim = new AIS_Animation();
// ... 设置动画属性 ...
anim->StartTimer(0, duration, true); // 开始动画
while (!anim->IsStopped()) {
anim->UpdateTimer(); // 更新动画
myContext->UpdateCurrentViewer(); // 更新视图
// ... 其他处理 ...
}
anim->StopTimer(); // 停止动画
注意线程:
OCCT的动画处理通常是在主线程中进行的,这意味着动画可能会阻塞主线程的执行。如果你的应用程序需要保持响应性,你可能需要考虑使用单独的线程来处理动画。
联系:
yzxxty39@163.com