maya2022を使用
ミラーボールを作りたかったのですが、まずは面数の少ないサッカーボールの作り方を学んでからにしようと思い色々な動画をみて勉強しました。
工程のメモと合わせて一発でサッカーボールが作れるスクリプトを作成しました。
コードはpython3のため過去バージョンのmayaでは動作しない可能性があります
参考動画
どの動画も作り方はほぼ同じでした。
Maya for Beginners | Soccer Ball / Football Modeling in Maya
https://youtu.be/F33tN0C2C-o
Maya modeling tutorial : How to model soccer ball in Maya2016
コード
上手くいけばこのようなサッカーボールが作成されます。
五角形を黒くしたい場合は手動でマテリアルを割り当ててください。
スムーズ メッシュ プレビューで三角形:69120ポリゴン

# -*- coding: utf-8 -*-
import maya.cmds as cmds
cmds.polyPrimitive(pt=0, r=10, l=0.4036)
sl_nodes = cmds.ls(sl=True)
cmds.select(sl_nodes)
cmds.ConvertSelectionToEdges()
cmds.DetachComponent()
cmds.polySmooth(sl_nodes, dv=2)
cmds.sculpt(sl_nodes)
cmds.setAttr("sculptor1.scaleZ", 10)
cmds.setAttr("sculptor1.scaleX", 10)
cmds.setAttr("sculptor1.scaleY", 10)
cmds.select(sl_nodes)
cmds.DeleteHistory()
cmds.polyExtrudeFacet(thickness=0, localTranslateZ=-1, offset=-1)
cmds.polyNormal()
cmds.displaySmoothness(polygonObject=3)
pythonの説明
どのような手順でサッカーボールが作られるのか簡単に解説します。
ボールの半径は10cmに設定、直径が20cmになるようにしています。
押し出しの値を変更することで溝の深さや幅を調整できます。
- 作成 > ポリゴンプリミティブ > サッカーボール
- すべてのエッジを選択
- メッシュの編集 > デタッチ
- メッシュ > スムーズ(サブディビジョン:2)
- デフォーム > スカルプト
- スカルプトのサイズ拡大
- ヒストリー削除
- メッシュの編集 > 押し出し(ローカル移動Z:-1、オフセット:-1)
- メッシュの表示 >反転
- スムーズ メッシュ プレビュー(ホットキー:3)
カラーも自動でアサインしたい
五角形を選んでアサインもちょっと面倒くさいと感じたのでマテリアルも自動で設定できないか試してみましたが上手くいきました。
# -*- coding: utf-8 -*-
import maya.cmds as cmds
# 白色マテリアル作成
cmds.shadingNode('phong', asShader=1, name='color_white')
cmds.sets(renderable=True, empty=1, noSurfaceShader=True, name='color_whiteSG')
cmds.connectAttr('color_white.outColor', 'color_whiteSG.surfaceShader', f=1)
cmds.setAttr('color_white.color', 1, 1, 1, type="double3")
# 黒色マテリアル作成
cmds.shadingNode('phong', asShader=1, name='color_black')
cmds.sets(renderable=True, empty=1, noSurfaceShader=True, name='color_blackSG')
cmds.connectAttr('color_black.outColor', 'color_blackSG.surfaceShader', f=1)
cmds.setAttr('color_black.color', 0.05, 0.05, 0.05, type="double3")
cmds.polyPrimitive(pt=0, r=10, l=0.4036)
sl_nodes = cmds.ls(sl=True)
cmds.select(sl_nodes)
cmds.ConvertSelectionToEdges()
cmds.DetachComponent()
cmds.polySmooth(sl_nodes, dv=2)
cmds.sculpt(sl_nodes)
cmds.setAttr("sculptor1.scaleZ", 10)
cmds.setAttr("sculptor1.scaleX", 10)
cmds.setAttr("sculptor1.scaleY", 10)
cmds.select(sl_nodes)
cmds.DeleteHistory()
cmds.polyExtrudeFacet(thickness=0, localTranslateZ=-1, offset=-1)
cmds.polyNormal()
# 白色マテリアルアサイン
cmds.sets(forceElement='color_whiteSG', e=1)
# 分離追加
cmds.polySeparate(sl_nodes)
cmds.displaySmoothness(polygonObject=3)
sl_nodes2 = cmds.ls(sl=True)
for sl_node2 in sl_nodes2:
cmds.select(sl_node2)
t_cnt = cmds.polyEvaluate(t=1)
if t_cnt == 120:
# 黒色マテリアルアサイン
cmds.sets(forceElement='color_blackSG', e=1)
pythonの説明
先ほどの工程以外の追加処理の解説です。
まず白・黒マテリアル作成(phong)。
白色マテリアルをアサインした後、メッシュを分離しています。
五角形のポリゴン数は120だったため、if文でポリゴン数120のメッシュに黒色マテリアルをアサインしています。