V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cqcn1991
V2EX  ›  问与答

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

  •  
  •   cqcn1991 · 2015-06-26 11:59:30 +08:00 · 2604 次点击
    这是一个创建于 3439 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    12 条回复    2015-06-27 07:30:58 +08:00
    mhycy
        1
    mhycy  
       2015-06-26 12:20:51 +08:00
    真要有这样的数据的话遍历一次不就行了么?
    cqcn1991
        2
    cqcn1991  
    OP
       2015-06-26 12:27:22 +08:00 via iPhone
    @mhycy 什么意思?
    mhycy
        3
    mhycy  
       2015-06-26 13:18:13 +08:00
    @cqcn1991 解析数据才是难点。。
    对于那些点,除了三维坐标外还有这个点与另一个点的连接参数。绘制截面肯定绕不开这个
    cqcn1991
        4
    cqcn1991  
    OP
       2015-06-26 16:45:38 +08:00
    @mhycy 所以CAD这方面到底是怎么做的啊。。。。
    manhere
        5
    manhere  
       2015-06-26 17:25:12 +08:00 via iPhone
    tree.js
    acros
        7
    acros  
       2015-06-26 17:54:23 +08:00
    Python库不知道。
    保存3D物体数据最简单的方法,参考DirectX的.x文件一类,你文本格式打开文件一看就明白了。
    最简单的例子,按常规方式,图形都是三角面片化的。一个数组记录顶点位置,一个数组表示面片绘制顺序(逆时针表示正面)。
    acros
        8
    acros  
       2015-06-26 18:02:25 +08:00
    一下子好像说不清,找个openGL教程,看看前面几节应该就明白了,顶点数组和顶点索引数组的概念。
    至于CAD文件····啥文件,FBX? 这个有FBX SDK说明格式的详细文档来着。
    dong3580
        9
    dong3580  
       2015-06-26 19:19:17 +08:00 via Android
    @manhere
    对tree. js的卡屏程度佩服到极点,强大且粗暴
    miniwoodman
        10
    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
        11
    cqcn1991  
    OP
       2015-06-26 21:43:29 +08:00
    @miniwoodman 目前主要不是做界面,是拿来做计算和分析。所以Three.js这些主要就是显示?
    那拿来看看怎么存储3d实体应该也是有帮助的
    其实我想做的,都是高中立体几何上类似的内容(截面啊什么之类的),只是这方面库确实没找到啥...
    miniwoodman
        12
    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/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1123 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:36 · PVG 07:36 · LAX 15:36 · JFK 18:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.