Blender

From OniGalore
Revision as of 16:12, 1 May 2022 by Delano762 (talk | contribs) (→‎Animation rig with IK and FK: Updated one of the links)
Jump to navigation Jump to search
Unfinished building-60px.jpg

This page is unfinished. Can you fill in any missing information?
If it is not clear which part of the page is unfinished, ask on the talk page.


Aged parchment-60px.jpg

This page contains information that is out of date.
Double-check for changes in Blender's features, workflows and UIs of version 2.8, as some sections might cover version 2.79.

Controls

Blender is so radically different from any other tool that you might want to customize the controls. In that case, have a look at:

File > User Preferences... > Input > 3D View > 3D View (Global)

The more controls you change, the harder it gets to follow a tutorial. Consider biting the bullet and keeping the controls as they are.

Viewport

Blender display mode Texture.png
Blender display mode Material.png

Q: How can I change the display mode to see textures?

A: At the bottom, click at the circle button to get a dropdown menu.
Texture gives you just rough shading.
Use Material instead to see textures plus rough shading.

Q: How do I get global lighting?

A: Go to the World properties and select the box Environment Lighting. (See the Warehouse screenshot)
Oni WH Env Blender.png


Object mode with vertex colors

In the upper right are small "sphere" buttons and an arrow.
When "solid" is selected, click on the arrow to open a drop down menu and change the color to vertex.

UI

Q: How do I close panels?

A: In the upper right corner drag the triangle symbol on another equal sized panel.

Tools and actions

Blender has excellent documentation. See HERE for the general docs on face-editing.

Q: How do I select faces, edges and vertices (points)?

A: There are controls at the bottom of the viewport. While being in Edit Mode, make the Edge symbol active. Right-click a component to select it. Use Shift to add or subtract.

Q: How do I toggle between selection modes.

A: See here.

Q: How do I (de)select all?

A: Press A.

Q: How do I fill holes in meshes?

A: Select edges of the hole. Press F to make a N-gon face or press F + Alt to make a triangulated face.

Q: How do I show normals?

A: Press N to toggle for a panel with more properties. Scroll down to Mesh Display section. You likely want to click the faces symbol.
Remove hard (blue) edge
In edit mode select edge, go to the right, open "Shading / UVs"
Edges: "Smooth" button
Triangulate faces
Select faces, Control + T
Quadrulate triangles
Select faces, Alt + J

Q: How do I edit UVs?

A:

Hotkeys

Right-click a menu for the context menu. Often this allows you to assign a hotkey.

Development

Blender 2.8 Python Tooltips.png

You may want to go to the preferences and switch on Python Tooltips.

Contrary to intuition, the Developer Extras do not give you additional Python functionality per se. Instead this option enables experimental Blender features.

Related videos:

Tutorials

General Blender basics:

Modelling

Rigging

Animation rig with IK and FK

Currently we have a rig available in the form of a Blender scene available HERE. The rig was made by Geyser and Delano762, and a loose tutorial on how to use it is available HERE. The rig is based off the Rigify plugin for Blender.

The rig has these capabilities (which come with Rigify by default, unless otherwise noted):

  • Snapping to Oni animations through bone constraints controlled by the Z location of the objects in the Pose Matching layer (added feature)
  • Inverse and Forward Kinematics (IK and FK)
  • Snapping between IK and FK chains
  • Function to snap IK hand controller rotation to the wrist bone, integrated into rig_ui.py (added feature)
  • IK joint poles for specifying limb joints (elbows and knees) should be facing
  • Sliders specifying how much the neck, head and FK limbs should retain their world space rotation – that is, Neck Follow, Head Follow and FK Limb Follow
  • IK Foot pivoting controllers around toes and the heel
  • Root bone
  • The rig has some scripts available for it listed below

Tutorial for creating animation rig

If you want to create the above rig, and learn a bit about rigs, IK/FK, Rigify, Blender, bone layers, bone constraints, scripts, issues with Oni models and animations such as the rotation order being incompatible with Blender, see Creating an animation rig in Blender.

