我们能够通过PythonOCC进行三维建模来表达我们的设计意图,今天介绍模型动画的实现。
关于PythOCC
PythonOCC是python语言封装opencascade的 3D CAD/CAE/PLM开源开发框架,它提供了如下功能:复杂曲面的操作,信息转换(STEP,IGES,STL格式),用户界面可视化(基于wxpython库或者qt库),jupyter nootbook生成等。该框架采用LGPL协议,既保证了软件的开源传播,又给予了更自由的商业使用权限。
opencascade源码为c++版本,虽然能够保证运行速度,但是开发效率以及开源程度却受到了限制.pythonOCC为是opencascade的python封装版本,由tpaviot制作并发行的。Python是当前热门开源语言,在github网站上拥有着大量的repo,结合python的开源特性以及opencascade的运行效率,作者开发了PythonOCC,兼顾了运行效率以及开发效率.
程序代码
#!/usr/bin/env python
##Copyright 2009-2014 Thomas Paviot (tpaviot@gmail.com)
##
##This file is part of pythonOCC.
##
##pythonOCC is free software: you can redistribute it and/or modify
##it under the terms of the GNU Lesser General Public License as published by
##the Free Software Foundation, either version 3 of the License, or
##(at your option) any later version.
##
##pythonOCC is distributed in the hope that it will be useful,
##but WITHOUT ANY WARRANTY; without even the implied warranty of
##MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
##GNU Lesser General Public License for more details.
##
##You should have received a copy of the GNU Lesser General Public License
##along with pythonOCC. If not, see <http://www.gnu.org/licenses/>.
import time
from math import pi
from OCC.Core.gp import gp_Ax1, gp_Pnt, gp_Dir, gp_Trsf
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox
from OCC.Core.TopLoc import TopLoc_Location
from OCC.Display.SimpleGui import init_display
display, start_display, add_menu, add_function_to_menu = init_display()
ais_boxshp = None
def build_shape():
boxshp = BRepPrimAPI_MakeBox(50.0, 50.0, 50.0).Shape()
ais_boxshp = display.DisplayShape(boxshp, update=True)[0]
return ais_boxshp
def rotating_cube_1_axis(event=None):
display.EraseAll()
ais_boxshp = build_shape()
ax1 = gp_Ax1(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 0.0, 1.0))
aCubeTrsf = gp_Trsf()
angle = 0.0
tA = time.time()
n_rotations = 200
for i in range(n_rotations):
aCubeTrsf.SetRotation(ax1, angle)
aCubeToploc = TopLoc_Location(aCubeTrsf)
display.Context.SetLocation(ais_boxshp, aCubeToploc)
display.Context.UpdateCurrentViewer()
angle += 2 * pi / n_rotations
print("%i rotations took %f" % (n_rotations, time.time() - tA))
def rotating_cube_2_axis(event=None):
display.EraseAll()
ais_boxshp = build_shape()
ax1 = gp_Ax1(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 0.0, 1.0))
ax2 = gp_Ax1(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 1.0, 0.0))
a_cube_trsf = gp_Trsf()
a_cube_trsf2 = gp_Trsf()
angle = 0.0
tA = time.time()
n_rotations = 200
for i in range(n_rotations):
a_cube_trsf.SetRotation(ax1, angle)
a_cube_trsf2.SetRotation(ax2, angle)
aCubeToploc = TopLoc_Location(a_cube_trsf * a_cube_trsf2)
display.Context.SetLocation(ais_boxshp, aCubeToploc)
display.Context.UpdateCurrentViewer()
angle += 2 * pi / n_rotations
print("%i rotations took %f" % (n_rotations, time.time() - tA))
if __name__ == "__main__":
add_menu("animation")
add_function_to_menu("animation", rotating_cube_1_axis)
add_function_to_menu("animation", rotating_cube_2_axis)
start_display()
模型动画实现效果
尾言
接下来就是抛砖引玉了,大家可自行验证!碰到问题,欢迎和小编交流!
福利
推荐一款福利型小程序,每日只需完成签到和日常任务,即可兑换1~10元不等。