Showing posts with label Tech Art. Show all posts
Showing posts with label Tech Art. Show all posts

Thursday, November 13, 2025

Inheritance

Script Objective:

1. I would run the import script first to get the geometry, csg, box, and tube module I created, then my code to get the desired output I wanted:














2. Final Shape:





























Perforce Proof:



Thursday, November 6, 2025

Python Classes

 

CSG Object Calculator


Script Objective:
This script creates and manages geometry in Houdini with Python:
  • Auto-placed Objects: Each new object appears in the scene with a name label.

  • Merged Layout: All objects are in a single container.

  • CSG Operations via Python Operators:

    • ~ Invert

    • + Union

    • - Difference

    • & Intersection


1. Objects laid out with labels. Using the code stated in Canvas to test out the calculator:











box = CSG("box", "box")
sphere = CSG("sphere", "sphere")
thing = CSG("thing", "testgeometry_rubbertoy")

#Operations
union_result = box + thing
diff_result = thing - sphere
intersect_result = box & thing
invert_result = ~thing


2. Other operations:














#Operation Difference from first result:
union_result = sphere+ thing
diff_result = thing - box
intersect_result = sphere& thing



Troubleshooting:

When I was writing the script, it kept on giving me an invalid node name error, so I just looked up the error on Google and scoured several forums, which led me to the Python documentation for isalnum, allowing me to hardcode and remove any special characters Houdini does not like:
  • only allow letters, numbers, and _
  • for c in name: iterate over every character in the string
  • c.isalnum(): true if character is a letter or number
  • or c == "_": allow _
  • else "_": any invalid name characters are replaced with _
  • "".join(...): stitch back the string together






c meaning character




Perforce Submission:
//CLASSES/Cohort22/Students/Jocelyn.Fayola/Tech Art/Python/HW10.py










Thursday, October 30, 2025

Functions & Data Types

 

Creating My Army of Darkness


Script Objective:
The user inputs the base number of soldiers and level depth, and the script generates an army based on this formula:
Base = number of soldiers when squared comprises a unit (1,4,9,25, etc)
Level-1 = number of times to square to base
Number of soldiers = (Base^2)^(Level-1)
Eg. Base 2, Level 5= (2**(2*(5-1))) = 256

1. The user has to type in the base value and level depth




































2. Generates an army of soldiers "separated" in units for random colors and shapes. The soldiers are also rotated randomly.


Examples:

Base: 2, Level: 2 = 4 total soldiers
























Base:4, Level: 3 = 256 total soldiers


























Base:5, Level: 4 = 15625 total soldiers


























Perforce File Path:
//CLASSES/Cohort22/Students/Jocelyn.Fayola/Tech Art/Python/HW9.py








Wednesday, October 22, 2025

Intro To Python

 

Tool Creation in Houdini


Script Objective:
The user inputs the scale and number of objects, and the script generates a 3D grid of randomly colored shapes in Houdini, each within a separate geometry container.
























1. A UI window pops up to query the user on which shape type to generate:



2. The user has to type in the number of objects created in length, width, and height using (length,width,height) to store the value so it can be used in the script




















3. The user is asked to determine the scale of each object with a given range of 0.1 to 10.0. The script clamps the value to the specified range if the user inputs a value that is lower or higher than the minimum or maximum.



































4. Example of 3x3x3 spheres with a scale of 5 and randomly generated colors for each shape node (Not related to the input value shown above):






































Troubleshooting & Research:
1. Houdini kept crashing every time I queried a second time, and it made me annoyed enough to look for other alternatives. I also didn't want the user to have to type the object shape types, as typos can occur, so I looked for a solution involving the UI. The Houdini documentation page proved helpful for this.













Perforce File Path:
//CLASSES/Cohort22/Students/Jocelyn.Fayola/Tech Art/Python/HW8.py




Tuesday, October 7, 2025

Animation State Machine

 

Locomotion System with Blendspaces



1. My locomotion system with a jump and fall animation. The character's jump input is the space bar, and it will play the fall animation after jumping. However, it will also play the fall animation when the character throws itself off a tall height:




2. Jump Input. Added a launch character node so that the character will jump higher, allowing the fall animation to play. Also added an event landing node so that the character doesn't when it is landing:


































3. Animation State Machine:























4. Folder Structure and Location. I downloaded a FAB asset level to showcase this project:





Tuesday, September 30, 2025

Game Animation

 

IK Retargeting in Unreal Engine



1. Character Animation Instances with custom ROM, Mixamo Animation, and custom jump animation using my own rigged Archer character and "Brady" from Mixamo:





















2. Archer and Brady IK Rig:

















3. IK Retargeter:














4. Separated all the Archer and Brady imports into different folders:

















5. Level file path:
(c:\Dev\Cohort22\Students\Jocelyn.Fayola\Tech Art\JocelynFayola_HW\JocelynFayola_HW6\Content\JocelynFayola_HW6\JocelynFayola_HW6.umap)























3. 