Scripts

Script for enabling/disabling constraints in selected objects

This script allows the user to enable or disable constraints in the currently selected objects. This is done by checking the value of the first constraint in the first selected object, flipping it and setting it for all constraints in all objects. Usage is simple, just select your objects and run the script.

#ObjectConstraintEnabler
import bpy
body_parts = bpy.context.selected_objects  #All selected objects

#Search all objects in body parts for the first object with constraint.
for part in body_parts: 
    if len(part.constraints)>0: 
        if part.constraints[0].mute==0: #At this point, check if the first constraint in the bone is enabled or disabled...
            value=1 #...and set the value as invertion of that
        else:
            value=0
        break #Break the loop as we just need the first mute value we will run into
    
for body_part in body_parts:
    for con in body_part.constraints:
        con.mute = value

Script for enabling/disabling bone constraints in the selected armature

This script allows the user to enable or disable bone constraints in the currently selected armature. This is done by checking the value of the first bone constraint in the first bone of the selected armature, flipping it and setting it for all bone constraints in all bones. Usage is simple, just select your armature in the Object Mode and run the script.

#BoneConstraintEnabler
import bpy
body_part = bpy.context.selected_pose_bones_from_active_object #All bones in the rig

#Search all bones in body parts for the first bone with constraint.
for bone in body_part: 
    if len(bone.constraints)>0: 
        if bone.constraints[0].mute==0: #At this point, check if the first constraint in the bone is enabled or disabled...
            value=1 #...and set the value as invertion of that
        else:
            value=0
        break #Break the loop as we just need the first mute value we will run into
            

for bone in body_part:
    for con in bone.constraints:
        con.mute = value

Blender forward throw adjustment script

Please see the XML:TRAM page describing this script.

Rig bone constraint target setting script

This script sets the targets of Geyser's rig bone constraints, after removing one of the existing pose-matching characters and replacing it with another.

#RigBoneConstraintTargetSetter
import bpy
obj = bpy.data.objects

#SET THIS TO EITHER 1 OR 2 DEPENDING ON WHICH POSE YOU ARE GOING TO USE
prefix='1'

armature = bpy.data.objects['rig']

#copying location
armature.pose.bones["torso"].constraints['Copy Location.00'+prefix].target=obj['mid.00'+prefix]
armature.pose.bones["torso_pivot"].constraints['Copy Location.00'+prefix].target=obj['pelvis.00'+prefix]

#copying rotation
#Torso
armature.pose.bones["hips"].constraints['Copy Rotation.00'+prefix].target=obj['pelvis.00'+prefix]
armature.pose.bones["tweak_spine.001"].constraints['Copy Rotation.00'+prefix].target=obj['mid.00'+prefix]
armature.pose.bones["chest"].constraints['Copy Rotation.00'+prefix].target=obj['chest.00'+prefix]
armature.pose.bones["shoulder.R"].constraints['Copy Rotation.00'+prefix].target=obj['right_shoulder.00'+prefix]
armature.pose.bones["shoulder.L"].constraints['Copy Rotation.00'+prefix].target=obj['left_shoulder.00'+prefix]
armature.pose.bones["neck"].constraints['Copy Rotation.00'+prefix].target=obj['neck.00'+prefix]
armature.pose.bones["head"].constraints['Copy Rotation.00'+prefix].target=obj['head.00'+prefix]

#Arms
armature.pose.bones["upper_arm_fk.L"].constraints['Copy Rotation.00'+prefix].target=obj['left_biceps.00'+prefix]
armature.pose.bones["upper_arm_fk.R"].constraints['Copy Rotation.00'+prefix].target=obj['right_biceps.00'+prefix]
armature.pose.bones["forearm_fk.L"].constraints['Copy Rotation.00'+prefix].target=obj['left_wrist.00'+prefix]
armature.pose.bones["forearm_fk.R"].constraints['Copy Rotation.00'+prefix].target=obj['right_wrist.00'+prefix]
armature.pose.bones["hand_fk.L"].constraints['Copy Rotation.00'+prefix].target=obj['left_handfist.00'+prefix]
armature.pose.bones["hand_fk.R"].constraints['Copy Rotation.00'+prefix].target=obj['right_handfist.00'+prefix]

