<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Samiam's Scribble Pad &#187; Polygon</title>
	<atom:link href="http://www.hodge.net.au/sam/blog/tag/polygon/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hodge.net.au/sam/blog</link>
	<description>Random Thoughts of Sam Hodge, about Life, Art and Technology</description>
	<lastBuildDate>Mon, 01 Dec 2025 07:20:55 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Alias Wavefront OBJ Export in Maya Python with Examples</title>
		<link>http://www.hodge.net.au/sam/blog/2010/09/30/alias-wavefront-obj-export-in-maya-python-with-examples/</link>
		<comments>http://www.hodge.net.au/sam/blog/2010/09/30/alias-wavefront-obj-export-in-maya-python-with-examples/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 06:45:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Export]]></category>
		<category><![CDATA[Maya]]></category>
		<category><![CDATA[OBJ]]></category>
		<category><![CDATA[Polygon]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Wavefront OBJ]]></category>

		<guid isPermaLink="false">http://www.hodge.net.au/sam/blog/?p=250</guid>
		<description><![CDATA[Before I start I wanted to explain why I think this is a classic exercise If you can represent a mesh in OBJ text format you pretty much understand how the data polygonal data exists in the package you are using and you have enough skill to pack it into a data structure to put [...]]]></description>
				<content:encoded><![CDATA[<p>Before I start I wanted to explain why I think this is a classic exercise</p>
<p>If you can represent a mesh in OBJ text format you pretty much understand how the data polygonal data exists in the package you are using and you have enough skill to pack it into a data structure to put it to disk.</p>
<p>So here is what you should get a good understanding of:</p>
<ul>
<li>The classic Wavefront OBJ file format</li>
<li>The the components of a polygon mesh</li>
<li>Using the Python Commands to access the polygon information from the scene</li>
<li>Writing data structures to disk</li>
</ul>
<h3>The Structure of a Wavefront OBJ</h3>
<p>so we should start with the OBJ of a 1x1x1 cube</p>
<p>An OBJ is great at encoding the surface of an object</p>
<p>which is made up of:</p>
<ul>
<li>Position of the Surface: P</li>
<li>Normal of the Surface: N</li>
<li>Texture Values of the Surface: st</li>
</ul>
<p>It is described by stating the values of the surface at discrete points in space along with some connectivity information of how those points are joined together in space as a mesh.</p>
<p>Using the connectivity information a small amount of discrete information can be interpolated continuously to form the surface.</p>
<p>The inner structure of an OBJ has lots of parts</p>
<ul>
<li><b>&#8220;g&#8221; 2 groups:</b> of components belonging to one mesh
<li><b>&#8220;v&#8221; 8 vertices</b>: 3d points, (x-pos,y-pos,z-pos) describing the Position of the surface</li>
<li><b>&#8220;vt&#8221; 14 texture verticies</b>: 2d points (u-pos,v-pos) describing the layout of the texture on the surface</li>
<li><b>&#8220;vn&#8221; 24 vertex normals</b>: 3d vectors (x-direction,y-direction,z-direction) describing the angle of the surface</li>
<li><b>&#8220;f&#8221; 8 faces</b>: each containing indecies to 4 vertices, 4 texture verticies and 4 vertex normals describing the connectivity of the positional, normal and texture information</li>
</ul>
<p>A diagram of what is the difference between a face, vertex, vertex normal and a texture vertex, would be great here, but you will have to use your imagination</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td class="code"><pre class="text" style="font-family:monospace;"># This file uses centimeters as units for non-parametric coordinates.
&nbsp;
mtllib cube.mtl
g default
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.375000 0.500000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.875000 0.000000
vt 0.875000 0.250000
vt 0.125000 0.000000
vt 0.125000 0.250000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
s off
g pCube1
usemtl initialShadingGroup
f 1/1/1 2/2/2 4/4/3 3/3/4
f 3/3/5 4/4/6 6/6/7 5/5/8
f 5/5/9 6/6/10 8/8/11 7/7/12
f 7/7/13 8/8/14 2/10/15 1/9/16
f 2/2/17 8/11/18 6/12/19 4/4/20
f 7/13/21 1/1/22 3/3/23 5/14/24</pre></td></tr></table></div>

<p>Feel free to read the <a href='http://www.hodge.net.au/sam/blog/wp-content/uploads/obj_format.txt'>Wavefront OBJ File format Specification</a> that I found on the internet.</p>
<p>If you want a copy of this file, your copy and paste buffer will work a treat or you could open up Maya and save out a unit cube on the origin.</p>
<p>Its a unit cube on the origin, named pCube1, using initialShadingGroup as a material.</p>
<p>You can see the eight vertices are 0.5 units away from the origin in each three axes with the eight permuations of the signs of each axis. This makes the spacing between vertices 1 unit apart.</p>
<p>The vertex normals are unit in length facing either up, down, left, right, front or back, these normalised vectors are repeated a number of times as there are only 6 discrete values but 24 records.</p>
<p>The texture vertices make squares that are 0.25 units in texture space in an upside down T-layout, with some of the texture verticies being shared between texture faces.</p>
<p>The order in which the faces are created is a left hand rule where the order of the vertices specifies which is the inside of the face as indicated by the fingers and the direction of the face normal is specified by the thumb.</p>
<p>The same left hand rule applies to the texture verticies determining if the texture is mirrored or not.</p>
<p>Edges are implied as the edges between verticies that make up a face.</p>
<p>The number of edges in a face is determined by how many Point/Texture/Normal groups there are in a face</p>
<p>Lets explain that a little further with a single face OBJ</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">mtllib cube.mtl
g default
v -0.5 -0.5 0.5
v 0.5 -0.5 0.5
v -0.5 0.5 0.5
v 0.5 0.5 0.5
vt 0 0
vt 1 0
vt 1 1
vt 0 1
vn 0 0 1
g zPlanePointFive
f 1/1/1 2/2/1 4/3/1 3/4/1</pre></td></tr></table></div>

<p>This is a Unit sized face on the Z Plane at +0.5 units in Z</p>
<p>On line 13 we can see the single face definition, it creates a four sided face that goes in the following order</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>13
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">f 1/1/1 2/2/1 4/3/1 3/4/1</pre></td></tr></table></div>

<p>v/vt/vn : vertex position/ vertex texture / vertex normal, repeated for the number of faces</p>
<p>The edge created from the last vertex back to the first is implied but not explicity defined.</p>
<p>The order is as follows:</p>
<p>for vertex position: 1,2,4,3<br />
for vertex texture position: 1,2,3,4<br />
for vertex normals direction: 1,1,1,1</p>
<p>For Position we can see the face formed on the Z Plane</p>
<ul>
<li>vert #1 : -x,-y  (inital point no edge)
<li>vert #2 : +x,-y (edge #1, left to right)
<li>vert #4 : +x, +y (edge #2, up)
<li>vert #3 : -x, +y (edge #3, right to left)
<li>back to inital vert : (edge #4, down, return to initial point)
</ul>
<p>For texture it goes around 0-1 UV space, left to right, up, right to left and then down.</p>
<p>All of the faces recycle the same face normal, the only face normal, face normal number ONE!!1!</p>
<p>Now we understand the OBJ we understand how the components are connected in the OBJ, we just need to find out about the same info in Maya and we can write an OBJ exporter</p>
<h3>Getting at the Geometric Data for Polygonal Object in Maya with Python</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> maya
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> log<span style="color: black;">&#40;</span>message<span style="color: #66cc66;">,</span>prefix<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;Debug&quot;</span><span style="color: #66cc66;">,</span>hush<span style="color: #66cc66;">=</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> hush:
		<span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s : %s &quot;</span> % <span style="color: black;">&#40;</span>prefix<span style="color: #66cc66;">,</span>message<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> getData<span style="color: black;">&#40;</span>shapeNode<span style="color: black;">&#41;</span>:
&nbsp;
    vertexValues <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    vertNormalValues <span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    textureValues <span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
    vertList <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    vertNormalList <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    vertTextureList <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
&nbsp;
    oldSelection <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">ls</span><span style="color: black;">&#40;</span>selection<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    maya.<span style="color: black;">cmds</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span>shapeNode<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#Verts</span>
    numVerts <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyEvaluate</span><span style="color: black;">&#40;</span>vertex<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NumVerts : %s&quot;</span> % numVerts<span style="color: black;">&#41;</span>
    vertexValues <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span>maya.<span style="color: black;">cmds</span>.<span style="color: black;">pointPosition</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.vtx[%d]&quot;</span> % <span style="color: black;">&#40;</span>shapeNode<span style="color: #66cc66;">,</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>numVerts<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
    log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Verticies:&quot;</span> +  <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>vertexValues<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #808080; font-style: italic;">#Normals</span>
    faceNormals<span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    numFaceNormals <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> face <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyEvaluate</span><span style="color: black;">&#40;</span>face<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
        maya.<span style="color: black;">cmds</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.f[%d]&quot;</span> % <span style="color: black;">&#40;</span>shapeNode<span style="color: #66cc66;">,</span>face<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        vertexFaces <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyListComponentConversion</span><span style="color: black;">&#40;</span>fromFace<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>toVertexFace<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        vertexFaces<span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">filterExpand</span><span style="color: black;">&#40;</span>vertexFaces<span style="color: #66cc66;">,</span>selectionMask<span style="color: #66cc66;">=</span><span style="color: #ff4500;">70</span><span style="color: #66cc66;">,</span>expand<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        faceNormals.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> vertexFace <span style="color: #ff7700;font-weight:bold;">in</span> vertexFaces:
            vertNormalValues.<span style="color: black;">append</span><span style="color: black;">&#40;</span>maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyNormalPerVertex</span><span style="color: black;">&#40;</span>vertexFace<span style="color: #66cc66;">,</span> query<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span> xyz<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            numFaceNormals  +<span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span>
            faceNormals<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>numFaceNormals <span style="color: black;">&#41;</span>
    log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Num Face Normals: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>numFaceNormals<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Face Normals: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>vertNormalValues<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#Texture Coordinates</span>
    numTexVerts <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyEvaluate</span><span style="color: black;">&#40;</span>uvcoord<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NumTexVerts: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>numTexVerts<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    textureValues <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span>maya.<span style="color: black;">cmds</span>.<span style="color: black;">getAttr</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.uvpt[%d]&quot;</span> % <span style="color: black;">&#40;</span>shapeNode<span style="color: #66cc66;">,</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>numTexVerts<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
    log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Texture Coordinates: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>textureValues<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#Faces</span>
    numFaces <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyEvaluate</span><span style="color: black;">&#40;</span>face<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NumFaces : %s&quot;</span> % numFaces<span style="color: black;">&#41;</span>
    vnIter <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span>
    faceValues <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>numFaces<span style="color: black;">&#41;</span>:
        log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Face %d of %d&quot;</span> % <span style="color: black;">&#40;</span>i+<span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>numFaces<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        maya.<span style="color: black;">cmds</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.f[%d]&quot;</span> % <span style="color: black;">&#40;</span>shapeNode<span style="color: #66cc66;">,</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">#Verts (v)</span>
        faceVerts <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyInfo</span><span style="color: black;">&#40;</span>faceToVertex<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">#This is hacky and should be replaced with snazzy regex</span>
        faceVerts <span style="color: #66cc66;">=</span>  <span style="color: black;">&#91;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>fv<span style="color: black;">&#41;</span>+<span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">for</span> fv <span style="color: #ff7700;font-weight:bold;">in</span> faceVerts<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;:&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;  &quot;</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;  &quot;</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;  &quot;</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;,&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;,&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
        log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;v: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>faceVerts<span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span>
        vertList.<span style="color: black;">append</span><span style="color: black;">&#40;</span>faceVerts<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">#Normals (vn)</span>
        maya.<span style="color: black;">cmds</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.f[%d]&quot;</span> % <span style="color: black;">&#40;</span>shapeNode<span style="color: #66cc66;">,</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;vn: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>faceNormals<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        vertNormalList.<span style="color: black;">append</span><span style="color: black;">&#40;</span>faceNormals<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">#Texture (vt)</span>
        maya.<span style="color: black;">cmds</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.f[%d]&quot;</span> % <span style="color: black;">&#40;</span>shapeNode<span style="color: #66cc66;">,</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        tex <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyListComponentConversion</span><span style="color: black;">&#40;</span>fromFace<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>toUV<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        tex<span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">filterExpand</span><span style="color: black;">&#40;</span>tex<span style="color: #66cc66;">,</span>selectionMask<span style="color: #66cc66;">=</span><span style="color: #ff4500;">35</span><span style="color: #66cc66;">,</span>expand<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        tex<span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>i.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;map&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;[]&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> +<span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> tex<span style="color: black;">&#93;</span>
        log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;vt: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>tex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#Order is incorrect, need to get in same order as vertex ordering</span>
        tmpDict <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> t <span style="color: #ff7700;font-weight:bold;">in</span> tex:
            maya.<span style="color: black;">cmds</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s.map[%d]&quot;</span> % <span style="color: black;">&#40;</span>shapeNode<span style="color: #66cc66;">,</span>t-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            vertFromTex <span style="color: #66cc66;">=</span> maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyListComponentConversion</span><span style="color: black;">&#40;</span>fromUV<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>toVertex<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
            tmpDict<span style="color: black;">&#91;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>vertFromTex<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;[&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;]&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> t
        orderedTex<span style="color: #66cc66;">=</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> vertList<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
            orderedTex.<span style="color: black;">append</span><span style="color: black;">&#40;</span>tmpDict<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        vertTextureList.<span style="color: black;">append</span><span style="color: black;">&#40;</span>orderedTex<span style="color: black;">&#41;</span>
&nbsp;
        face <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot; &quot;</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;%d/%d/%d&quot;</span> % <span style="color: black;">&#40;</span>vertList<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> vertTextureList<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> vertNormalList<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span> vertTextureList<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span> <span style="color: black;">&#93;</span> <span style="color: black;">&#41;</span>
&nbsp;
        faceValues.<span style="color: black;">append</span><span style="color: black;">&#40;</span>face<span style="color: black;">&#41;</span>    
        log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;f: &quot;</span> +  face<span style="color: black;">&#41;</span>
        log<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;--&quot;</span><span style="color: black;">&#41;</span>
    maya.<span style="color: black;">cmds</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span>oldSelection<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;v&quot;</span>:vertexValues<span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;vn&quot;</span>:vertNormalValues<span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;vt&quot;</span>:textureValues<span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;f&quot;</span>:faceValues<span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;g&quot;</span>:shapeNode<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;GO!&quot;</span>
maya.<span style="color: black;">cmds</span>.<span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">new</span><span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>force<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyCube</span><span style="color: black;">&#40;</span>ch<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>o<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>w<span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>h<span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>d<span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>cuv<span style="color: #66cc66;">=</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>
dataDict <span style="color: #66cc66;">=</span> getData<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;pCubeShape1&quot;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>OK so apart from the messy code structure there is not much to getting the Point/Vertex (v), Normal (vn), Texture/UV/st (vt) data from the scene:</p>
<p>These are the three commands that make it possible to get to the data you want:</p>
<ul>
<li>polyInfo</li>
<li>polyEvaluate</li>
<li>polyListComponentConversion</li>
</ul>
<p>but we need to clean up the output with:</p>
<ul>
<li>filterExpand</li>
</ul>
<p>As well as getting the data out from the scene using</p>
<ul>
<li>pointPosition: P</li>
<li>polyNormalPerVertex: N</li>
<li>getAttr: st/UV</li>
</ul>
<h3>Writing the OBJ data to Disk using Python File I/O</h3>
<p>So to finish it off we simply replace the end of the code with the following:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#Continues from the def &quot;getData&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> writeData<span style="color: black;">&#40;</span>dataDict<span style="color: black;">&#41;</span>:
	outString <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>g default<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> dataDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;v&quot;</span><span style="color: black;">&#93;</span>:
		log<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		outString+<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;v %f %f %f <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % <span style="color: black;">&#40;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> dataDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;vt&quot;</span><span style="color: black;">&#93;</span>:
		log<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		outString+<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;vt %f %f <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % <span style="color: black;">&#40;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> dataDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;vn&quot;</span><span style="color: black;">&#93;</span>:
		log<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		outString+<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;vn %f %f %f <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % <span style="color: black;">&#40;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
	outString +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;g %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % dataDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;g&quot;</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> dataDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;f&quot;</span><span style="color: black;">&#93;</span>:
		log<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		outString +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;f %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> % i
	outString +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
	log<span style="color: black;">&#40;</span>outString<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> outString
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;GO!&quot;</span>
maya.<span style="color: black;">cmds</span>.<span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">new</span><span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>force<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
maya.<span style="color: black;">cmds</span>.<span style="color: black;">polyCube</span><span style="color: black;">&#40;</span>ch<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>o<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>w<span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>h<span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>d<span style="color: #66cc66;">=</span><span style="color: #ff4500;">10</span><span style="color: #66cc66;">,</span>cuv<span style="color: #66cc66;">=</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>
fileLocation <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;/Users/hodgefamily/out.obj&quot;</span>
f <span style="color: #66cc66;">=</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>fileLocation<span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
data <span style="color: #66cc66;">=</span> getData<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;pCubeShape1&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">string</span> <span style="color: #66cc66;">=</span> writeData<span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
f.<span style="color: black;">writelines</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span>
f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
maya.<span style="color: black;">cmds</span>.<span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">new</span><span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>force<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
maya.<span style="color: black;">cmds</span>.<span style="color: #008000;">file</span><span style="color: black;">&#40;</span>fileLocation<span style="color: #66cc66;">,</span>i<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span><span style="color: #008000;">type</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;OBJ&quot;</span><span style="color: #66cc66;">,</span>rpr<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;out&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;STOP&quot;</span></pre></td></tr></table></div>

<p>A friend of mine took my code and cleaned up up Thanks Katrin, you can download it here <a href='http://www.hodge.net.au/sam/blog/wp-content/uploads/objExporter.py' >Katrin&#039;s Source Code</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hodge.net.au/sam/blog/2010/09/30/alias-wavefront-obj-export-in-maya-python-with-examples/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
