【问题标题】:Autodesk Maya api - import geometryAutodesk Maya api - 导入几何体
【发布时间】:2014-11-11 04:18:55
【问题描述】:

您好,我正在尝试在 Maya 中创建 API 以加载自定义文件格式,然后读取数据以创建顶点。

我的总体目标是从文件中的数据创建顶点,然后转换为多边形。

任何帮助将不胜感激。

标记

【问题讨论】:

    标签: python api maya mel


    【解决方案1】:

    通常当人们在 Maya 中谈论“API”时,他们指的是 OpenMaya,这是 Maya 向插件开发人员公开的 C++ API 的 Python 包装器。在最近的玛雅人中实际上有两个版本:

    1. OpenMaya 1.0
    2. OpenMaya 2.0

    2.0 版本更“pythonic”,但也不那么成熟,功能也不全。这两个都包含在任何 Maya 安装中 - 您可以使用来自 Maya 脚本侦听器的标准 python 导入来访问它们。

    对于您描述的问题,您可以像这样使用 API:

    def create(verts, faces, merge=True):
        '''
        Given a list of vertices (iterables of floats) and a list of faces (iterable of integer vert indices),
        creates and returns a maya Mesh
        '''
    
        cmds.select(cl=True)  
        outputMesh = OpenMaya.MObject()
    
        numFaces = len(faces)
        numVertices = len(verts)
    
        # point array of plane vertex local positions
        points = OpenMaya.MFloatPointArray()
        for eachVt in verts:
            p = OpenMaya.MFloatPoint(eachVt[0], eachVt[1], eachVt[2])
            points.append(p)
    
        # vertex connections per poly face in one array of indexs into point array given above
        faceConnects = OpenMaya.MIntArray()
        for eachFace in faces:
            for eachCorner in eachFace:
                faceConnects.append(eachCorner)
    
        # an array to hold the total number of vertices that each face has
        faceCounts = OpenMaya.MIntArray()
        for c in range(0, numFaces, 1):
            faceCounts.append(3)
    
        # create mesh object using arrays above and get name of new mesh
        meshFS = OpenMaya.MFnMesh()
        newMesh = meshFS.create(numVertices, numFaces, points, faceCounts, faceConnects, outputMesh)
        nodeName = meshFS.name()
        cmds.sets(nodeName, add='initialShadingGroup')  
        cmds.select(nodeName)  
        meshFS.updateSurface()
        # this is useful because it deletes stray vertices (ie, those not used in any faces)
        if merge:
            cmds.polyMergeVertex(nodeName, ch=0)
        meshFS.updateSurface()
        return nodeName
    

    但是,此示例直接从 python 调用 API 而不将其包装在 API 命令外壳中,因此无法使用传统的撤消方法撤消它。要将其转换为具有撤消支持的完整操作,您需要将此功能作为MPXCommand 的一部分。正如您所看到的,使用 Python 的 1.0 OpenMaya API 有点麻烦,因为它涉及为 Python 本身不支持的 C++ 数据类型创建代理,因此如果您不熟悉这两种语言和 Maya,这可能会非常复杂。我对 2.0 API 没有足够的经验,无法知道它是否是一项重大改进,但有消息称它还不是很完整。

    如果您不担心速度,您可以使用常规的 maya.cmds 模块来创建几何图形,使用与艺术家手工制作几何图形相同的功能。这是一个简单的例子:

    verts = [(0,0,0), (0,1,0), (1,0,0), (1,1,1)]
    faces = [(0,1,2),(1,2,3)]
    
    def create_geometry(verts, faces):    
       cmds.constructionHistory(tgl = 'off')
       results = []
       for f in faces:
           points = [verts[i] for i in f]
           results += cmds.polyCreateFacet( p = points, ch = 0)
       cmds.polyUnite(results, ch=0)
       cmds.polyMergeVertex(d=0, ch=0)
       cmds.constructionHistory(tgl = 'on')
    
    
    create_geometry(verts, faces)
    

    如您所见,这种方法编写起来要简单得多,但速度也慢得多。适合您的方式取决于您的需求。如果你可以只分发一个 python 脚本,那么第二种方法更容易。如果你想创建一个传统的插件来创建一个成熟的 Maya 文件翻译器或新的 MEL 命令,你必须使用 MPXCommand 路由。

    【讨论】:

    • 您好,谢谢。但我想的是。 Maya 读取文件并遍历文件。我正在考虑创建一个 .DXF 导入器,这样我就可以将线条转换为曲线,然后再转换为多边形。所以我可以挤出它们。所以它会从文件中读取数据,然后我可以从图纸中创建一个 3d 世界。我知道已经有 .DWG 和 .DXF 的导入器,但我想创建自己的插件。
    • 基本策略问题是相同的:您可以在普通的 maya.cmds 或使用 OpenMaya 中执行相同的导入和创建算法;前者更容易、更慢,后者更难、更容易出错但速度更快。创建曲线与创建多边形几乎相同:API 命令将有所不同(在 maya.cmds 中为 cmds.curve(p = your-list-of-points-here, d= curve-degree)。重新实现 DXF 导入器是一项重要的工作,因为 DXF 是一个古老而松散的标准......使用cmds.ls 或 API 可以轻松迭代导入的几何图形
    • 哦,好的。那么第一个示例是读取文件数据并创建几何图形吗?理想情况下,我想创建一个 .DWG 文件导入器。因此,如果我遍历 .dwg 文件,我可以只调用文件中的行并将它们绘制到 Maya 中吗?
    • 这两个例子都是为了创建几何,因为我不清楚你在读什么格式。 DWG 导入应包含在默认的 Maya DXF 导入中。从那里,您可以使用常规的 Maya 命令循环遍历场景并根据需要进行修改。您可以通过在导入的文件中手动执行其中一些操作并在您工作时观察 Maya 在脚本侦听器中发出哪些命令来找出正确的操作顺序,
    • 第一个链接是使用 OpenMaya API 编写插件的基础知识;第二个特定于文件翻译器。我会按顺序执行它们,因为 Maya 对使插件正常工作有一些不寻常的要求,因此您应该在了解细节之前学习 API 基础知识。你可能想试试这本书来滚动http://techartsurvival.blogspot.com/p/bookstore.html
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多