`
schi
  • 浏览: 201347 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

animCubeNode.py

阅读更多
一个节点例子。该节点有一个time输入属性用来连接时间或设置关键帧动画,有一个outputMesh属性来根据time属性而得出的Cube(多边形方块),这个Cube的大小是由time来控制的。

animCubeNode.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# import maya.cmds as cmds
# cmds.createNode("transform", name="animCube1")
# cmds.createNode("mesh", name="animCubeShape1", parent="animCube1")
# cmds.sets("animCubeShape1", add="initialShadingGroup")
# cmds.createNode("spAnimCube", name="animCubeNode1")
# cmds.connectAttr("time1.outTime", "animCubeNode1.time")
# cmds.connectAttr("animCubeNode1.outputMesh", "animCubeShape1.inMesh")

import sys
import maya.OpenMaya as om
import maya.OpenMayaMPx as ompx

kPluginNodeTypeName = "spAnimCube"
animCubeId = om.MTypeId( 0x8700B )

# Node definition
class animCube( ompx.MPxNode ):
    """ animCubeNode """
    # class variables
    time = om.MObject()
    outputMesh = om.MObject()
    
    def __init__( self ):
        super( animCube, self ).__init__()
        
    def createMesh( self, tempTime, outData ):
        # 将时间单位转为24(Film)
        frame = int( tempTime.as( om.MTime.kFilm ) )
        if frame is 0:
            frame = 1
            
        # cube的大小,由时间控制
        cubeSize = 0.5 * float( frame % 10 )
        
        # cube的面、顶点数,
        # FaceConnects是6个面的点的总和
        # 即6 * 4 = 24
        numFaces = 6
        numVertices = 8
        numFaceConnects = 24
        
        # 落实顶点
        vtx_1 = om.MFloatPoint( -cubeSize, -cubeSize, -cubeSize )
        vtx_2 = om.MFloatPoint( cubeSize, -cubeSize, -cubeSize )
        vtx_3 = om.MFloatPoint( cubeSize, -cubeSize, cubeSize )
        vtx_4 = om.MFloatPoint( -cubeSize, -cubeSize, cubeSize )
        vtx_5 = om.MFloatPoint( -cubeSize, cubeSize, -cubeSize )
        vtx_6 = om.MFloatPoint( -cubeSize, cubeSize, cubeSize )
        vtx_7 = om.MFloatPoint( cubeSize, cubeSize, cubeSize )
        vtx_8 = om.MFloatPoint( cubeSize, cubeSize, -cubeSize )
        
        # vertexArray
        # 顶点数组,包括所有的顶点
        points = om.MFloatPointArray()
        # 设置数组长度
        points.setLength( 8 )
        points.set( vtx_1, 0 )
        points.set( vtx_2, 1 )
        points.set( vtx_3, 2 )
        points.set( vtx_4, 3 )
        points.set( vtx_5, 4 )
        points.set( vtx_6, 5 )
        points.set( vtx_7, 6 )
        points.set( vtx_8, 7 )
        
        # 顶点数组
        # 顶点与顶点的连接
        faceConnects = om.MIntArray()
        faceConnects.setLength( numFaceConnects )
        faceConnects.set( 0, 0 )
        faceConnects.set( 1, 1 )
        faceConnects.set( 2, 2 )
        faceConnects.set( 3, 3 )
        faceConnects.set( 4, 4 )
        faceConnects.set( 5, 5 )
        faceConnects.set( 6, 6 )
        faceConnects.set( 7, 7 )
        faceConnects.set( 3, 8 )
        faceConnects.set( 2, 9 )
        faceConnects.set( 6, 10 )
        faceConnects.set( 5, 11 )
        faceConnects.set( 0, 12 )
        faceConnects.set( 3, 13 )
        faceConnects.set( 5, 14 )
        faceConnects.set( 4, 15 )
        faceConnects.set( 0, 16 )
        faceConnects.set( 4, 17 )
        faceConnects.set( 7, 18 )
        faceConnects.set( 1, 19 )
        faceConnects.set( 1, 20 )
        faceConnects.set( 7, 21 )
        faceConnects.set( 6, 22 )
        faceConnects.set( 2, 23 )
        
        # 面数(6个),每个面由4个顶点组成
        # 也是一个顶点数组
        faceCounts = om.MIntArray()
        faceCounts.setLength( 6 )
        faceCounts.set( 4, 0 )
        faceCounts.set( 4, 1 )
        faceCounts.set( 4, 2 )
        faceCounts.set( 4, 3 )
        faceCounts.set( 4, 4 )
        faceCounts.set( 4, 5 )
        
        # 创建cube
        meshFS = om.MFnMesh()
        newMesh = meshFS.create( numVertices, numFaces, points,
                                faceCounts, faceConnects, outData )
        return newMesh
        
    def compute( self, plug, data ):
        # 需要更新(重新计算)的属性
        if plug == animCube.outputMesh:
            timeData = data.inputValue( animCube.time )
            tempTime = timeData.asTime()
            
            outputHandle = data.outputValue( animCube.outputMesh )
            
            # 创建MeshData
            dataCreator = om.MFnMeshData()
            newOutputData = dataCreator.create()
            
            self.createMesh( tempTime, newOutputData )
            
            outputHandle.setMObject( newOutputData )
            data.setClean( plug )
        else:
            return om.kUnknownParameter
        
# creator
def nodeCreator():
    return ompx.asMPxPtr( animCube() )
    
# initializer
def nodeInitializer():
    unitAttr = om.MFnUnitAttribute()
    typedAttr = om.MFnTypedAttribute()
    # time
    animCube.time = unitAttr.create( 'time', 'tm',
                                    om.MFnUnitAttribute.kTime, 0.0 )
    # outputMesh
    animCube.outputMesh = typedAttr.create( 'outputMesh', 'out',
                                           om.MFnData.kMesh )
    # add attributes
    animCube.addAttribute( animCube.time )
    animCube.addAttribute( animCube.outputMesh )
    animCube.attributeAffects( animCube.time, animCube.outputMesh )
# initialize the script plug-in
def initializePlugin( mobject ):
    mplugin = ompx.MFnPlugin( mobject )
    try:
        mplugin.registerNode( kPluginNodeTypeName, animCubeId, nodeCreator, nodeInitializer )
    except:
        sys.stderr.write( "Failed to register node: %s" % kPluginNodeTypeName )
        raise
        
# uninitialize the script plug-in
def uninitializePlugin( mobject ):
    mplugin = ompx.MFnPlugin( mobject )
    try:
        mplugin.deregisterNode( animCubeId )
    except:
        sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeTypeName )
        raise

类方法createMesh展示了如何创建一个Cube
创建一个多边形需要使用MFnMesh类的create方法
# 创建cube
meshFS = om.MFnMesh()
newMesh = meshFS.create( numVertices, numFaces, points, faceCounts, faceConnects, outData )

numVertices 是这个多边形的顶点总数
numFaces(numPolygons) 是这个多边形的面的总数
points(vertexArray) 是顶点的一个数组。包括所有的顶点。例如一个默认的cube的vertexArray是{ (-1,-1,-1), (1,-1,-1), (1,-1,1), (-1,-1,1), (-1,1,-1), (-1,1,1), (1,1,1), (1,1,-1) }
faceCounts(polygonCounts) 是每个多边形的面的顶点总数的数组。例如一个默认的cube,有6个面,每个面有4个顶点,polygonCounts是{4,4,4,4,4,4}
faceConnects(polygonConnects) 是顶点与顶点的连接的数组。例如一个默认的cube的polygonConnects是{ 0, 1, 2, 3, 4, 5, 6, 7, 3, 2, 6, 5, 0, 3, 5, 4, 0, 4, 7, 1, 1, 7, 6, 2 }
outData(parentOrOwner) 会成为该多边形的父物体

可以观察下图来理解,我也是通过这张图才能明白的



你可以在maya安装目录下的devkit/plug-ins/scripted找到animCubeNode.py。
在线版
http://download.autodesk.com/us/maya/2010help/API/anim_cube_node_8py-example.html
  • 大小: 32.5 KB
0
0
分享到:
评论

相关推荐

    实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py

    实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数...

    科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器

    科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法模拟器.py科学计数法...

    有理数模拟器.py有理数模拟器.py

    有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py有理数模拟器.py...

    二叉树模拟器.py二叉树模拟器.py

    二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py...

    TK-crawler.pyTK-crawler.pyTK-crawler.py

    TK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_crawler.pyTK_...

    绩点计算器.py绩点计算器.py

    绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点计算器.py绩点...

    随机点名器.py随机点名器.py

    随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机点名器.py随机...

    循环队列模拟器.py循环队列模拟器.py

    循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列模拟器.py循环队列...

    google_auth-1.23.0-py2.py3-none-any.whl____python 包

    google_auth-1.23.0-py2.py3-none-any.whl python 包 google_auth-1.23.0-py2.py3-none-any.whl python 包 google_auth-1.23.0-py2.py3-none-any.whl python 包google_auth-1.23.0-py2.py3-none-any.whl python 包 ...

    draw.py,parsing.py,samples.py

    bootchart执行出错,替换ubuntu下面的/usr/share/pyshared/pybootchartgui三个脚本就可以了。

    web.py 中文手册

    web.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy ...

    web.py中文版用户手册

    web.py 是一个轻量级Python web框架,它简单而且功能强大。web.py是一个开源项目。该框架由美国作家、Reddit联合创始人、RSS规格合作创造者、著名计算机黑客Aaron Swartz开发。web.py目前已被很多家大型网站所使用。

    get-platformio.py

    get-platformio.py get-platformio.py get-platformio.py get-platformio.py

    get-pip.py

    $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 下载安装脚本 $ sudo python get-pip.py # 运行安装脚本

    Python3 py转exe.py

    py转exe.py py转exe.py py转exe.py py转exe.pypy转exe.py py转exe.py py转exe.py py转exe.pypy转exe.py py转exe.py py转exe.py py转exe.pypy转exe.py py转exe.py py转exe.py py转exe.pypy转exe.py py转exe.py py转...

    python_docx-0.8.10-py2.py3-none-any.whl

    估计这个安装包还只兼容python 2(python2 和python3差别还是挺大的,虽然现在python 3出来很久了,但是不少三方库还没有更新),因此需要自己找一个兼容的包:python_docx-0.8.6-py2.py3-none-any.whl。然后在...

    PyPI 官网下载 | yolov5-5.0.0-py36.py37.py38-none-any.whl

    资源来自pypi官网。 资源全名:yolov5-5.0.0-py36.py37.py38-none-any.whl

    testme.py testbe.py.rar testme.py testbe.py.rar testme.py testbe.py.rar

    testme.py testbe.py.rar testme.py testbe.py.rar

    web.py中文教程_脚本之家.docx

    Web.py Cookbook 简体中文版手册 欢迎来到web.py 0.3的Cookbook。提醒您注意:某些特性在之前的版本中并不可用。当前开发版本是0.3。 web.py 是一个轻量级Python web框架,它简单而且功能强大。web.py是一个开源项目...

    python安装模块如何通过setup.py安装(超简单)

    有些时候我们发现一些模块没有提供pip install 命令和安装教程 , 只提供了一个setup.py文件 , 这个时候如何安装呢? 步骤 打开cmd 到达安装目录 python setup.py build python setup.py install 总结 以上所述是...

Global site tag (gtag.js) - Google Analytics