2020/07/29

3D符号开发常用概念和造型方法总结

作者 Leon

注意注意!预警,本篇纯理论介绍,较为枯燥无聊晦涩!!!


Position,坐标,这个应该都知道,比较简单

Vector,向量,稍微抽象点了,

  1. 法向量,XXX.Normal
  2. 求A点到B点的向量,Point(Pos)B.Substract(Point(Pos)A)
  3. 求向量的长度,Vector.Length
  4. 求向量A在某个面上的投影向量:VectorA.ProjectVectorToPlane(planeNormal as Vector)
  5. 求两个向量的正交向量:Vector1.Cross(Vector2),得出的结果是里面向量(食指)的右手法则的大拇指向量

Matrix4x4,坐标系矩阵,这个就更抽象了,不过我们可以简单把它理解成一个带有若干属性的坐标系,可以使用Get或Set获取或设置它的这些属性。

  1. 设置坐标系的XY轴方向,oMatrix.SetOrientation(vectorX, vectorY)
  2. 设置坐标系原点,以及XY轴方向,oMatrix.Set(Pos, VectorX, VectorY)
  3. 沿某个垂直轴旋转坐标系,oMatrix.Rotate(dAngle, normVector)
  4. 沿某个垂直轴,某个原点坐标旋转坐标系,oMatrix.Rotate(dAngle, normVector, posCenter)
  5. 沿某个向量移动坐标系,oMatrix.Translate(Vector)
  6. 转换坐标系,oMatrix.Transform(Position)/(Vector)

Geometry3D下面有几大类构造外形的基类:
Point3d:构造点   接口:IPoint;
Curve3d:构造线  接口:ICurve;
Surface3d:构造面 接口:ISurface;
GeometryPart:暂时没接触过

Point3d,点,比较简单,有现成的示例代码,这里举几个经常会用到的方法

  1. 某点延某向量便宜得到另一点,向量需要赋值长度,Point2 = Point1.Offset(Vector1)
  2. 求两点直线距离,Pos1.DistanceToPoint(Pos2)
  3. 点到面的垂直投影,

Curve3d和Surface3d下面的子类比较多,常用的介绍一下。
Curve3d下面有:

  1. New Line3D(Pos1, Pos2)
  2. New Arc3d(Pos1, Pos2, Pos3)  New Arc3d(posCenter, vecNorm, posStart, posEnd)
  3. New Circle3d(Pos1, Pos2, Pos3)  New Circle3d(posCenter, vecNorm, Radius)
  4. New Ellipse3d(psCenter, vecNorm, vecMajorAxis, dMinorMajorRatio),这个构造椭圆的方法里并没有指定任何一个半径,难道长半径直接取用长向量的长度?
  5. New EllipticalArc3d(psCenter, vecNorm, vecMajorAxis, dMinorMajorRatio, StartAngle, SweepAngle)
  6. New LineString3d(oCollPos)给多个点,直线相连,即多段线
  7. New ComplexString3d(OccurrenceConn, oCurves)复杂线集合

Surface3d下面有:

  1. New Plane3d(Pos1, Pos2, Pos3) 三点确定一面, New Plane3d(posPt, vecNorm)垂直向量加面上的一个点, New Plane3d(ComplexString3d)一个平面上的复杂线集合(非简单直线)
  2. New Cone3d(posBaseCenter, posTopCenter, posBaseStart,  posTopStart, bSolid)圆锥体绘制,确定中轴,四个点定一个面绕中轴旋转
  3. New Sphere3d(posCenter, dRadius, bSolid)画球,圆心,半径,很简单的造型
  4. New Projection3d(GenCurve, vecProjDir, dLength, bCapped) 拉伸
  5. New Revolution3d(oArc3d_1, oVecAxis, oPosCenter, dSweepAngle, bCapped) 旋转
  6. New Ruled3d(GenCurveBase, GenCurveTop, bCapped)两个线集合之间放样,这个方法对两个线集合有一定要求,使用时候需要注意,不是任意两个线集合都能放样成功
  7. Surface3d.GetSweepSurfacesFromCurve,扫略,不做过多讲解,参见自带帮助文档
  8. Surface3d.GetSweepSurfacesFromPlane,扫略,不做过多讲解,参见自带帮助文档

以上概念均属于CommonMiddle这个API,还有我们在创建符号的时候引用的一个必须的API叫CommonSymbolFunctions,这里面有一个Graphics3d类,里面几乎包含了上面我们所介绍到的所有造型方法,各位也可以通过Graphics.CreateXXX来实现造型。
我上面讲解的有些东西其实自己也不能确保百分百熟练使用,当你对某个造型方法或概念不是很确定的时候,记住一个万能的定律:试一下!


后序:大家通过上面的类和方法能看出,3D里基本上涉及到点,线,面,三种概念,而并没有涉及到实体,而且我们经常看到某些方法里会带有一个Capped的开关设置(即是否封闭),由此可见,3D里面的造型基本构成为各种点线面,而并没有真正意义上的实体。

5 1 投票
文章评分