На текущий момент в индустрии производства спецэффектов фактическим стандартом является python. Он используется в большом количестве 3D и 2D пакетов, таких как Maya, Houdini, XSI, Nuke. Существует огромное количество расширений для связки python практически со всеми технологиями. При его помощи Вы можете напрямую обращаться к базам данных, генерировать динамические web cтраницы. Одним словом python является практически идеальным решением для написания pipeline. > Для того чтобы получить доступ ко всем возможностям Maya, необходимо всего лишь написать
import maya.standalone
maya.standalone.initialize()
C этого момента мы можем использовать все возможности maya прямо в интерпретаторе python.
Я приведу несколько приципов программирования, которые позволят сделать пайплайн гибким и легко расширяемым при появлении новых задач
- Разделяйте функциональные процедуры и процедуры создающие графический интерфейс. Это позволит использовать один и тот же скрипт как в графическом так и в командном режиме.
- Используйте платформенно независимые решения. Это позволит бескровно портировать пайплайн при смене операционной системы.
- Для вызова функциональных модулей используйте промежуточный скриптовую оболочку, предназначенную только для парсинга аргументов и вызова функционального модуля.
Пример скриптовой оболочки приведен ниже.
@setlocal enableextensions & mayapy -x %~f0 %* & goto :EOF
Эта команда позволит переименовать скрипт-оболочку в *.cmd, для запуска скрипта вместо вызова mayapy scriptname.py args, можно будет пользоваться более коротким вызовом scriptname args. Далее следует описание основной функции скрипа main() и описание всех аргуменов скрипта.
def main():
usage = "usage: %prog [options] for example: \n
s3d_wrapper -c genBaseScene -i scene.ma -p //server/project/scenes/ -s 1 -e 70"
parser = OptionParser(usage=usage)
parser.add_option("-i", "--inputScene", action="store", type="string", dest="sceneName", help="Input Maya Scene to process")
parser.add_option("-p", "--project", action="store", type="string", dest="projectPath", help="Project Path")
parser.add_option("-c", "--cmd", action="store", type="string", dest="command", help="Describes a pipeline step.
Possible values: genAlfJob, genBaseScene, genRib, genRenderScene, ")
parser.add_option("-s", "--startFrame", action="store", type="int", dest="startFrame", help="Start frame. Default value: %default")
parser.add_option("-e", "--endFrame", action="store", type="int", dest="endFrame", help="End frame")
parser.set_defaults(startFrame=1)
(options, args) = parser.parse_args()
scene = options.sceneName
project = options.projectPath
command = options.command
start = options.startFrame
end = options.endFrame
Далее мы определяем какой процесс пайплайна должен быть вызван скритом и передаем аргументы в функциональный скрипт.
if command == 'genBaseScene':
exec 'from s3d_processScene import *'
statusCode = s3d_processScene(project, scene, end, 4, start)
cmds.quit(f=True)
elif command == 'genRenderScene':
exec 'from s3d_processRenderScene import *'
statusCode = s3d_genRenderScene(project, scene, end, start)
cmds.quit(f=True)
else:
print 'Das Befehl ist nicht gefunden\n'
И этот блок запускает функцию main() при вызове скрипта:
if __name__ == "__main__":
import sys
from optparse import OptionParser
main()
Такая структура позволит нам при необходимости добавить новые процессы пайплайна, используя стандартный интерфейс вызова скрипта:
s3d_wrapper -c pipelineStep -i sceneName -p //server/project/scenes/ -s 1 -e 70