Monday, September 22, 2025

Basic Rigging

 

Archer Rig



1. Created the joints for the mesh and renamed it as shown in the lecture (To allow easy retargeting for UE). I created an extra arrow joint to help with the weight paint of the arrow props:


































2. Created FK controls for the joints (except arrows) and parent constrained them after match transforming to locally position them in the correct orientation and place. My controls are nestled in a pad group and an offset group that are used to create a cleaner control rig. For example, the pad group holds the translation and rotation values from the match transforms (which can be zeroed out to go to the world position origin easily if anything goes wrong). The offset group is currently a clean null group that I can add set-driven keys to so that the actual NURBS curves won't have double transforms when I create set-driven keys for them:

















































3. Created a layer for the geometries and joints for easy access during grading; they are in reference mode when the file is opened. Final deformation test:

Extras:

1. IKFK switch:
I created an IKFK switch for the arms and legs. Usually, I would make sure the hands and feet were in world position, but since we aren't focusing on IKs this week, I let them remain in their local orientation, and later, I could add a world-local switch attribute. I'm also not fond of how the IKFK control rotates with the arms, so next time I'll limit the transforms or use a point constraint instead.




























2. Stretch attribute:
The IK controls for the limbs have a stretch attribute created using matrix math nodes. They actually changed some of the math nodes in the Maya 2026 updates. For example, "addDoubleLinear" is now "addDL."









In my rig file, there is a hidden group called "deformation_grp" that holds the joints and systems. It keeps the IK and stretchy systems, making it easier to export the skeleton mesh to Unreal Engine in a later process and to better organize the rig overall.


Perforce:






Sunday, September 14, 2025

Intro to Blueprints

Treasure Chest



1. Exported a treasure chest asset from FAB. Created a rig and "open chest" animation in Maya. Imported it into my project as a skeletal mesh and an animation.

2. Created a montage from the imported animation. Disabled the enable auto blend settings so the animation would stop playing once over. 


3. Created an animation blueprint to control the skeletal mesh animation.


4. Created a blueprint for the chest. Added a "G" keyboard input so that when the "G" is pressed the chest animation plays.


5. Created a widget blueprint using the user interface. I ended up not liking how it looked, so I created a different way to pop up a text using the Niagara System, paired with my custom text asset (which I converted into a material), to achieve a pop-up in the level on top of the chest instead. I chose to do the Niagara system because I want the text sprite to rotate with the camera. I kept the widget pop-up in the level blueprint for documentation purposes.






6. Create a collision box to act as a trigger box (as learned in class) so that when the player gets close to the chest, the text pops up (the Niagara system activates), and when the player moves away from the chest, the text goes away.

7. Next, I created a translucent glow material for the chest so I could make it emit an outline. Since the chest poly count is low, it looked weird, so I duplicated and then subdivided the static mesh of the chest in Maya. In the materials, I made the outside of the mesh transparent and the inside glow using a "twosidedsign" node paired with a lerp node. I added an offset to the world position normals to create the outlined effect.

I created a scalar material node in the blueprint and connected it to a new timeline so the material would "blink." The timeline has 3 keyframes where its value goes down, up, then down. I created a Boolean variable to determine whether the outline is active based on the actor's position relative to the trigger box. I connected it to the existing On Component Begin Overlap / On Component End Overlap events. I used the same variable for when the chest is opened ("G" is pressed), but with a "Set Visibility" node to ensure it completely disappears when the chest is opened. 



























8. Next, I wanted to fix the "G" input event so that it would only work when the player is inside the trigger box (I created a platform in the scene that is the same size as the trigger box to show when "G" event can occur). Additionally, I modified the text pop-up so that it would only appear when the player is in the trigger box. I used the same method of creating a Boolean variable and getting its set node to determine when and when not to activate the event. 

9. Finally, for my dynamic material, I connected it to the press "G" event's animation montage so that after the chest opens, a pearl with an emissive material would gradually start to glow. I used another timeline node with a glow track to animate the emissive.

 







This is how the final BP_Chest ended up looking:












How it looks in the game scene:





















Better Quality Video:



Directory Structure:

1. I created a new level in our <YourName>_HW2 previous project (//CLASSES/Cohort22/Students/Jocelyn.Fayola/Tech Art/JocelynFayola_HW/)






































2. Created a new level named HW4Blueprints
(//CLASSES/Cohort22/Students/Jocelyn.Fayola/Tech Art/JocelynFayola_HW/JocelynFayola_HW2/Content/TechArt/Maps/HW4Blueprints.umap)

















3. My BP_Chest is in a separate folder under the Content/TechArt folder
(//CLASSES/Cohort22/Students/Jocelyn.Fayola/Tech Art/JocelynFayola_HW/JocelynFayola_HW2/Content/TechArt/MyBlueprint/ChestBP/BP_Chest.uasset)

4. All other assets used are in this Tech Art folder. The original treasure chest static mesh should be under the FAB project folder. 

Start of FIEA Portfolio