按照官网的User guide,现在介绍模型数据部分。本章先介绍点与向量。
**模型数据(Model Data,MD)**是用来描述三维物体形状的工具。它分为两部分:
- 几何:就是物体的外形,比如曲线和曲面,帮助我们画出物体的轮廓。
- 拓扑:就是描述这些外形如何连接在一起,像是拼图一样,把不同的部分组合成一个完整的物体。
这样,模型数据就能帮助我们准确地在三维空间中表示物体的形状。
本文介绍 点 与 向量
什么是pg_Pnt和pg_Vect
- 点(gp_Pnt):表示三维空间中的一个位置,比如一个具体的坐标点 (X, Y, Z)。
- 向量(gp_Vec):表示一个方向和大小,通常是从一个点指向另一个点的“箭头”。
gp是什么意思
gp_
是一个命名空间前缀,用来表示几何和数学基础类。gp_
代表了 Geometry and Positioning (几何与定位),是 Open CASCADE 几何库的一部分,主要用于处理几何实体、坐标系、向量、点等数学构造。
向量的作用
-
表示方向:
- 向量可以表示物体的运动方向、法线方向、旋转方向等。
-
计算距离:
- 向量可以表示两个点之间的距离或差异。例如,计算两个点之间的直线距离。
-
加法和减法:
- 向量可以相加或相减,帮助你合成多个方向的效果,或者计算它们之间的差异。
-
点与向量的结合:
- 向量可以用来从一个点沿某个方向移动,得到一个新位置。例如,用一个向量从一个点出发,得到另一个点。
-
点积和叉积:
- 向量可以进行数学运算,如点积(计算夹角)和叉积(计算垂直方向)。这些在计算几何和物体定位时非常有用。
-
缩放和旋转:
- 向量可以被缩放(放大或缩小)或旋转,用于物体变形、旋转等操作。
-
001-MD-PointAndVector.h
#pragma once #include "BaseScene.h" #include "VisSceneComponents.h" class MDPointAndVector001 : public BaseScene, public VisSceneComponents { public: void displayScene(Handle(V3d_View)& view, Handle(AIS_InteractiveContext)& context) override { //<创建起始点 // 1. 使用默认构造函数创建一个零点 gp_Pnt point1; // 2. 使用三维坐标创建一个点 gp_Pnt point2(1.0, 2.0, 3.0); // 3. 使用另外一个点来构造新点 gp_Pnt point3 = point2; //<创建Vector // 1. 使用默认构造函数创建一个零向量 gp_Vec vec1; // 2. 使用两个点之间的差值创建向量 gp_Pnt p1(2.0, 3.0, 4.0); gp_Pnt p2(1.0, 3.0, 5.0); gp_Vec vec2(p1, p2); // vec2 = p2 - p1 // 3. 使用三维坐标直接创建一个向量 gp_Vec vec3(7.0, 8.0, 9.0); //<向量计算演示 // 计算两个向量之间的加法 gp_Vec vec4 = vec2 + vec3; // vec4 = vec2 + vec3 计算向量的点积 //Standard_Real dotProduct = vec2.Dot(vec3); 计算向量的叉积 //gp_Vec crossProduct = vec2.Crossed(vec3); //<可视化 visPoint(point2, context); // 可视化点 visVector(gp_Pnt(7.0, 8.0, 9.0), vec2, context, makeColor(0.4157, 0.5020, 0.7255)); // 可视化向量vec2 visVector(point1, vec3, context, makeColor(0.5333, 0.6196, 0.4510)); // 可视化向量加法结果 visVector(point1, vec4, context, makeColor(0.6627, 0.2902, 0.2902)); // 可视化向量叉积结果 } };
-
001-MD-PointAndVector.cpp
#include "001-MD-pointAndVector.h" #include "SceneSelector.h" namespace { struct Registrar { Registrar() { SceneSelector::RegisterScene("001-MD-PointAndVector", []() { return std::make_shared<MDPointAndVector001>(); }); } }; static Registrar registrar; }
-
VisSceneComponents.h
为了解耦和遵守DRY(Don’t Repeat Yourself)原则,我把可视化代码放在了单独的头文件中,以后context的可视化相关函数就先放这边了。#pragma once #include <AIS_Shape.hxx> #include <TopoDS_Shape.hxx> #include <BRepBuilderAPI_MakeVertex.hxx> #include <BRepBuilderAPI_MakeEdge.hxx> #include <BRepBuilderAPI_MakeFace.hxx> #include <V3d_View.hxx> #include <gp_Pnt.hxx> #include <gp_Vec.hxx> #include <AIS_InteractiveContext.hxx> #include <BRepBuilderAPI_MakeWire.hxx> class VisSceneComponents { public: // 构造函数 VisSceneComponents() = default; // 可视化一个点 void visPoint(const gp_Pnt& point, Handle(AIS_InteractiveContext)& context) { Handle(AIS_Shape) pointShape = new AIS_Shape(BRepBuilderAPI_MakeVertex(point).Shape()); context->Display(pointShape, Standard_True); } // 可视化一个向量 void visVector(const gp_Pnt& startPoint, const gp_Vec& vector, Handle(AIS_InteractiveContext)& context) { gp_Pnt endPoint = startPoint.Translated(vector); Handle(AIS_Shape) edgeShape = new AIS_Shape(BRepBuilderAPI_MakeEdge(startPoint, endPoint).Shape()); context->Display(edgeShape, Standard_True); } };