Go to: Synopsis. Return value. Flags. Python examples.

Synopsis

surface([degreeU=int], [degreeV=int], [formU=string], [formV=string], [knotU=float], [knotV=float], [name=string], [objectSpace=boolean], [point=[linear, linear, linear]], [pointWeight=[linear, linear, linear, linear]], [worldSpace=boolean])

Note: Strings representing object names and arguments must be separated by commas. This is not depicted in the synopsis.

surface is undoable, NOT queryable, and NOT editable.

The cmd creates a NURBS spline surface (rational or non rational). The surface is created by specifying control vertices (CV's) and knot sequences in the U and V direction. You cannot query the properties of the surface using this command. See examples below.

Return value

stringThe path to the new surface

Flags

degreeU, degreeV, formU, formV, knotU, knotV, name, objectSpace, point, pointWeight, worldSpace
Long name (short name) Argument types Properties
degreeU(du) int create
Degree in surface U direction. Default is degree 3.
degreeV(dv) int create
Degree in surface V direction. Default is degree 3.
formU(fu) string create
The string for open is "open" , for closed is "closed" or for periodic is "periodic" in U.
formV(fv) string create
The string for open is "open" , for closed is "closed" or for periodic is "periodic" in V.
knotU(ku) float createmultiuse
Knot value(s) in U direction. One flag per knot value. There must be (numberOfPointsInU + degreeInU - 1) knots and the knot vector must be non-decreasing.
knotV(kv) float createmultiuse
Knot value(s) in V direction. One flag per knot value. There must be (numberOfPointsInV + degreeInV - 1) knots and the knot vector must be non-decreasing.
name(n) string create
Name to use for new transforms.
objectSpace(ob) boolean create
Should the operation happen in objectSpace?
point(p) [linear, linear, linear] createmultiuse
To specify non rational CV with (x, y, z) values. "linear" means that this flag can take values with units. Note that you must specify (degree+1) surface points in any direction to create a visible surface span. eg. if the surface is degree 3 in the U direction, you must specify 4 CVs in the U direction. Points are specified in rows of U and columns of V. If you want to incorporate units, add the unit name to the value, eg. "-p 3.3in 5.5ft 6.6yd"
pointWeight(pw) [linear, linear, linear, linear] createmultiuse
To specify rational CV with (x, y, z, w) values. "linear" means that this flag can take values with units. Note that you must specify (degree+1) surface points in any direction to create a visible surface span. eg. if the surface is degree 3 in the U direction, you must specify 4 CVs in the U direction. Points are specified in rows of U and columns of V.
worldSpace(ws) boolean create
Should the operation happen in worldSpace?

Flag can appear in Create mode of command Flag can appear in Edit mode of command
Flag can appear in Query mode of command Flag can have multiple arguments, passed either as a tuple or a list.

Python examples

import maya.cmds as cmds

# This following command produces a flat, rectangular surface that is degree 3
# in both directions.  This means that there must be at least 4 x 4
# points to define the surface, since 4 is the (degree + 1).  There
# must be 6 knots in each direction, because the knot vector must
# be (number of points + degree - 1), ie. (4 points + degree 3 - 1).
# The CVs are specified in rows of U and columns of V, as you
# would read a book from left to right, up to down. ie. in this order:
# surface.cv[0][0] surface.cv[0][1] surface.cv[0][2] surface.cv[0][3]
# surface.cv[1][0] surface.cv[1][1] surface.cv[1][2] surface.cv[1][3]
# surface.cv[2][0] surface.cv[2][1] surface.cv[2][2] surface.cv[2][3]
# surface.cv[3][0] surface.cv[3][1] surface.cv[3][2] surface.cv[3][3]

cmds.surface( du=3, dv=3, ku=(0, 0, 0, 1, 1, 1), kv=(0, 0, 0, 1, 1, 1), p=((-0.5, 0, 0.5), (-0.5, 0, 0.16), (-0.5, 0, -0.16), (-0.5, 0, -0.5), (-0.16, 0, 0.5), (-0.16, 0, 0.16), (-0.16, 0, -0.16), (-0.16, 0, -0.5), (0.16, 0, 0.5), (0.16, 0, 0.16), (0.16, 0, -0.16), (0.16, 0, -0.5), (0.5, 0, 0.5), (0.5, 0, 0.16), (0.5, 0, -0.16), (0.1, 0, -0.1)) )

# This following command produces a surface that is degree 3 and periodic in
# the U direction, and degree 1 in the V direction.  Notice that
# the first 3 pairs of points match the last 3 pairs of
# points, which is required for a degree 3 periodic surface.

cmds.surface( du=3, dv=1, fu='periodic', fv='open', ku=(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), kv=(0, 1), pw=((4, -4, 0, 1), (4, -4, -2.5, 1), (5.5, 0, 0, 1), (5.5, 0, -2.5, 1), (4, 4, 0, 1), (4, 4, -2.5, 1), (0, 5.5, 0, 1), (0, 5.5, -2.5, 1), (-4, 4, 0, 1), (-4, 4, -2.5, 1), (-5.5, 0, 0, 1), (-5.5, 0, -2.5, 1), (-4, -4, 0, 1), (-4, -4, -2.5, 1), (0, -5.5, 0, 1), (0, -5.5, -2.5, 1), (4, -4, 0, 1), (4, -4, -2.5, 1), (5.5, 0, 0, 1), (5.5, 0, -2.5, 1), (4, 4, 0, 1), (4, 4, -2.5, 1)) )

# This following command produces a surface that is degree 5 in both directions.

cmds.surface( du=5, dv=5, fu='open', fv='open', p=((-7, 0, 1), (-6, 0, 4), (-3, 0, 6), (0, 0, 7), (4, 0, 5), (6, 0, 3), (-7, 2, 1), (-6, 2, 4), (-3, 2, 7), (0, 2, 8), (4, 2, 5), (6, 2, 3), (-7, 3, 1), (-6, 3, 4), (-3, 3, 8), (0, 3, 9), (4, 3, 5), (6, 3, 3), (-7, 4, 1), (-6, 4, 4), (-3, 4, 9), (0, 4, 8), (4, 4, 5), (6, 4, 3), (-7, 5, 1), (-6, 5, 4), (-3, 5, 8), (0, 5, 7.5), (4, 5, 5), (6, 5, 3), (-7, 6, 1), (-6, 6, 4), (-3, 6, 6), (0, 6, 7), (4, 6, 5), (6, 6, 3)), ku=(0, 0, 0, 0, 0, 1, 1, 1, 1, 1), kv=(0, 0, 0, 0, 0, 1, 1, 1, 1, 1) )


# How to query surface properties:

cmds.getAttr( 'surface1.degreeU' )
# Returns an integer that is the surface degree in U

cmds.getAttr( 'surface1.degreeV' )
# Returns an integer that is the surface degree in V

cmds.getAttr( 'surface1.spansU' )
# Returns an integer that is the # spans in U

cmds.getAttr( 'surface1.spansV' )
# Returns an integer that is the # spans in V

cmds.getAttr( 'surface1.formU' )
# Return 0 = open, 1 = closed, 2 = periodic

cmds.getAttr( 'surface1.formV' )
# Returns 0 = open, 1 = closed, 2 = periodic

cmds.getAttr( 'surface1.minValueU' )
cmds.getAttr( 'surface1.maxValueU' )
cmds.getAttr( 'surface1.minValueV' )
cmds.getAttr( 'surface1.maxValueV' )
# These return the minimum and maximum parameter ranges in each direction.

cmds.getAttr( 'surface1.cv[0][0]' )
# Returns the position of a CV of surface1 in local space.  If the
# surface is a result of construction history, use a surface info
# node instead to get the CV position.

cmds.getAttr( 'surface1.cv[*][0]' )
# Returns the positions of a row of CVs of surface1 in local space.
# If the surface is a result of construction history, use a surface info
# node instead to get the CV positions.

cmds.createNode( 'surfaceInfo' )
cmds.connectAttr( 'surfaceShape1.worldSpace', 'surfaceInfo1.inputSurface', f=True )
cmds.getAttr( 'surfaceInfo1.controlPoints[*]' )
# Returns the surface CVs in world space.   A surface info node can
# also be used to query the surface knot vectors.