PythonOCC基础使用:基础建模指令(重要)
总目录 >> PythonOCC入门进阶到实战(目前已更新入门篇、基础篇和进阶篇)
欢迎加入pythonocc的中文社区QQ群:860536842 获取更多信息
云图三维-招募贴
云图三维 https://www.yuntucad.com 由AutoDesk、西门子等知名大牛带队,顶级VC机构连续加持,致力于国产工业软件破局。上海、重庆两地,任君选择!!
几何算法工程师(25-50k),WebGL研发工程师(20-40k)
定义模型
模型的建造将分为四个步骤:
- 建造瓶子的轮廓(profile)
- 建造瓶子的实体(body)
- 建造瓶颈处的螺纹(thread)
- 结果混合(及轮廓加本体加螺纹)
一、建造瓶子的轮廓(profile)
1.定义支撑点
要创建瓶子的轮廓,首先要创建特征点及其坐标,如下面(xoy)平面中所示。这些点将是定义轮廓几何图形的支撑。
我们将会使用如下函数来描述 三维坐标点(使用笛卡尔坐标系:xyz坐标系)from OCC.Core.gp import gp_Pnt
- 点函数gp_Pnt
aPnt1 = gp_Pnt(-width / 2.0, 0, 0)
aPnt2 = gp_Pnt(-width / 2.0, -thickness / 4.0, 0)
aPnt3 = gp_Pnt(0, -thickness / 2.0, 0)
aPnt4 = gp_Pnt(width / 2.0, -thickness / 4.0, 0)
aPnt5 = gp_Pnt(width / 2.0, 0, 0)
结果如图所示:
我们可以通过aPnt1.X()
来查看具体点的x值。注意此X为大写的。同理Y,Z
print(aPnt1.X())
-25.0
2.轮廓:定义几何图形(geometry)
基础知识补充: 我们在绘制图形的时候,一般会使用到 线Geom_Line
,圆形Geom_Circle
,这些是属于比较简单的图形,对于更为复杂的图形,我们使用贝塞尔曲线(Bezier)和B样条曲线(bspline )
借助先前定义的点,可以计算瓶子轮廓几何图形的一部分。如下图所示,它由两段(segments)GC_MakeSegment
和一段弧(arc)组成GC_MakeArcOfCircle
。
from OCC.Core.GC import GC_MakeArcOfCircle, GC_MakeSegment
aArcOfCircle = GC_MakeArcOfCircle(aPnt2, aPnt3, aPnt4)
aSegment1 = GC_MakeSegment(aPnt1, aPnt2)
aSegment2 = GC_MakeSegment(aPnt4, aPnt5)
注意aArcOfCircle ,Segment此处是无法在屏幕中显示出来的,必须经过下面拓扑信息的处理
3.轮廓:定义拓扑信息(topology)
我们已经创建了轮廓的几何图形aArcOfCircle,Segment,但这三条曲线是独立的,彼此之间没有关系。为了简化建模,将这三条曲线作为一个实体进行操作。这可以通过使用 TopoDS
包 (topology data structure 拓扑信息结构)来实现:它定义几何图形、实体之间的关系,这些几何图形、实体可以链接在一起以表示更加复杂的形状。
参考上面的表格,建造轮廓的思路,应如下:
- 三条曲线(edge:edge1,edge2,edge3)
- 由三组曲线构成一条线(wire)
使用BRepBuilderAPI_MakeEdge
类可以做出曲线(edge),使用BRepBuilderAPI_MakeWire
类可以做出线(wire)
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire
aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1.Value())
aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle.Value())
aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2.Value())aWire = BRepBuilderAPI_MakeWire(aEdge1.Edge(), aEdge2.Edge(), aEdge3.Edge())
显示如上的东西,需要注意使用aEdge2.Edge(),aWire.Wire()
才可以displayShape
显示出来。
4.完成轮廓
基础知识补充:要对形状(包括线,体)进行矩阵转换,我么借助的是 gp_Trsf
类;这种矩阵变换可以是平移、旋转、缩放、镜像或这些的组合。
我们的wire线进行镜面对称后,可以完成轮廓。因此我们需要定义一个关于全局坐标系X轴;gp_Ax1
这个类可以用来定任意轴(因此我们可以使用该类定义x轴);此类需要两个参数:点,方向(三维矢量)。当然x轴还有更简单的方法gp_OX()
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_Transform
from OCC.Core.TopoDS import topods
from OCC.Core.gp import gp_OX, gp_Trsf
# 指定x轴
xAxis = gp_OX()# 定义镜像
aTrsf = gp_Trsf()# 定义一个矩阵变换
aTrsf.SetMirror(xAxis)#矩阵变换内容为 对x轴进行镜像# 运用矩阵变换:镜像
aBRespTrsf = BRepBuilderAPI_Transform(aWire.Wire(), aTrsf)
aMirroredShape = aBRespTrsf.Shape()#得到shape
aMirroredWire = topods.Wire(aMirroredShape)#得到镜像后的wire
将现有wire添加至更大的wire中,最终得到myWireProfile
mkWire = BRepBuilderAPI_MakeWire()
mkWire.Add(aWire.Wire())
mkWire.Add(aMirroredWire)
myWireProfile = mkWire.Wire()
二、建造瓶子实体(body)
1.实体化轮廓(其实就是拉伸轮廓)
要实现瓶子的建造,首先需要创建一个实体形状。最简单的方法是使用先前创建的轮廓并沿方向拉伸。Prism
函数可以实现相应功能;它接受一个形状和一个方向作为输入,并根据以下规则生成一个新形状:
目前我们生成 的轮廓是线(wire),参考形状生成表(见上),我们需要首先生成面(face),然后才能体(solid)。
我们使用如下函数:
- BRepBuilderAPI_MakeFace,根据闭合线生成面
- BRepPrimAPI_MakePrism,拓扑信息实体化,支持最简单的方体,锥形,圆柱,球体,还有基础形状的扫略拉伸,(注意:扫描,拉伸,回转拉伸本质相同)
为了生成实体,我们使用以下代码:
from OCC.Core.gp import gp_Vec
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeFace
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakePrism
#计算面
myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile)#计算体
aPrismVec = gp_Vec(0, 0, height)#指定有限向量finite vector
myBody = BRepPrimAPI_MakePrism(myFaceProfile.Face(), aPrismVec)
myBody.Shape()
2.倒圆角
为所有的边(edge)倒角,并且倒角的半径为厚度的1/12
为了完成该功能,我们将使用如下函数:
BRepFilletAPI_MakeFillet
类,该类(你可以指定你想倒的任意边edge,并不是所有的边都必须倒的)TopExp_Explorer
类,为了使用倒角函数,需要知道边edges,而这个TopExp_Explorer
函数可以用来探索该实体的edge,返回的结果为子形状(sub-shape);同时该函数的经常会使用其子函数More
,Current
,Next
放进循环中,他们分别代表 是否有更多子形状去挖掘,知道当前被探索到的子形状是哪一个,移动到下一个子形状去探索。
在探索边的函数TopExp_Explorer
中,我们会取得所有edge,然后成为倒角的边,以下为实现函数:
#指定倒角实体
mkFillet=BRepFilletAPI_MakeFillet(myBody.Shape())
#探索实体中的边edge
anEdgeExplorer = TopExp_Explorer(myBody.Shape(), TopAbs_EDGE)#进行探索循环
while anEdgeExplorer.More():#获得当前边anEdge = topods.Edge(anEdgeExplorer.Current())#倒角当前边mkFillet.Add(thickness/12.,anEdge)#移动下一个边anEdgeExplorer.Next()
运行displayShape(mkFillet.Shape())
可以显示如下图:
3.添加瓶子的颈部
要在瓶子上加一个瓶颈,首先将创建一个圆柱体,并将其与瓶身融合(fuse合并)。半径为厚度的1/4。高度为高度的1/10。
要定位圆柱体,需要使用gp_Ax2类定义坐标系,(之前的ax1坐标系仅仅只有一个方向)从一个点和两个方向Z轴方向和X方向定义右手坐标系(Y方向自动计算出来)。为了使得颈部与瓶身顶面中心对齐,(也就是处在全局坐标系下的(0,0,myheight)可以定义一个局部坐标系;
同时为了生成圆柱体 ,我们使用BRepPrimAPI_MakeCylinder
类
neckLocation=gp_Pnt(0,0,height)
neckAxis=gp_DZ()
neckAx2=gp_Ax2(neckLocation,neckAxis)neckRadius=thickness/4
neckHeight=height/10
MKCylibnder=BRepPrimAPI_MakeCylinder(neckAx2,neckRadius,neckHeight)myBody= BRepAlgoAPI_Fuse(mkFillet.Shape(),MKCylibnder.Shape()
4.创建一个中空的实体
我们现在创建的瓶子是实体,不能够装水,因此我们需要将其挖空,分为以下步骤:
- 移去一个或多余的面,获得一个壁的表面W1
- 获取一个平行的表面w2(D是正值,则w2在外面,D是负值,则在里面)
- 从w1和w2中计算实体
为此我们可以使用BRepOffsetAPI_MakeThickSolid
类来去实现有一定厚度的实体。要找到具有这些特征的面,我们将使用explorer
函数寻找合适的面face。
在探测每一个面的时候,我们需要知道每一个面的几何特征(即他到底是平面还是曲面。)因此我们使用BRep_Tool
类,其中Surface
去探测面face,Curve
去探测边edge,Point
去探测 点 vertex。
而我们想要确认的是 是不是平面,我们将使用到 Geom_Plane
类。
对于形状的收集是 TopTools
包,因为BRepOffsetAPI_MakeThickSolid
需要一系列的东西,正好使用到TopTools_ListOfShape
类.
代码如下:
def face_is_plane(face):"""如果TopoDS_Shape是平面, 则返回True"""hs = BRep_Tool_Surface(face)downcast_result = Geom_Plane.DownCast(hs)# 如果不能往下转换downcast, 说明这个面不是平面if downcast_result is None:return Falseelse:return Truedef geom_plane_from_face(aFace):"""返回一个平面"""return Geom_Plane.DownCast(BRep_Tool_Surface(aFace))faceToRemove = None
zMax = -1# We have to work our way through all the faces to find the highest Z face so we can remove it for the shell
aFaceExplorer = TopExp_Explorer(myBody.Shape(), TopAbs_FACE)
while aFaceExplorer.More():aFace = topods.Face(aFaceExplorer.Current())if face_is_plane(aFace):aPlane = geom_plane_from_face(aFace)# We want the highest Z face, so compare this to the previous facesaPnt = aPlane.Location()aZ = aPnt.Z()if aZ > zMax:zMax = aZfaceToRemove = aFaceaFaceExplorer.Next()facesToRemove = TopTools_ListOfShape()
facesToRemove.Append(faceToRemove)myBody = BRepOffsetAPI_MakeThickSolid(myBody.Shape(), facesToRemove, -thickness / 50.0, 0.001)
三、创建螺纹(thread)
PythonOCC基础使用:基础建模指令(重要)相关推荐
- 做笔记,零基础学3D建模快速方法
多数想要学习3D建模的同学在刚刚开始学的时候,都会放下豪言壮语:我一定会通过这些视频教程和书自学成功. 随后通常半个月以后再聊到3D建模的自学情况时,往往普遍多数的同学都会不好意思的回答:哎,老师,别 ...
- 零基础学习3D建模,第一步:3D建模软件有哪些?给你科普一下
1.建模软件有很多,为大家科普下建模软件有哪些: 高模:Maya.3Dmax.Zbrush 中模:Maya.3Dmax 低模:Maya.3Dmax.Topogun 展UV:Maya.Zbrush.Un ...
- mysql 访问寄存器_汇编寄存器(内存访问)基础知识之三---mov指令
1 内存中字的存储 一个字型数据占2个内存单元,内存里面一个内存单元一个字节(8位),高地址单位放高8位,低地址单元放低8位. 注意:0号是地址单元,1是高地址单元(上是低地址,下面是高地址) (1) ...
- 零基础学3D建模,应该怎么开始学?你需要注意这些!
丑化说在前头,如果想真正学好3D建模,需要花费很多时间和功夫,不要想着轻松也不要想着一蹴而就,如果只是三分钟热度,不如趁早放弃,这些话不仅仅针对于3D建模的学习,任何专业技能的学习都一样. 面对陌生的 ...
- Redis基础 概念 数据类型 常用指令 Jedis 持久化
Redis基础 概念 数据类型 常用指令 Jedis 持久化 1. Redis 简介 1.1 NoSQL概念 1.1.1 问题现象 1.1.2 NoSQL的概念 1.2 Redis概念 1.2.1 r ...
- 3D建模:0基础如何学习建模及行业应用范围
最近很多人问我如何0基础学习3D建模,以及3D建模行业的前景如何. 今天统一给大家写一篇行业介绍,以及3D建模可以应用到哪些领域. 一.应用范围 先解释一下什么是3D建模: 总的来说,3D是一种视觉的 ...
- (2O21全新升级)初学者教程零基础学习游戏建模
入门游戏建模,从零基础变成有基础:包括美术基础,软件基础(3Dmax,ZBrush,PS) 主要包括:3Dmax基础.UV拆分和摆放.贴图绘制基础. (1)底模软件(3dmax或Maya) 你可以从基 ...
- 零基础学3D建模一般要多久?
零基础学3D次世代建模到入门,根据每个人的吸收能力,基本需要6-9个月的时间. 6-9个月是那种集训,周一到周五,每天12个小时以上的练习量. 我们的零基础次世代建模课程是7个月的时间,7(月)*4( ...
- 做3d建模的工作工资是不是很高?从零基础学习3D建模到学成功,需要多久?
关于3D建模,尤其是3D游戏建模这一块,希望能够解决大家思想上困扰,对未来的迷茫,找准自己的方向,谁的青春不迷茫,可谁不想让自己的青春绽放? 建模福利领取: 如果你想自己制作游戏动漫模型,这里专门建立 ...
- 美术0基础学游戏建模能入行么?
建模是工具,美术基础是内力,工具只是熟能生巧的过程,美术基础决定在建模行业的上线 美术基础的高低影响学习建模的速度和作品质量,以及工作后能力,甚至薪资待遇.虽然现在3D建模对于美术的门槛降低了不少,一 ...
最新文章
- 阿里内部不显示 P 序列职级,“高 P”光环成过去式?网友:这下可以装大佬了...
- 基于Python语言Hamcrest断言的使用
- java父系调用子系,获取usb设备父系或子代
- Proactor设计模式:单线程高并发
- android蓝牙通信_Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信
- arduino nano 蓝牙_贸泽开售结合蓝牙5.2与USB 2.0的 Nordic Semiconductor nRF52820多协议SoC...
- QT每日一练day1:第一个程序
- 在ADS中进行DCR仿真
- [转载] 网络硬件发展史
- c语言日历时钟编程,基于DS1302的日历时钟(1602液晶显示DS1302时钟)C语言程序设计...
- 【使用两个队列实现栈】
- python 赌场掷骰子游戏
- metis 论文串行图划分笔记
- 百度CFO王湛生死亡原因,因抢救妻女逝世
- Docker系列 搭建个人图床chevereto
- C语言的键盘输入和屏幕输出
- 【IDEA 断点调试】
- 小学计算机课在玩中学,小鹿编程“玩中学、学中玩”趣味课程让孩子爱上学习...
- Jmeter使用之——对参数进行加密
- 什么是行式数据库,什么是列式数据库