有什么处理简单的 3D 模型的 Library 吗?

2015-06-26 11:59:30 +08:00
 cqcn1991

很久前问过一次,不过当时说不太清楚,最近想清楚了一些,重新再问一遍
比如说给一个矩形/多边形棱柱,能够得到高度在z时的截面?
另外,想问一下CAD这类文件,是怎么保存3D物体的?是把各个角点和棱边都保存下来,比如
3d = [
points = [0,0,0;0,0,1...]
lines = [[[0,0,0],[0,0,1]],[],[]...]
]
这种?

不知道什么语言有这方面的库?Python?

2629 次点击
所在节点    问与答
12 条回复
mhycy
2015-06-26 12:20:51 +08:00
真要有这样的数据的话遍历一次不就行了么?
cqcn1991
2015-06-26 12:27:22 +08:00
@mhycy 什么意思?
mhycy
2015-06-26 13:18:13 +08:00
@cqcn1991 解析数据才是难点。。
对于那些点,除了三维坐标外还有这个点与另一个点的连接参数。绘制截面肯定绕不开这个
cqcn1991
2015-06-26 16:45:38 +08:00
@mhycy 所以CAD这方面到底是怎么做的啊。。。。
manhere
2015-06-26 17:25:12 +08:00
tree.js
jkunw
2015-06-26 17:46:57 +08:00
acros
2015-06-26 17:54:23 +08:00
Python库不知道。
保存3D物体数据最简单的方法,参考DirectX的.x文件一类,你文本格式打开文件一看就明白了。
最简单的例子,按常规方式,图形都是三角面片化的。一个数组记录顶点位置,一个数组表示面片绘制顺序(逆时针表示正面)。
acros
2015-06-26 18:02:25 +08:00
一下子好像说不清,找个openGL教程,看看前面几节应该就明白了,顶点数组和顶点索引数组的概念。
至于CAD文件····啥文件,FBX? 这个有FBX SDK说明格式的详细文档来着。
dong3580
2015-06-26 19:19:17 +08:00
@manhere
对tree. js的卡屏程度佩服到极点,强大且粗暴
miniwoodman
2015-06-26 21:22:59 +08:00
@cqcn1991

第一个也许符合你的要求

PythonOCC is 3D CAD/CAE/PLM development framework for the Python programming language
http://www.pythonocc.org/


http://vpython.org/

http://stackoverflow.com/questions/6650368/3d-model-viewer-using-python

以上是Python的
-------------------------------

http://threejs.org/
http://babylonjs.com/

这是两个目前最著名的 Javascript HTML5 WebGL 3D 库,但主要是渲染与交互, 没什么对3D模型的CAD类操作处理能力, 这方面的需求目前恐怕还是要自行编码。
-------------------------------
cqcn1991
2015-06-26 21:43:29 +08:00
@miniwoodman 目前主要不是做界面,是拿来做计算和分析。所以Three.js这些主要就是显示?
那拿来看看怎么存储3d实体应该也是有帮助的
其实我想做的,都是高中立体几何上类似的内容(截面啊什么之类的),只是这方面库确实没找到啥...
miniwoodman
2015-06-27 07:30:58 +08:00
@cqcn1991 Three.js 目前还只是显示, 因为WebGL推出主要目标是让浏览器直接支持3D内容的显示, 而 Three.js 是一个 WebGL API 的封装, 也许将来会集成一些 3d Model 的计算功能, 只不过这种功能完全可以由另一个开源的 Library 来实现, 也许现在就有这种 Library, 但还没找到。


其实我想你的疑问可能不是这些,而是到底 3d 模型在程序中是如何组织的, 粗略的说分两种应用场合, 一种显示交互, 第二种是计算分析。

几乎所有平台上的3D游戏都是第一种情况, 这种情况下 3d 模型在内存的存储完全简单化、标准化--
--只有顶点和三角形(四边形也好, 新技术Tessellation等在这里可以忽略)

3d 模型文件中最简单的是 .obj 格式, 是纯文本的。
.obj 格式的文件也最接近这种内存中的组织形式:
比如一个三角形

v 1.000000 1.000000 1.000000
v 2.000000 1.000000 1.000000
v 1.000000 2.000000 1.000000
f 1 2 3

v 代表"顶点",f 代表“面"(三角形、四边形)。
如果是立方体,那就是8个顶点,和6个四边形,或者12个三角形

游戏中没有另外存储三角形的“边”, 因为边已经隐含在"面"中了。
游戏在运行时几乎不关心3D模型的形体/形状, 物理引擎部分除外,游戏只是不断的把视野中的三角形推送给显卡来显示,无论是一个还是几十万个。


第二中场合 计算和分析主要应用在工程、医学、科学领域,这些情况下就复杂的多,
数据存储有 3d参数曲线、参数曲面 和可用参数方程表示的3d几何体,我是不了解,我主要是做显示交互这块的。

如果只是需要计算截面,可以不用管那么复杂数据存储, 游戏那种3D数据格式同样可以拿来计算。
向楼上说的那样,可以用类似3D打印的求界面的方法
https://ravehgonen.wordpress.com/tag/plane-triangle-intersection/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/201339

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX