Introduction to Maya

Содержание

Слайд 2

Biography Naiqi Weng -- Autodesk Developer Network Education Bachelor of Computer

Biography

Naiqi Weng -- Autodesk Developer Network
Education
Bachelor of Computer Science
Master

of Computer Science
Working experience
Supporting software: Maya API, MotionBuilder SDK and 3dsMax SDK

Naiqi.weng@autodesk.com

Слайд 3

Dependency Graph

Dependency Graph

Слайд 4

Agenda What is Dependency Graph (DG)? Concepts/Elements of DG Nodes Custom

Agenda

What is Dependency Graph (DG)?
Concepts/Elements of DG Nodes
Custom plug-in DG

node with Maya API
DG’s push-pull mechanism
Correct coding with DG
Слайд 5

Maya Hypergraph Menu: “Window”– “Hypergraph:Connections” Nodes Node Connections Attributes Connections

Maya Hypergraph

Menu: “Window”– “Hypergraph:Connections”

Nodes

Node

Connections

Attributes

Connections

Слайд 6

What is the Dependency Graph? Control system of Maya Patented technology:

What is the Dependency Graph?

Control system of Maya
Patented technology: US Patent

#5,808,625 US Patent #5,929,864
A collection of nodes that transmit data through connected attributes

A.x

B.y

Слайд 7

Dependency Graph Everything in Maya 3D space maps to DG Nodes

Dependency Graph

Everything in Maya 3D space maps to DG Nodes
Anything you

do in the UI will affect DG

Curve

Revolve

Surface

Time

Anim
Curve

Transform

File
Texture

Phong
Shader

Shading
Group

poly

deformer

poly

Слайд 8

Dependency Graph © 2009 WET, Artificial Mind and Movement (now Behaviour

Dependency Graph

© 2009 WET, Artificial Mind and Movement (now Behaviour

Interactive)
© 2009 Bethesda Softworks.  Image courtesy of Behaviour Interactive
Слайд 9

Dependency Graph New Type Custom Node

Dependency Graph

New Type Custom Node

Слайд 10

What does a node do? Know its own attributes Store data

What does a node do?

Know its own attributes
Store data efficiently in

“datablocks”
Accept input data, compute, generate output data
Connect with other nodes through connections

output attributes

input attributes

Node

Слайд 11

Different elements of a Node Maya Node Attributes Plugs DataBlock DataHandle

Different elements of a Node

Maya Node

Attributes

Plugs

DataBlock
DataHandle

Слайд 12

Attributes Describe data that belongs to nodes of a given type

Attributes

Describe data that belongs to nodes of a given type
Attributes are

shared among nodes of the same type and all derived node types

“Smiley” Node Attributes

Float “rotation” Float “diameter”
Int32 “numEyes”

Node A

Node B


Слайд 13

Attributes Define the interface of the node type including Names Data

Attributes

Define the interface of the node type including
Names
Data Type
Basic: numeric (float,

int32 etc…), string, matrix, etc..
Complex: mesh, nurbsSurface, generic, etc…
Custom data
Structure
Properties
readable, writable, storable, keyable, etc…

compound,

array,

Simple,

compound array

Слайд 14

API Classes for Attributes Base Class: MFnAttribute Takes care of all

API Classes for Attributes

Base Class: MFnAttribute
Takes care of all the

common aspect of an attribute on node
readable/writable, connectable, storable, keyable
Most Common Used Classes
MFnNumericAttribute
MFnCompoundAttribute
MFnTypedAttribute
MFnMatrixAttribute
MFnGenericAttribute
Слайд 15

Different elements of a Node Maya Node Attributes Plugs DataBlock DataHandle

Different elements of a Node

Maya Node

Attributes

Plugs

DataBlock
DataHandle

Слайд 16

Plugs Pointer to an attribute on a specific node (ie. a

Plugs

Pointer to an attribute on a specific node (ie. a specific

instance of an attribute)

Node type definition

myAttr

Actual instance of a node

myNode1

myPlug1(myNode1, myAttr)

myPlug2(myNode2, myAttr)

myNode

myNode2

setAttr myNode1.myAttr 5;
setAttr myNode2.myAttr 10;

Слайд 17

Plugs Plugs can be used to: query / set a value

Plugs

Plugs can be used to:
query / set a value
create / remove

/query a connection
Does not store attribute data
API class: MPlug
MPlug::MPlug (const MObject &node, const MObject &attribute)
MObject MPlug::attribute ( MStatus *  ReturnStatus) 
MObject MPlug::node ( MStatus *  ReturnStatus) 
MStatus MPlug::getValue ( double &  val, MDGContext &  ctx )
MStatus MPlug::setValue ( double  val  ) 
Слайд 18

Different elements of a Node Maya Node Attributes Plugs DataBlock DataHandle

Different elements of a Node

Maya Node

Attributes

Plugs

DataBlock
DataHandle

Слайд 19

Datablock Node stores data for every attribute Datablock Node Attribute

Datablock

Node stores data for every attribute

Datablock

Node

Attribute

Слайд 20

Datablocks Datablock is the actual storage for the input and output

Datablocks

Datablock is the actual storage for the input and output data

of a node
For every non-array attribute, datablock stores:
Data
Dirty/clean status
Data handles are lightweight pointers into the data in the datablock
Слайд 21

API Classes for datablock MDatablock Only valid during compute() Pointers to

API Classes for datablock

MDatablock
Only valid during compute()
Pointers to data block should

not be retained after compute()
MStatus MPxNode::compute(const MPlug& plug, MDataBlock& dataBlock)
MDataHandle MDataBlock::inputValue(const MObject& attribute, MStatus *  ReturnStatus)
MDataHandle MDataBlock::outputValue ( const MObject & attribute, MStatus *  ReturnStatus)
MDataHandle
a smart pointer for information contained in data block
double & MDataHandle::asDouble (  ) 
void MDataHandle::set( double  val  ) 
Слайд 22

Maya Node Attributes Plugs DataBlock DataHandle MPxNode MFnAttribute MPlug MDataBlock MDataHandle

Maya Node

Attributes

Plugs

DataBlock
DataHandle

MPxNode

MFnAttribute

MPlug

MDataBlock
MDataHandle

Слайд 23

Custom Node Plug-in Implementation

Custom Node Plug-in Implementation

Слайд 24

Custom DG Node in Maya Entirely new operations MPxNode: base class

Custom DG Node in Maya

Entirely new operations
MPxNode: base class for custom

node implementation
Extend existing Maya nodes
MPxDeformerNode
MPxFieldNode
MPxEmitterNode
MPxSpringNode
MPxIkSolverNode
MPxHwShaderNode
Слайд 25

Custom Node Code Skeleton class myNode : public MPxNode { public:

Custom Node Code Skeleton

class myNode : public MPxNode
{
public:
myNode();
virtual

~myNode();
static void* creator();
static MStatus initialize();
virtual MStatus compute( const MPlug& plug, MDataBlock& data );
private:
static MTypeId id;
static MObject myInputAttr; //input attribute
static MObject myOutputAttr; //output attribute
static MObject myOutputAttrTwo; //second output attribute
};
Слайд 26

Custom Node Registration Every node type requires a unique identifier MTypeId

Custom Node Registration

Every node type requires a unique identifier
MTypeId

myNode::id( 0x80000 );
For plug-ins that you intend to share between sites
Will require a globally unique ID issued to you by Autodesk.
IDs are allocated in blocks of 64/128/256/512.
Contact ADN M&E for unique global IDs.

0 – 0x7ffff (524288 ids)

0x80000 – 0xfffff

Internal Use

DevKit Examples

0x100fff – 0xffffff

Global IDs

Слайд 27

Custom Node Registration initializePlugin() and uninitializePlugin() are entry point and exit point of custom plug-in node

Custom Node Registration

initializePlugin() and uninitializePlugin() are entry point and exit point

of custom plug-in node
Слайд 28

Custom Node Registration To register your node with Maya: To deregister

Custom Node Registration

To register your node with Maya:
To deregister your node

MStatus

initializePlugin(MObject obj)
{ MFnPlugin plugin(obj, “Autodesk”, “1.0”, “any”);
MStatus status = plugin.registerNode(“myNode”, myNode::id, myNode::creator, myNode::initialize);
return status; }

MStatus uninitializePlugin(MObject obj)
{ MFnPlugin plugin(obj);
MStatus status = plugin.deregisterNode( myNode::id );
return status; }

Слайд 29

Custom Node Code Skeleton MPxNode::creator() The creator method is called to

Custom Node Code Skeleton

MPxNode::creator()
The creator method is called to return a

new instance of the node
In the Maya UI
MEL: createNode myNode;

void* myNode::creator()
{
return new myNode;
}

Слайд 30

Custom Node Code Skeleton MPxNode::initialize() Override this method to define the

Custom Node Code Skeleton

MPxNode::initialize()
Override this method to define the attribute interface

for your node.
create attributes
set the attribute’s properties
add the attribute to the node
Inherit attributes if necessary
define attribute relationships

output attributes

input attributes

Node

?

Слайд 31

Attribute Dependency Attributes can affect other attributes MEL command: affects sphere

Attribute Dependency

Attributes can affect other attributes
MEL command: affects
sphere -n sphere;
affects

tx sphere;
MPxNode::attributeAffects()
Once created on a node, an “attributeAffects” relationship can be setup to denote a dependency

D

volume

radius

setAttr D.radius 5

attributeAffects(radius,volume)

Слайд 32

Custom Node Code Skeleton MStatus myNode::initialize() { MFnNumericAttribute nAttr; myInputAttr =

Custom Node Code Skeleton

MStatus myNode::initialize()
{
MFnNumericAttribute nAttr;
myInputAttr = nAttr.create(“myInput”, “mi”,

MFnNumericData::kFloat, 1.0);
nAttr.setStorable(true);
myOutputAttr = nAttr.create(“myOutput”, “mo”, MFnNumericData::kFloat, 1.0);
nAttr.setStorable(true);
myOutputAttrTwo = nAttr.create(“myOutputTwo”, “motwo”, MFnNumericData::kFloat, 1.0);
nAttr.setStorable(true);
addAttribute(myInputAttr);
addAttribute(myOutputAttr);
addAttribute(myOutputAttrTwo);
attributeAffects(myInputAttr, myOutputAttr);
return MS::kSuccess;
}
Слайд 33

Custom Node Code Skeleton MPxNode::compute() called when the node is asked

Custom Node Code Skeleton

MPxNode::compute()
called when the node is asked to evaluate

an output

MStatus myNode::compute(const MPlug& plug, MDataBlock& dataBlock)
{
if (plug = = myOutputAttr )
{
//your compute algorithm for output1
}
if (plug = = myOutputAttrTwo)
{
//your compute algorithm for output2
}
return MStatus::kUnknownParameter
}

myNode

myInput

myOutput

myOutputTwo

getAttr myNode1.myOutput;

Слайд 34

Examples Devkit Plug-in Examples: C:\Program Files\Autodesk\Maya2011\devkit\plug-ins The Maya API Documentation contains

Examples

Devkit Plug-in Examples:
C:\Program Files\Autodesk\Maya2011\devkit\plug-ins
The Maya API Documentation contains a wealth of

information on all aspects of the API.

API Docs

Слайд 35

How does Dependency Graph work? Control system for Maya Glue that

How does Dependency Graph work?

Control system for Maya
Glue that holds together

disparate operations and lets them work together seamlessly
DG is not a usual dataflow system….

data

Слайд 36

How does Dependency Graph Work? Two step Push-Pull mechanism: Dirty Propagation Evaluation

How does Dependency Graph Work?

Two step Push-Pull mechanism:
Dirty Propagation
Evaluation

Слайд 37

Dirty Propagation Maya DG caches values Uses dirty system to denote

Dirty Propagation

Maya DG caches values
Uses dirty system to denote elements that

require updating:
Attributes
Connections
MEL Commands:
dgdirty
isDirty
Слайд 38

Data Flow Example Key = clean connection, = dirty connection A B D C E

Data Flow Example

Key

= clean connection,

= dirty connection

A

B

D

C

E

Слайд 39

The Dirty Process Initiated by value changes setAttr D.r 5; A B D C E

The Dirty Process

Initiated by value changes

setAttr D.r 5;

A

B

D

C

E

Слайд 40

The Dirty Process Dirty message propagates forward A B D C E

The Dirty Process

Dirty message propagates forward

A

B

D

C

E

Слайд 41

The Dirty Process No evaluation has been requested. Data remains dirty. A B D C E

The Dirty Process

No evaluation has been requested. Data remains dirty.

A

B

D

C

E

Слайд 42

The Dirty Process Now an input on A changes setAttr A.aIn

The Dirty Process

Now an input on A changes

setAttr A.aIn 6

A

B

D

C

E

Слайд 43

The Dirty Process Dirty propagates out all outgoing connections A B D C E

The Dirty Process

Dirty propagates out all outgoing connections

A

B

D

C

E

Слайд 44

The Dirty Process B and D propagate dirty to affected attributes

The Dirty Process

B and D propagate dirty to affected attributes
C will

not receive dirty message
Connection to C is already dirty
Helps performance

A

B

D

C

E

Слайд 45

The Evaluation Process Lazy Evaluation: On demand Evaluation is trigged when

The Evaluation Process

Lazy Evaluation: On demand
Evaluation is trigged when values are

requested:
Viewport refresh
Attribute editor
Channel box
Rendering
getAttr command
Etc…
Evaluation is minimal
Only requested values are computed
Non-requested values are left dirty
Слайд 46

The Evaluation Process Example: getAttr C.output A B D C getAttr c.output E

The Evaluation Process

Example: getAttr C.output

A

B

D

C

getAttr c.output

E

Слайд 47

The Evaluation Process C computes: requests input value from connection ? A B D C E

The Evaluation Process

C computes: requests input value from connection

?

A

B

D

C

E

Слайд 48

The Evaluation Process D computes. D requests input value from connection

The Evaluation Process

D computes.
D requests input value from connection

?

A

B

D

C

E

Слайд 49

The Evaluation Process A computes requested output A B D C E

The Evaluation Process

A computes requested output

A

B

D

C

E

Слайд 50

The Evaluation Process Value copied forward to D’s input A B D C E

The Evaluation Process

Value copied forward to D’s input

A

B

D

C

E

Слайд 51

The Evaluation Process D computes requested result. D sets value in

The Evaluation Process

D computes requested result.
D sets value in output.

A

B

D

C

E

Слайд 52

The Evaluation Process Value is copied forward to C A B D C E

The Evaluation Process

Value is copied forward to C

A

B

D

C

E

Слайд 53

The Evaluation Process C computes requested output. B remains dirty. A B D C E

The Evaluation Process

C computes requested output.
B remains dirty.

A

B

D

C

E

Слайд 54

The Evaluation Process Only requested outputs are computed, unless node’s compute

The Evaluation Process

Only requested outputs are computed, unless node’s compute method

does more than requested

input

output1

output2

Node

Слайд 55

Correct Coding with DG

Correct Coding with DG

Слайд 56

Correct Coding with DG Common misuse: put command-type tasks into a

Correct Coding with DG

Common misuse:
put command-type tasks into a custom

node implementation
execute commands to change the status of current DG
get or set values on other nodes
Black Box Rule

output attributes

input attributes

Node

Слайд 57

Black Box Rule Black-box operation of node is what makes it all work.

Black Box Rule

Black-box operation of node is what makes it all

work.
Слайд 58

A Closer Look at MPxNode::compute() You can not control when compute()

A Closer Look at MPxNode::compute()

You can not control when compute() is

getting called, Maya control when it gets called
Compute() is called in Evaluation phase
Inside compute(): avoid sending dirty messages
Don’t execute commands
Don’t get or set values on other nodes
Слайд 59

A Closer Look at MPxNode::compute() Inside compute(): avoid sending dirty messages

A Closer Look at MPxNode::compute()

Inside compute(): avoid sending dirty messages
Get/set data

only through datablock using data handles, don’t set data via plugs (i.e. MPlug::setValue)
setting data via plug propagates dirty, datahandle does not
datahandle set/get methods are more efficient

MPlug::getValue()
MPlug::setValue()

MDataHandle::asXXX()
MDataHandle::setXXX()

MPxNode::compute()

Слайд 60

Learning Resources Maya Developer Center: http://www.autodesk.com/developmaya Questions and Problems: ADN http://www.autodesk.com/adn

Learning Resources

Maya Developer Center:
http://www.autodesk.com/developmaya
Questions and Problems: ADN
http://www.autodesk.com/adn
Maya API White Paper,

DevTV, Webcast training
Discussion Forum: The AREA
http://area.autodesk.com/forum/autodesk-maya/sdk/
Слайд 61

Q & A

Q & A