opencascade AIS_WalkDelta
前言
运行
方法
1.
空构造函数。
AIS_WalkDelta()
: myIsDefined(false), myIsJumping(false), myIsCrouching(false), myIsRunning(false) {}
2.
返回平移组件。
const AIS_WalkPart& operator[] (AIS_WalkTranslation thePart) ;
3.
返回平移组件。
AIS_WalkPart& operator[] (AIS_WalkTranslation thePart)
4.
返回旋转组件。
const AIS_WalkPart& operator[] (AIS_WalkRotation thePar
5.
返回旋转组件。
AIS_WalkPart& operator[] (AIS_WalkRotation thePart)
6.
返回跳跃状态。
bool IsJumping()
7.
设置跳跃状态。
void SetJumping(bool theIsJumping)
8.
返回蹲下状态。
bool IsCrouching()
9.
设置蹲下状态。
void SetCrouching(bool theIsCrouching)
10.
返回运行状态。
bool IsRunning() const { return myIsRunning; }
11.
设置运行状态。
void SetRunning(bool theIsRunning)
12.
如果即使从上一帧的增量为空,导航键仍被按下,则返回 TRUE。
bool IsDefined()
13.
设置是否有任何导航键被按下。
void SetDefined(bool theIsDefined) { myIsDefined = theIsDefined; }
14.
当旋转和平移增量都为空时返回 TRUE。
bool IsEmpty() const { return !ToMove() && !ToRotate(); }
15.
如果平移增量被定义则返回 TRUE。
bool ToMove()
16.
如果旋转增量被定义则返回 TRUE。
bool ToRotate()
使用示例
AIS_WalkDelta
是 OpenCASCADE 库的一部分,用于处理 3D 视图中步行导航的状态和动作。虽然 OpenCASCADE 的文档中可能没有明确的示例,但我们可以根据 AIS_WalkDelta
类的功能,编写一个假想的使用示例,展示如何在应用程序中设置和获取步行状态。
下面是一个简单的代码示例,演示如何使用 AIS_WalkDelta
来管理步行的状态:
#include <AIS_WalkDelta.hxx>
#include <AIS_WalkPart.hxx>
#include <iostream>// 模拟一个函数来检查和打印步行状态
void PrintWalkState(const AIS_WalkDelta& walkDelta) {std::cout << "Jumping: " << (walkDelta.IsJumping() ? "Yes" : "No") << std::endl;std::cout << "Crouching: " << (walkDelta.IsCrouching() ? "Yes" : "No") << std::endl;std::cout << "Running: " << (walkDelta.IsRunning() ? "Yes" : "No") << std::endl;if (walkDelta.ToMove()) {std::cout << "Moving: Yes" << std::endl;} else {std::cout << "Moving: No" << std::endl;}if (walkDelta.ToRotate()) {std::cout << "Rotating: Yes" << std::endl;} else {std::cout << "Rotating: No" << std::endl;}
}int main() {// 创建一个 AIS_WalkDelta 对象AIS_WalkDelta walkDelta;// 设置运行状态walkDelta.SetJumping(true);walkDelta.SetCrouching(false);walkDelta.SetRunning(true);// 模拟一些平移和旋转设置AIS_WalkPart translationPart;translationPart.SetDelta(1.0); // 假设有一个增量walkDelta[AIS_WalkTranslation_Forward] = translationPart;AIS_WalkPart rotationPart;rotationPart.SetDelta(0.5); // 假设有一个旋转增量walkDelta[AIS_WalkRotation_Yaw] = rotationPart;// 打印当前的步行状态PrintWalkState(walkDelta);return 0;
}
示例说明
-
创建
AIS_WalkDelta
实例:我们创建了一个AIS_WalkDelta
对象walkDelta
来管理步行的状态。 -
设置状态:使用
SetJumping
、SetCrouching
和SetRunning
函数来设置步行的状态。 -
设置平移和旋转:使用
AIS_WalkTranslation
和AIS_WalkRotation
设置对象的平移和旋转状态。这里,我们为每个状态分配了一个假想的增量。 -
打印状态:通过调用
PrintWalkState
函数,打印当前的步行状态,包括是否在跳跃、蹲下、奔跑,以及是否有平移和旋转的增量。
参考
opencascade AIS_ViewInputBuffer
前言
定义查看器事件的辅助结构
方法
1
bool IsNewGesture; //!< 从一个动作过渡到另一个动作
2
NCollection_Sequence<Aspect_ScrollDelta> ZoomActions; //!< 缩放操作队列
3
struct _orientation
{
bool ToFitAll; //!< 执行 FitAll 操作
bool ToSetViewOrient; //!< 设置新的视图方向
V3d_TypeOfOrientation ViewOrient; //!< 新的视图方向
_orientation() : ToFitAll(false), ToSetViewOrient(false), ViewOrient(V3d_Xpos) {}
} Orientation;
4
struct _highlighting
{
bool ToHilight; //!< 在指定点执行动态高亮
Graphic3d_Vec2i Point; //!< 动态高亮的新点
_highlighting() : ToHilight(false) {}
} MoveTo;
5
struct _selection
{
AIS_ViewSelectionTool Tool; //!< 执行选择
AIS_SelectionScheme Scheme; //!< 选择方案
NCollection_Sequence<Graphic3d_Vec2i>
Points; //!< 选择点
bool ToApplyTool; //!< 应用橡皮筋选择工具
_selection() : Tool(AIS_ViewSelectionTool_Picking), Scheme(AIS_SelectionScheme_UNKNOWN), ToApplyTool(false) {}
} Selection;
6
struct _panningParams
{
bool ToStart; //!< 开始平移
Graphic3d_Vec2i PointStart; //!< 平移起点
bool ToPan; //!< 执行平移
Graphic3d_Vec2i Delta; //!< 平移增量
_panningParams() : ToStart(false), ToPan(false) {}
} Panning;
7
struct _draggingParams
{
bool ToStart; //!< 开始拖动
bool ToMove; //!< 执行拖动
bool ToStop; //!< 停止拖动
bool ToAbort; //!< 中止拖动(恢复之前的位置)
Graphic3d_Vec2i PointStart; //!< 拖动起点
Graphic3d_Vec2i PointTo; //!< 拖动终点
_draggingParams() : ToStart(false), ToMove(false), ToStop(false), ToAbort(false) {}
} Dragging;
8
struct _orbitRotation
{
bool ToStart; //!< 开始轨道旋转
Graphic3d_Vec2d PointStart; //!< 轨道旋转起点
bool ToRotate; //!< 执行轨道旋转
Graphic3d_Vec2d PointTo; //!< 轨道旋转终点
_orbitRotation() : ToStart(false), ToRotate(false) {}
} OrbitRotation;
9
struct _viewRotation
{
bool ToStart; //!< 开始视图旋转
Graphic3d_Vec2d PointStart; //!< 视图旋转起点
bool ToRotate; //!< 执行视图旋转
Graphic3d_Vec2d PointTo; //!< 视图旋转终点
_viewRotation() : ToStart(false), ToRotate(false) {}
} ViewRotation;
10
struct _zrotateParams
{
Graphic3d_Vec2i Point; //!< Z 轴旋转起点
double Angle; //!< Z 轴旋转角度
bool ToRotate; //!< 开始 Z 轴旋转
_zrotateParams() : Angle(0.0), ToRotate(false) {}
} ZRotate;
11
重置事件缓冲区。
void Reset()
示例:使用 AIS_ViewInputBuffer
这个例子演示了如何在 OpenCASCADE 应用程序中使用 AIS_ViewInputBuffer
来处理 3D 查看器的用户输入事件。
#include <AIS_InteractiveContext.hxx>
#include <V3d_View.hxx>
#include <AIS_ViewInputBuffer.hxx>
#include <AIS_ViewController.hxx>
#include <Aspect_Handle.hxx>
#include <Aspect_VKeyMouse.hxx>
#include <Aspect_VKeyFlags.hxx>
#include <Graphic3d_Vec2.hxx>
#include <iostream>// Function to simulate handling events
void HandleViewerEvents(AIS_ViewInputBuffer& inputBuffer, const Handle(AIS_InteractiveContext)& context, const Handle(V3d_View)& view)
{// Example: Check if a new gesture has startedif (inputBuffer.IsNewGesture){std::cout << "New gesture started!" << std::endl;inputBuffer.IsNewGesture = false; // Reset the gesture flag after handling}// Example: Handle zoom actionsfor (const auto& zoomDelta : inputBuffer.ZoomActions){std::cout << "Zooming by delta: " << zoomDelta.Delta << std::endl;view->SetZoom(zoomDelta.Delta);}inputBuffer.ZoomActions.Clear(); // Clear zoom actions after processing// Example: Handle panningif (inputBuffer.Panning.ToPan){std::cout << "Panning with delta: (" << inputBuffer.Panning.Delta.x() << ", " << inputBuffer.Panning.Delta.y() << ")" << std::endl;view->Pan(inputBuffer.Panning.Delta.x(), inputBuffer.Panning.Delta.y());inputBuffer.Panning.ToPan = false; // Reset panning flag after handling}// Example: Handle rotationif (inputBuffer.ViewRotation.ToRotate){std::cout << "Rotating view from: (" << inputBuffer.ViewRotation.PointStart.x() << ", " << inputBuffer.ViewRotation.PointStart.y()<< ") to (" << inputBuffer.ViewRotation.PointTo.x() << ", " << inputBuffer.ViewRotation.PointTo.y() << ")" << std::endl;view->Rotate(inputBuffer.ViewRotation.PointStart.x(), inputBuffer.ViewRotation.PointStart.y(),inputBuffer.ViewRotation.PointTo.x(), inputBuffer.ViewRotation.PointTo.y());inputBuffer.ViewRotation.ToRotate = false; // Reset rotation flag after handling}// Example: Handle selectionif (inputBuffer.Selection.ToApplyTool){std::cout << "Applying selection tool" << std::endl;context->Select(true); // Assume some selection mechanisminputBuffer.Selection.ToApplyTool = false; // Reset selection tool flag after handling}
}int main()
{// Initialize application componentsHandle(V3d_Viewer) viewer; // Assume this is properly initializedHandle(AIS_InteractiveContext) context = new AIS_InteractiveContext(viewer);Handle(V3d_View) view = viewer->CreateView();// Create input bufferAIS_ViewInputBuffer inputBuffer;// Simulate some inputsinputBuffer.IsNewGesture = true;// Simulate a zoom actionAspect_ScrollDelta zoomDelta;zoomDelta.Delta = 1.1;inputBuffer.ZoomActions.Append(zoomDelta);// Simulate a panning actioninputBuffer.Panning.ToPan = true;inputBuffer.Panning.Delta = Graphic3d_Vec2i(5, 10);// Simulate a rotationinputBuffer.ViewRotation.ToRotate = true;inputBuffer.ViewRotation.PointStart = Graphic3d_Vec2d(100, 100);inputBuffer.ViewRotation.PointTo = Graphic3d_Vec2d(150, 150);// Handle the simulated eventsHandleViewerEvents(inputBuffer, context, view);return 0;
}
代码解释
-
初始化:在示例中,初始化了必要的 OpenCASCADE 组件,如
V3d_Viewer
、AIS_InteractiveContext
和V3d_View
。创建了一个AIS_ViewInputBuffer
来存储事件数据。 -
事件处理:
- 手势:代码检查是否开始了新的手势,并通过打印消息进行处理。
- 缩放:遍历
ZoomActions
中的每个缩放增量,并将其应用于视图。 - 平移:检查是否请求平移,并将平移增量应用于视图。
- 旋转:处理视图旋转,使用起始点和终止点进行操作。
- 选择:检查是否需要应用选择工具,并执行选择操作。
-
模拟输入:示例中模拟了一些用户输入,如缩放、平移和旋转操作,以展示如何使用
AIS_ViewInputBuffer
。
这个示例提供了一个基本框架,演示了如何使用 AIS_ViewInputBuffer
在 OpenCASCADE 中处理各种查看器交互。
参考
参考