#Legs
armature.pose.bones["thigh_fk.L"].constraints['Copy Rotation.00'+prefix].target=obj['left_thigh.00'+prefix]
armature.pose.bones["thigh_fk.R"].constraints['Copy Rotation.00'+prefix].target=obj['right_thigh.00'+prefix]
armature.pose.bones["shin_fk.L"].constraints['Copy Rotation.00'+prefix].target=obj['left_calf.00'+prefix]
armature.pose.bones["shin_fk.R"].constraints['Copy Rotation.00'+prefix].target=obj['right_calf.00'+prefix]
armature.pose.bones["foot_fk.L"].constraints['Copy Rotation.00'+prefix].target=obj['left_foot.00'+prefix]
armature.pose.bones["foot_fk.R"].constraints['Copy Rotation.00'+prefix].target=obj['right_foot.00'+prefix]

Visual transformer script

This script "bakes" the animation done using Geyser's rig into Oni character model bones by applying visual transform and keyframing each frame within a specified frame range.

import bpy

start = 0
end = 100

scene = bpy.context.scene

scene.frame_set(start) #set start frame
for i in range(start, end): #loop for every frame
        scene.frame_set(i)
        bpy.ops.object.visual_transform_apply()
        bpy.ops.anim.keyframe_insert_menu(type='BUILTIN_KSI_LocRot')

Oni-specific issues with Blender

Rotation order issue between Oni and Blender

The previous XSI process allowed us to get to work pretty quickly: you could simply export any animation from Oni as a COLLADA file using OniSplit, then import it to XSI and it would work (mostly) without any quirks. That is not the case with Blender.

If you import any Oni animation into Blender as it is, the rotations will be all wrong.

That's because Oni's rotations are stored in XYZ Euler rotation order, while Blender's XYZ is actually ZYX despite being called "XYZ".

You can prove that by simply switching the rotation order of the body parts from XYZ to ZYX, as shown below – the image on the left shows KONCOMcomb_p imported to Blender without any adjustments, with the rotation order set to Blender's default "XYZ", while the image on the right shows the same animation after switching the rotation order to ZYX.

KONCOMcomb_p in Blender's XYZ KONCOMcomb_p in ZYX
ARB KONCOMcomb p XYZ.png ARB KONCOMcomb p ZYX.png

Because of this, geyser implemented the -blender argument in OniSplit, which solves this problem by converting Oni assets' rotation order from XYZ to Quaternions and then to ZYX, and vice versa when exporting assets from Blender to Oni. So that conversion flow looks as follows:

  • From Oni to Blender:

XYZ → Quaternions → ZYX

  • From Blender to Oni:

ZYX → Quaternions → XYZ

To summarize: Always use the -blender argument when you're exporting assets from Oni to Blender, otherwise you can expect the problem shown in the above screenshots.


Broken alpha transparency and textures on animated models

Currently there is no option in OniSplit that would allow exporting animated models with textures. While you don't need textures for animating, they are very useful, particularly in case of Oni - the models are low detail to a point where you can lose sense of which direction elbows and knees are facing, if you don't have the textures on.

Because there is no option to export animated models with textures, the current workaround for that is to import an unanimated model with textures, then import an animated model, and either copy materials from the unanimated model to the animated one (the faster method), or set the materials on the animated model manually.

You will also most likely need to set shading settings on some body parts on the unanimated model to fix Alpha transparency issues (much like in XSI) - specifically connect the Alpha parameter of Base Color node to any parameter in Principled BSDF that will work, like Emission Strength (this should be set up differently as that's technically incorrect, but I don't know how at this moment).

Konoko upon importing to Blender Fixed transparency Copying materials Setting materials in Shading
ABR Konoko broken alpha.png
ABR Konoko fixed alpha.png
ABR Copying materials.png
ABR Konoko fixed alpha.png