tkinter的开源微型3D引擎

tiny-3d-engine的Python项目详细描述


微型3D引擎

logo

Tkinter是基于这个三维图形包的python引擎。 它使用Numpy进行数学处理。在

它在pipy上可用, 文档位于readtthedocs,源代码在gitlab.com上镜像

使用安装此

pip install tiny_3d_engine

它为barstriquad元素创建simle三维渲染,并以Ensight的ASCII.geo格式存储场景。 一个简单的网格看起来像:

trivial_example

加载模型

在这个简单的例子中,一个.geo文件被加载到一个3D场景中。这个场景被赋予一个新的引擎对象Engine3D。在渲染屏幕上的场景之前,我们应用一个旋转.rotate(),然后将交互留给用户.mainloop()。在

^{pr2}$

场景和引擎

场景是存储三维模型的对象。 空场景就是None。可以使用.update()方法更新场景。每个场景处理由一个名称标识的几个部分,一个看起来像-tag-(例如"ceiling")或-family-.-tag-(例如"house.ceiling")的字符串。在

引擎用于在2D屏幕上投影场景。 一旦启动,就可以通过.translate().rotate()等方法来控制视点,然后用.render()刷新。场景可以用.update()更新。如果您希望用户与结果交互,请使用典型的TK.mainloop()完成。在

如果我已经有了顶点和多边形呢?在

在下面的示例中,使用方法scene.add_or_update_part,将两个正方形附加到初始void ^{str1}$Scene3D对象。在

  • 第一个是蓝色的,由边组成(2个顶点连接)
  • 第_二_个_是_红色_的_ , _是_od_正方形_ ( _4_个_顶点_连通_ )_

此场景被传递到Engine3D对象,触发一个窗口。在

fromtiny_3d_engineimport(Scene3D,Engine3D)scene=Scene3D()SIZE=2LENGTH=200.points=list()conn=list()dx=LENGTH/foriinrange(SIZE):forjinrange(SIZE):index=len(points)points.append([i*dx,j*dx,0])points.append([(i+1)*dx,j*dx,0])points.append([i*dx,(j+1)*dx,0])points.append([(i+1)*dx,(j+1)*dx,0])conn.append([index,index+1])conn.append([index+3,index+1])scene.update("square1",points,conn,color="#0000ff")points=list()conn=list()foriinrange(SIZE):forjinrange(SIZE):index=len(points)points.append([i*dx,j*dx,LENGTH])points.append([(i+1)*dx,j*dx,LENGTH])points.append([i*dx,(j+1)*dx,LENGTH])points.append([(i+1)*dx,(j+1)*dx,LENGTH])conn.append([index,index+1,index+3,index+2])scene.update("square2",points,conn,color="#ff0000")test=Engine3D(scene)test.rotate("x",45)test.rotate("y",45)test.render()test.mainloop()

(在numpy中会更容易,但我想让非numpy程序员能够阅读它)

命令行

提供了一个小的命令行界面:

Usage: tiny_3d_engine [OPTIONS] COMMAND [ARGS]...

  ---------------    TINY_3D_ENGINE  --------------------

  You are now using the Command line interface of Tiny 3D engine, a Python3
  Tkinter lightweight 3D engine, created at CERFACS (https://cerfacs.fr).

  This package is likely as a dependency of other packages, to
  provide a light 3D feedback for small 3D scenes <100000 polygons. This
  CLI is given here for developers perusal and demonstrations. Find the
  script of these small tools in the /examples folder of the package.

  This is a python package currently installed in your python environement.
  See the full documentation at :
  https://tiny-3d-engine.readthedocs.io/en/latest/.

  DISCLAIMER: Tiny 3D engine is a brute force flat renderer. As it is NOT
  using your graphical card,  do not excpect anything fancier than a 1980
  video game.

Options:
  --help  Show this message and exit.

Commands:
  bench   Run a short benchmark on your machine.
  load    Load a 3D scene from FILENAME.
  rabbit  Run a demo with the Stanford Rabbit.

表演

不要期待超过90年代早期的电子游戏。在鼠标交互期间,每秒的帧数大约为30000/nb。多边形数(即2000个多边形为15 fps)。在

默认情况下,静态视图中的引擎限制为100000个多边形,在鼠标交互时限制为2000个多边形。如果模型超出了这些限制,引擎会在加载时迅速删除多边形,以保持窗口的响应。在

要求

现在的图书馆需要Numpy和Tkinter。 Tk方面仅限于screen对象。 将来我可能会为PyQT4 Canvas或Matplotlib编写扩展。。。或者不是。在

起源

这项工作源于我的一个纯Tcl/Tk引擎 pure TK 3d enginehenry HaefligerpyEngine3D的pyEngine3D主机的混合,因为我非常喜欢这个API。在

目前的一个允许加载多个部分,并使用numpy。 场景可以被转储或从Ensight.case/.geo文件中读取。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何读取、验证和移动数据。csv文件?   用于在线蛇游戏的java解析scaing   java JavaFX:在窗口上移动元素(阶段)调整大小   mysql如何使用java中的IOUtils包在jsp中显示多个图像?   Java dateFormat不可解析日期异常   spring mvc java。执行单元测试时lang.AssertionError   java在一个webapp中运行多个调度器有什么问题吗?   JAVAlang.ArrayIndexOutofBounds异常:1未来。get()多线程   java使用MDC或spring boot中的任何过滤器屏蔽日志消息中的密码,而不使用logback。xml文件   与应用服务器的java AJP和SSL通信   java Hibernate更新列表中的特定对象   Java小程序:使用keylistener移动多边形   java访问是一个独立于MainActivity的进程   来自服务器的java重复密钥或完整性约束冲突消息:“列“volume”不能为null”   java是否有任何方法可以确保在Flink on job cancel with savepoint上通知所有检查点侦听器检查点完成?