musings of a new TD
Creation Camera Script For Maya
Tags: Python, Maya, UI, Dictionaries, Cameras, Script, CSV, WIA mentorship
During my WIA mentorship circle we were presented with python project ideas to help familiarize ourselves with creating production ready tools. One of my goals for my mentorship was to gain confidence in troubleshooting python as well as scripting. Working on this project helped me gain confidence in better understanding context-specific ways to approach coding. I have learned that making mistakes never goes away, but as I do more python I have gotten quicker at knowing what topics to research and identify where the errors might be as well as recognizing when I can’t Google solutions and what to do next. When I began doing python scripting in Maya I used https://pythontutor.com/ frequently to help me learn how to break down my code into simpler steps for both troubleshooting and explaining to other people what I want my code to do without getting into Maya technicalities. One of my motivations to write an overview and reflect on pitfalls throughout the project below is to help me map steps I can refer back to for troubleshooting and writing python code with a specific goal in mind.
The project I worked on is for a camera creation script. This is typically an assignment for Drexel University students so I will not post the actual code. Will Muto who teaches the class has approved the following summary of my thought process and graciously made himself available as a resource throughout the project.
The requirements were as follows:
Layout has a list of camera specs from the shoot. Create a tool in Maya using Python that
Generates a camera selected from a CSV list of cameras.
Sets a single FOV and filmback size per selected camera
Bonus: Add a framing chart image plane and a test render that saves to a folder
Project Planning phase
Before writing any code, I did research on any unfamiliar terminology. Since layout and cameras are a new area, I discussed with Will how I could learn more about production cameras and which ones were commonly used. He provided me with the camera resource https://vfxcamdb.com/ where I selected 3 cameras to draw specs for my CSV list. My first task was to better understand the camera setting requirements and how they were represented in Maya
FOV(field of view)/resolution in Maya
Filmback/film apertures in Maya
Run Through Phase
The next steps I took was doing a manual run through of the camera creation and setting the attributes in Maya to make sure I was including all of the steps and getting the expected outcome before scripting. During this phase I navigated the Maya built in UIs to create cameras and change the attributes while checking the Maya API to see which commands are being run and ensure the correct attributes are changing correctly to the values in my camera CSV list. I did this for each camera so I can ensure consistency and accuracy in the outcome.
UI Planning Phase
When deciding how to do a UI that allows a user to select information imported from a CSV, I researched a few different ways to create the python script including
1) Using an empty list and index to select the camera
2) Using a dictionary and potential nested dictionary
3) Using pandas and numpy
Since this project was using pairings of values (camera name and resolutions) that were not going to be changed but could be added to, I decided against indexing from a list that could get very long as more cameras were added. Will also challenged me to do the script using vanilla Maya and maya commands to create the UI, minimizing the number of outside dependencies. This ruled out numpy and pandas. Dictionaries seemed to do the trick and turned out to be more easily readable.
UI Scripting Phase
This phase focused around
1) Creating a simpler script with step by step comments
2) Importing values from a list to test versus importing from a dictionary created using the CSV values
I was able to create a simple window UI and button along with a way to select the cameras using only Maya commands. During this phase I also tackled making sure naming conventions were done correctly since Maya adds numbering to the end of object titles and can affect the renders in unexpected ways.
UI Function Scripting Phase
I spent an extensive amount of time figuring out how to use nested dictionaries and querying for the correct attributes within Maya commands. I used a lot of print statements to ensure I was importing the correct value types and values since Maya requires very specific types of inputs to work correctly. Will assisted in troubleshooting when I ran into issues where Google, various technical artist forums(some from early 2000s), Maya helpdesk, and Stack overflow failed to provide good answers to.
Script Enhancement Phase
After I completed the script to create the correct camera and specs according to the csv I added an additional functionality of adding a framing chart image plane and a test render. Will provided me with three camera framing chart images that would appear when the correct camera was selected. The steps for this script enhancement were shorter and I tried both using an image plane as well as took a deep dive into setting render attributes using maya commands. One problem I ran into was discerning what folder batch sequences were saved to versus a
single rendered image in Arnold. I also learned about the camera frustum during this phase.
Camera frustum reference image
Completed Script
The final script allows a user to select a camera and name the camera according to the name in the CSV. When a camera is selected, the correct framing chart image plane displays and a test render output PNG of the framing chart is automatically saved to a Maya images folder under the name {name of the camera}_cam.jpg. The script also allows for duplicate cameras and renders. I created this script for the purpose of exporting the cameras to be used in other softwares like Houdini.
Additional Enhancement Ideas
Currently the script doesn't have any default settings or warnings if a framing chart is not available. This might make the script more user friendly. I would also like to have other layout artists test the script to provide feedback on additional feature requests and bugs. In addition I would consider using PyQt to further enhance the functionality.
Example output saved as ArriAlexa65_cam2.jpg. Framing chart image provided by Will Muto
Example output saved as BlackmagiUrsa4k_cam2.jpg. Framing chart image provided by Will Muto
Houdini Flip Fluid Project
Tags: Houdini, Flip Fluid, Mixamo, WIA mentorship
Currently I am working on a personal Flip Fluid camera layout project as part of my Women In Animation Mentorship Circle: Exploring Careers in Code for Film hosted by Will Muto, an FX enthusiast and knowledgeable expert at ILM. I decided to do this project from a reference Pinterest board I created. Creating a Pinterest reference board is another technique that was suggested to me by Debra Isaac who is the founder of Houdini.school to help me apply learnings from tutorials to create more original concept projects. While gathering references for an initial idea of a mug that had a live simulation of a moving ocean, I quickly realized how complex it would be to recreate foam, bubbles, and accurate turbulence. Instead I decided to make a more generalized water character to help familiarize myself more with recognizable water shapes amd turbulence. I selected a project inspired by the opening to one of my favorite television shows, Xena Warrior Princess.
At the beginning of each episode, there is a brief clip of Neptune already emerged from the water. This is the scene I decided to focus on and I managed to put a quick simulation together in Houdini using a mixamo character. I chose a character that is using a "taunt" animation to depict a powerful character. I also paid attention to selecting a more muscular character to hopefully get the larger upper volume I'm looking for.
When I showed Will my work in progress of just the mixamo character and how I transformed his body into liquid using a different tutorial from Youtube, he gave me good feedback on timing and settings to tweak like vorticity and drag, which gave better liquid results and less gel like texture overall. This also helped the character to maintain his shape better. We had a discussion about scale of the character and how to use context and amount of force the fluid should have to accurately convey that this is a God-like character.
I explored different ways to fake more water and used a different tutorial that shows how to create debris cannons in Houdini that can be used for blood or other types of supplemental materials that are small scale. The cannons seem to work well to supplement my character, giving the illusion he is creating quite a disruption in the body of water he will emerge from. I also did some additional study of how to create water flows using only meshes from the tutorial Houdini.school Liquid SOPs to better understand the shape of water and how to control it without simulations.
Next, I am working on a script that will help me move between Houdini and Maya and ensure consistent cameras are being created which would be helpful if more people were working on this project. My goal is to also set up layout and camera for this scene as part of my project.
Pinterest reference board for Flip Fluid Water God project. Link: https://www.pinterest.com/ninettemtan/flip-fluid-inspiration/
Test render of Water God before cannons
Test render of Water God after cannons were added
Debugging Openimageio
Tags: OpenImageIO, C++, Debugging, ASWF Dev Days, Github, OpenColorIO, VS Code
Initially, I went back and forth on whether I should participate in Dev Days. Ultimately, I reminded myself that a long term goal I had set for myself during ASWF's summer learning program was to be more involved in ASWF's open source projects. I already had limited exposure to USD and had been following along with the slack channels for OpenImageIO as well as OpenColorIO. In addition, I attended a few of the townhalls during ASWF's Open Source Days to better familiarize myself with the projects and their specific goals. It was helpful to see how the projects are intended to be used by artists and see examples of the tools in action.
After hitting submit on the registration page, I felt immediate pangs of impostor syndrome and an overwhelming fear that my limited coding knowledge would prevent me from making any meaningful contributions. I was able to regain a bit of confidence after some reassurance from Karen Ruggles, who heads the ASWF D&I group. I also felt reassured after seeing posts with instructions and encouragement from other leads like Carol Payne and Larry Gritz. One helpful piece of advice was to look at the Github repo of the project I would be working on, which I finally decided would be OpenImageIO.
The second piece of advice that was helpful was looking for any issues tagged with "good first issue." I decided to work on Issue MOV file causes exception when opening · Issue #3656 · AcademySoftwareFoundation/OpenImageIO · GitHub since it included language like "mov" that was recognizable to me. The first step I had to do was set up the project on my computer using a terminal. There were instructions provided on the Github repo of how to load OpenImageIO using linux and on Apple. I went down a rabbit hole of Googling how to set up the project and all of its dependencies on my computer due to it being less straight forward on Windows. I had spent half a day researching OpenImageIO and comparing other project setups like OpenColorIO. I learned that OpenImageIO was an optional dependency for OpenColorIO and was also able to coordinate with a learner from my summer program, Brooke Galvin, who had been taking her own notes on setting up OpenColorIO. I followed her very clear google doc, which had hopefully loaded all the necessary files needed for OpenImageIO.
I still had trouble confirming if the files were in fact loaded correctly on my computer and after a supportive pep talk from both Carol Payne and Febry Cremer, decided to lean on the help of the OpenImageIO slack community, posting a question to the group if anyone had successfully set up their project on Windows. Through this communication channel I found a very helpful person, Jesse Y, and owe him so much gratitude for assisting me in using the windows cmd interface to confirm vcpkg and cmake were successfully installed so I could load OpenImageIO. We then worked together to reproduce the bug in VS Code and post updates to the OpenImageIO bug to gather any missing information. Although I had just completed a refresher course on C++, I quickly realized how easy it was to forget how the main.cpp file is used for testing functionality, when working with code created by other people. It was a rewarding and exciting experience to learn how to work with engineers on an open source production tool like OpenImageIO with many contributors and understand how issues can arise from dependencies that may need to be updated. I hope to participate in future projects and Dev Days going forward.
Unreal Engine's Game Jam: 2D game
Tags: Unreal Engine, 2D Game development, Level Design, UI, Blueprints, Github, Unreal Engine Game Jam
I met quite a few artists who were interested in working for a game company during ASWF's summer learning program. One concept I had been curious about was a game jam, which to me was a sort of hackathon for game creators and engineers. A learner in the summer program, John Haley, had posted his progress on previous game jams and shared a trailer of his winning entry. His team's Unity game jam entry, "Sword of the Morel, inspired me to participate in my first game jam. When the opportunity presented itself for me to learn how to create my first game for Unreal Engine alongside two artists (Ella who has a 2D background and another summer learner, Chris, who is more technically focused), I jumped at the opportunity.
Although I was familiar with Unreal Engine's interface and had had exposure to blueprints for animating and scene creation, there was quite a learning curve with developing a fully operable game in UE. Our first challenge was to develop a game concept that was in line with the theme. The theme of the game jam was "Antiquate Future." In our desire to create an engaging game play experience, our team unanimously decided to do a metroidvania style game, which I admittedly had to Google to better understand what that entailed. Luckily since this was the first game jam for all of us, Googling was encouraged for research purposes throughout the game jam planning and execution phases. We also decided to go with 2D versus 3D since our main artist felt more familiar with that style given her background and that she already had 2D assets on hand we could reuse. Other details we continued to flesh out over Discord included character and environment appearance as well as the mechanics.
With the main planning logistics taken care of, we moved onto setup. Christopher handled unpacking the UE game kit and setting up our Github to share and upload resources and files. For this project, we used Github desktop along with Discord to handle any versioning issues and merge conflicts. We decided to go with Github after running into some issues setting up Perforce, which was the alternate route of sharing files. This point and click method of sharing files came in handy when I uploaded updates like blueprints and templates for menu button functionality along with tiling and asset importing of props and environment backgrounds.
Although we were unable to finish our game, it was a rewarding opportunity to learn alongside other artists who were curious about tackling a 2D game in Unreal Engine (which I learned later is much harder than 3D), and exposed me to Unreal Engine functionality that I hadn't previously explored. I also developed a newfound appreciation for artists and game creators who finished their game in time for submission and were successful in creating and implementing a fully functioning game in a short period of time. Once again, I want to give a huge thank you to my wonderful team who was really patient and amazing to work with.
Tiling background example before character test run. Built environment from Oakwood tileset and sewer assets
Demonstration of game play navigating after I resized tiles to character. Character design by Ella
ASWF 2023 Summer Learning Program Recap: Animation project
Tags: Animation project, Modeling, Texturing, Rigging Original story concept, Puppets, Arnold, Maya, Team project, ASWF Summer Program
When I began my job transition to computer graphics and coding, I looked for organizations that both supported LGBTQIA++ learners and shared a vision of diversifying the teams who work on TV, games, and film. While searching, I discovered the Academy Software Foundation(ASWF) Diversity and Inclusion Group. It took a couple years for me to build up my skills and foundational knowledge in Maya and python before I was admitted to this well sought after motion picture and technology focused program hosted by the ASWF's Diversity and Inclusion Group.
I was more than excited to be selected as 1 out of 20 learners who would be given access to FX educational courses on production level topics and mentorship support. My knowledge of the FX pipeline grew as I explored Houdini and learned how to develop HDAs using VEX. I also knew that I learn best when it is project focused so I employed the same technique with my assigned mentor when tackling a pipeline project in Maya. My mentor, Patrick Coleman, who is very knowledgeable about the industry helped me translate a set of personal goals for the program into a list of ideas including short sprint like studies. His suggestions helped me step away from following tutorials and allowed me to explore more original creative ideas while working on teams.
This topic of thinking outside the box came up when I presented him with a dilemma I had of how to execute a short film storyline I came up with. His best advice was to simplify so that I can meet a set deadline and if possible enlist the help of other artists. While deciding what to do, I had simultaneously signed up for an introductory puppet building workshop to strengthen my foundation of rigging and what to focus on to tell a good story. During the first puppet workshop I learned about a type of Japanese puppetry called Bunraku, where multiple puppeteers are involved and each puppeteer must spend time mastering one appendage before graduating to operate another part of the body. This unique style of theatre presented an interesting challenge to do a rig of just the legs and feet as well as to tell a story from just that perspective. I decided to use this idea to drive the narrative of my short film.
I worked with another summer learner and highly skilled technical artist, Julia Sousa, on a storyboard and concept art. She was also, luckily, enthusiastic about parts I was less familiar with including environment setup and animation contributions. After presenting my script to her, we decided feedback from a writer friend might help us ensure we were on the right track. The feedback my writer friend gave was instrumental in helping us align the story to the scope of the character's limitation, which in this case was a camera view from below the torso. Julia then developed an animatic which helped us visualize and decide which scene we would be able to create and focus on by the end of the program.
My main contribution was the initial story concept and main character rig and model (legs and crocs). The final presentation, which was an Arnold render, blew me away in seeing an end product from start to finish. I had so much fun working with Julia and incorporating feedback from other senior artists. This project and my supportive community of summer learners and summer leads, overall, reaffirmed my switch in careers to CG where I can work alongside CG artists in film and television. As an added bonus, I gained valuable insight from more experienced mentors.
Scene of main character walking into flower shop from animatic by Julia Sousa
Responsible for character rig, model, and texture. Render and animation by Julia Sousa
Screenshot of Google drive shared folder showing organization of project assets
Test render and shot by Julia Sousa