`
schi
  • 浏览: 205914 次
  • 性别: 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科学计数法...

    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 包 ...

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

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

    get-platformio.py

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

    web.py 中文手册

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

    pyinstxtractor.py 反编译pyinstaller打包的程序

    pyinstxtractor.py 反编译pyinstaller打包的程序 使用方法 python pyinstxtractor.py 示例:python pyinstxtractor.py main.exe

    python2.7中所用的get-pip.py文件+安装方法

    `get-pip.py`是一个Python脚本,它的主要作用是为没有预装`pip`的Python环境安装`pip`。在Python 2.7中,由于某些系统可能没有默认提供`pip`,或者`pip`版本过低,`get-pip.py`就显得非常有用。这个脚本可以下载并...

    web.py中文版用户手册

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

    python3.6 get-pip.py

    curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py python get-pip.py

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

    实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.py实数模拟器.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。然后在...

    有理数模拟器.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...

    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转...

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

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

    pip-20.3.4-py2.py3-none-any.whl

    pip-20.3.4-py2.py3-none-any.whl

    绩点计算器.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循环队列...

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

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

Global site tag (gtag.js) - Google Analytics