21/11/2017

I will no longer update this blog...

I decided to stop updating this blog, as even with automation I see no real point in it, at least for now,
Since my new website is launched, and it has it's own blog, rss and twitter-updates about each new post I make there.

New website can be found under these two domains:

https://nixes.ru/

https://michaeldavydov.com/


So, please, if you were reading this blog, or if you stumbled upon it just now, use one of the links above to redirect yourself to a new blog and website.

Cheers.

18/01/2017

BroTools Snippets #03 – Mirror FFD Box

Another small script that can be of any help for others. It mirrors FFD box shape from one FFD to another. Useful for, for example, cartony eye rigs. I think anyone who knows a little python in maya should be able to write this one, but for those who just start with Python in Maya or those who are just lazy, here it is.

Tried to comment the hell out of it.

'''
Mirror ffd deformer shape. Useful for cartoon eyes.
by Michael Davydov

Currently only works with mirroring across X axis.

Usage:
    1. Copy your ffdLattice and ffdBase objects. Change TranslateX to the opposite value. 
    This means that you basically need to multiply current TranslateX by (-1). 
    Basically just add a minus sign if it's positive value, and remove it if it's negative value.
    
    2. Change names in the script below, FROM and TO.
    3. Run the script.
'''

import maya.cmds as cmds # As usual, import maya's python bindings
import time # This is Python's time module, just for fun

FROM = "ffd_eye_R_Lattice" # Change this to the FFD object name you need to mirror FROM
TO = "ffd2Lattice" # Change this to the FFD object name you need to mirror TO


# Now, let's get number of S, T and U divisions from the "FROM" lattice.
# I'm going to use dictionary here, to save some space and time.
divisions = {}
for ax in ['s','t','u']:
    divisions[ax+"Divisions"] = cmds.getAttr(FROM+".{0}Divisions".format(ax))


# Make sure that target have the same number. Here we have two options,
# we can either force change number of divisions for user, or we can
# warn him. I'll do both. Why not?

# For each division check if there is the same number.
matching = True
confirm = None
for division, value in divisions.iteritems():
    if cmds.getAttr(TO+"."+division) != value:
        matching = False
        
if not matching:
    # Call the confirm dialog, thank you maya for built-in command.
    confirm = cmds.confirmDialog( title='Confirm', message='Number of divisions do not match. Script will only work with matching FFD divisions. Change division number or target ffd to match the source?', button=['Yes','No'], defaultButton='Yes', cancelButton='No', dismissString='No' )

if confirm=="Yes" or matching:
    for division, value in divisions.iteritems():
        cmds.setAttr(TO+"."+division, value)

    # Iterate over all points
    for S in range (0,3):
        for T in range (0,3):
            for U in range (0,3):
                print "//", i,o,p
                # Get position of a point
                pos = cmds.xform('{0}.pt[{1}][{2}][{3}]'.format(FROM, S,T,U), q=1, ws=1, t=1)
                pos[0] = pos[0]*(-1) # Reverse x position value
                cmds.xform('{0}.pt[{1}][{2}][{3}]'.format(TO, 2-S,T,U), ws=1, t=pos) # Paste position to another object's opposite point
                # Make progress visible.
                cmds.refresh() # Refresh the viewport to see what's going on
                time.sleep(0.03) # Wait for a few milliseconds, otherwise the script would work instantly. Remove these two lines for production use.
                
else:
    print "// User canceled"

BroTools_MirrorFFD



Copied from my site's blog: http://ift.tt/2iIXBY5

17/01/2017

Non-3D Python exercise: Instaload

Well, this is not related to 3D or CG, but it’s Python!

Was bored one day, and had to download a couple of images from instagram. dinsta.com is great, but it only allows you download images, and only one by one. So, I spent a few hours writing a little web-app to download multiple images and even videos from instagram. So, here it is:

http://ift.tt/2j2DSDz

Using it is simple. Just open required instagram photos or images on your pc, copy and paste links into the app, each link on a separate line, and click download button. You should then see download progress, and in the end you’ll get a download link for your zip archive with downloaded files. It will be there for an hour. Heroku has a limit of 300MB of disk space, so this app is not ready for heavy production use because of that limitation, if it somehow becomes popular, I’ll have to move it somewhere else, or change the logic to, for example, use some file sharing service to upload files instead…

Just deployed it on heroku, and I’ll be honest – deployment was the hardest part! I already had a lot of experience with Python, Flask and socketio programming, while writing my own personal home assistant. But my little AI friend is running on my local network, and I had no need to even try to run it on production server, flask’s built in test server works perfectly fine for this.

But with heroku I had to switch to gunicorn, and here comes the fun part – you have to use gunicorn 18.0, not 19.x, as, in fact, stated in the docs: http://ift.tt/2jZ7iXq but it’s easy to miss.

 



Copied from my site's blog: http://ift.tt/2j2BGvE

02/12/2016

BroTools Snippets #03 – PySide context menu for QLineEdit and other elements…

Well, some time ago I decided to go with PySide code for all my UIs instead of native maya.cmds functions for menu-building. I was attracted to the freedom in creating and styling of those menus, and the fact that Jeremy Ernst did a lot of menus with PySide. And another fact that knowing PySide I can not only write UIs for maya, but also for different standalone python tools. Which is cool. But if you just need a menu – go with cmds. Don’t bother with PySide.

Anyway, with that said, I still prefer to use PySide. And recently I was banging my head against the wall, trying to add a simple context menu to QLineEdit. To allow pasting some preset text into QLineEdit, for BroSelector tool.

And Finally, it worked!

Here is the full code related to it. I skip imports and window creation. Just the relevant stuff.

 

#Creating the actual QLineEdit. I use from QtGui import *, so I don't need to write QtGui.QLineEdit, just QLineEdit, mind that.
self.type = QLineEdit("transform")
# Adding context menu to line edit
# Creating action. Make as many as you like
self.actionHello = QAction(self)
self.actionHello.setText("Hello")
self.actionHello.triggered.connect(yourFunctionHere)

# Creating Menu
self.menu = QMenu(self)
# Adding action to menu. Add as many as you like
self.menu.addAction(self.actionHello)

# First we need to change our element's Context Menu Policy to Custom.
self.type.setContextMenuPolicy(Qt.CustomContextMenu)

# Now we catch basically the right-click event, the customContextMenuRequested event, and assing our own handler (function) for it.
self.type.customContextMenuRequested.connect(self.contextMenuRequested)

#And here goes the handler function.
def contextMenuRequested(self, point):
    # the point variable (which you can call whatever you like actually) is passed to this function as first arg, so we can use it in the next line.
    self.menu.exec_(self.type.mapToGlobal(point))

And thats it. YAY! Saving it here, so I won’t lose it, and in case it is useful to someone.



Copied from my site's blog: http://nixes.ru/?p=657

01/12/2016

BroTools Snippets #02

Saving another couple of clicks in routine work, simple script to select joints influencing skinned mesh. Could not find a 1-click solution for this in Maya. Maybe I just missed something? Anyway, maybe this will be useful for someone. Will just leave it here.

It will select joints influencing all shapes of all selected objects.

In a form that can be used in a shelf:

import maya.cmds as cmds
def selectInfluenceJoints (meshes=None):
    if meshes == None:
        meshes = cmds.ls(sl=1)
    if not isinstance(meshes, list):
        meshes = [meshes]
    cmds.select (cl=True)

    for mesh in meshes:
        shapes = cmds.listRelatives(mesh, c=True, s=True)
        for shape in shapes:
            sk = cmds.listConnections(shape, et=True, t='skinCluster')
            if sk != None:
                for s in sk:
                    influences = cmds.skinCluster (s, q=True, inf=True)
                    cmds.select (influences, add=True)
selectInfluenceJoints()


Copied from my site's blog: http://nixes.ru/?p=639

30/11/2016

BroTools Snippets #01

Time to start sharing what little tools and scripts I use in everyday life.

Here’s a multi-exporter I wrote for current project to speed up and stream-line animation exporting process, nothing fancy. It is used to export multiple animated game characters and objects. Responsive object selection list is probably the most fun thing, which inspired me to write another tool, which I will show in the next post.

brotools_multiexporter


Copied from my site's blog: http://nixes.ru/?p=628

11/10/2016

Random animation #01

 

 

Starting some new ‘sections’ of my blog. Under Random animation I will just post some little practice or personal or non-NDA animations I’m working on.



Copied from my site's blog: http://nixes.ru/?p=594

01/09/2016

Maya 2017 switching to PySide2

In order to support Qt 5 Maya 2017 now uses the PySide2 module and shiboken2. While this is supposed to bring a lot of improvements into Maya’s UI, including speed and new functions, it also breaks a lot of old scripts. Including my BroDynamics and other tools. I though about using Qt.py, but that would require me to include it with all my scripts, and really it was too complex for a lot of my tools, especially those shipped as one file.

At first I was a bit terrified, thinking that I’ll have to re-write a lot of code. But in fact I was able to adapt all of my scripts in few minutes.

So, the biggest changes in PySide2 are:
– Some widgets moved from QtGui to QtWidgets
– shiboken is also changed to shiboken2

Before the change I was using PySide like this:

from PySide import QtCore, QtGui
    someWidget = QtGui.QWidget()

The biggest change is to switch to another method of importing PySide:

from PySide.QtCore import *
from PySide.QtGui import *

This way you import all modules directly, and instead of writing QtGui.QWidget you can just use QWidget. Obvious but very handy in this case.

Without any further speculation, here is my final PySide import code.

try:
    from PySide2.QtGui import *
    from PySide2.QtCore import *
    from PySide2.QtWidgets import *
    from shiboken2 import wrapInstance
    print "Using PySide2"
except:
    from PySide.QtGui import *
    from PySide.QtCore import *
    from shiboken import wrapInstance
    print "Using PySide"

And then using simple Replace, available in any text editor, change all “QtGui.” and “QtCore.” to “”. Just remove them.

I will test BroDynamics and other scripts for some time, before making new versions available to the public. Stay tuned :)

Here are a few links you may find useful as well:

Maya Help – PyQt and PySide Widget Best Practices
http://ift.tt/2bLiajj
http://ift.tt/2bGkNFN
http://ift.tt/2bLiajx



Copied from my site's blog: http://nixes.ru/?p=587

20/06/2016

BroDynamics 1.4.0 Released!

Phew, it took me a while to get it all together. It was huge update. Last few days was I was fighting with bugs mostly, which started to appear seemingly out of nowhere.

There are three main updates in this release.
– Added 2 more simulation modes: Points and RBD
– UI Improved

Since there are these huge updates, there may be new bugs in this release, which I did not have a chance to catch yet. Feel free to report any problems you enouncter, and I will try to fix it ASAP.

Along with this release I made new promo video, and started making a series of How To videos.

New Promo

 

 

How To series

 

 

 

 

 

 

I think later I will sit back and write a nice post about some behind-the-scenes… Or not… We’ll see 😀

Changes:
1.4.0
– A lot of bug fixes and improvements overall.
– Compatibility fix! Now works with Maya 2014 too. Probably with 2013 as well.
– UI reworked, now windows delete properly when you close the main BroDynamics window, docked or undocked. Memory leak here and performance impact after closing and openning it often should be fixed now.
– Icons everywhere! 😀
– NEW! Added single object simulation based on nParticles.
– NEW! Rigid Body and Ragdoll simulation module.
– Added SnapRuntime plugin for object matching for RBD mostly. Thank you, Red9.
– Fixed Get button in Batch Window
– Batch window’s list will now properly update when you hit Undo. Now no need to worry about making mistakes there at all.



Copied from my site's blog: http://nixes.ru/?p=568

16/06/2016

BroDynamics Update Sneak Peak

 

 

Working on an update.



Copied from my site's blog: http://nixes.ru/?p=565

05/06/2016

Unity fun

A few weeks ago I was trying out some concepts in Unity, to practice C# and learn some new things. I think it’s time to show some of it here.

Everything in this prototype was done by me, including awesome capsule models for enemies and animations for player character.

Collision-based damage, imploding\exploding grenades, turret spawning, shooting, gravity gun and in later tests even multiplayer support.



Copied from my site's blog: http://nixes.ru/?p=559

04/06/2016

Control Mesh Creator and Auto IK FK Switcher are out!

 

 

Auto IK FK Switcher works with any rig using a regular 3-chain IK-FK setup. It works with meta-connections (fancy name for connecting nodes using ‘message’ connections and finding them later through these connections), which allows it to be context-sensitive. The UI has just a few buttons, and it knows which IK-FK body part you selected, and will perform a switch for selected body-part. You can also freely rename controls and objects, it will still work.

It also has an automatic mode, which will switch IK to FK if you select FK and vice-versa.

Control Mesh Creator replaces control curves with mesh-based controls. They follow the original mesh, and are invisible to the animator, who can simply click on the part of the mesh to select a control. Similar to Pixar’s Presto software approach.



Copied from my site's blog: http://nixes.ru/?p=551

19/05/2016

Site update

Phew, CSS3 is not nearly as hard as I thought some time ago. Updated this site’s design a bit, added some neat hover features, and made the “TOOLS” page where you can take a look at a few of my main tools I made and am using in my work. Some of them are available for purchase, some will be later, some may be free, so keep an eye on that page :)



Copied from my site's blog: http://nixes.ru/?p=489

18/05/2016

BroRig Update 03 – Shape replacer

 

 

And here come Pixar Presto’s style controls! A tool which allows me to quickly replace NURBS curves with controls following mesh. Very intuitive for animators. Thanks to Jason Schleifer for showing how this is done in Maya.



Copied from my site's blog: http://nixes.ru/?p=443

17/05/2016

BroRig Update 02 – Mostly works

Well, it mostly works, and already created a script to replace controls with selectable mesh controls, details in the video.
Will create mini-ui for it, probably, and move onto creation of automatic ik-fk switching stuff… Or fix the rig itself. Or, maybe, put it away for a while, and rig something with advanced skeleton and animate it… Hm, not sure which will be next yet. We’ll see.

 



Copied from my site's blog: http://nixes.ru/?p=431

15/05/2016

BroRig Update 01 – Basic Stretchy IK-FK Done

Hooraaay, Basic stretchy IK-FK is done. Can now quickly rig arms and legs, without feet yet. Scales correctly with the rig, thanks to Zeth Willie’s tutorial. Basically it will correctly scale under any circumstances, even if the character is parented to something else and that other object is scaled. Will try to make everything else scaling the same way.

In the video the character breaks when i’m scaling it just because nothing but legs and arms is rigged. But arms and legs scale correctly. Once I rig spine and head it will work just fine.

Currently it automatically finds 2nd and 3rd joints… But as I think of it now, it was not a good idea. If there are, say, twist joints in that hierarchy, the script wont work. But it’s no biggie, will fix this some other time.

Yeah, also forgot to add, I will, of course, add a nice pretty PySide UI to this!



Copied from my site's blog: http://nixes.ru/?p=427

BroRig Update 00

So, I decided to write my own little auto rigging tool for myself.

 

I’m not sure why I even do this, lets say for usual things:

  • Fun
  • Practice
  • Better understanding of rigging

Yeah, this sounds about right to me.

Goal is: Create my own rigging tool, aimed primarily at joint-based rigs for game dev and cinematics, but extencible enough to be adapted to anything else, with main focus on making rigs produced by it as animation-friendly as possible. Should also be possible to rebuild rigs, hopefully will be able to automate and create presets for characters. It should operate based on the existing skeleton.

I also have a few particular fun ideas and techniques I’d like to implement and use while animating. And for that I will also create tools, which include:

  • Replacing curve controls with invisible mesh controls, overlaying the original mesh. So there are no visual controls, and animator\me can click directly on mesh to select animatable part, Pixar’s Presto-style.
  • The whole tool should work around the existing skeleton, allowing me to take any model with a skeleton and rig it in a matter of a few hours or even minutes.
  • Automatic IK-FK switching, happening at the moment animator selects FK or IK control. Probably through scriptJobs. Since there are no visual nurbs controls to distract an animator, there is no need to hide those when switching too.
  • Fully scalable rig. Since it is mostly meant for gamedev and purely joint based, there won’t be any complex things, so it should be easier to make it fully scalable.

But I still wonder, why not just use AdvancedSkeleton?  Hmm.. Well, I think I’ll still use it for any commercial work, while polishing and testing my rigging tools in my personal practice works. And since I’m trying to write scripts with modular aka OOP approach in mind, I’ll try to make as much of it complatible with AS and other auto-riggers as possible.

So, steps are, not in order:

  • Create functions to work with basic rig hierarchy
  • Create IK-FK rigger, stretchy\squashy. Arms
  • Use IK-FK rigger as a base and adapt it to rig legs
  • Spine, FK, IK, Stretch and squash. Basic for now, don’t want to go too crazy with ribbons and 100500-degree twisting… With modular approach it can be added later, if needed.
  • Simple FK rigger, to rig just FK joints, like fingers, tails, etc.
  • Thanks to my BroDynamics tool, i don’t need to actually build any dynamics into rigs! Yay!
  • Create a tool, which will allow to easily replace any FK curve control with a mesh, and set it up using this or better this technique. Thanks, Jason for showing how to do it. Make it compatible with AdvancedSkeleton.
  • Create a tool, which will allow to quickly add all required scriptJobs for IK-FK switching. Make it compatible with AdvancedSkeleton.

Okay, wish me luck, and here is the first working thing, basic IK-FK setup. In next update will add stretching and pole vector, and wrist rotation to IK control.

 

 



Copied from my site's blog: http://nixes.ru/?p=418

08/05/2016

ShowReel 2016 – Animation and Rigging

New showreel is out!



Copied from my site's blog: http://nixes.ru/?p=413

BroDynamics update 1.1.0

Just a minor heads-up, BroDynamics updated to 1.1.0. Now features collision objects, as well as a few minor fixes.

Also now available on creativecrash.
http://ift.tt/273ADQk



Copied from my site's blog: http://nixes.ru/?p=410

26/04/2016

Celestials

Two videos are now officially available, featuring my work as Lead Animator.
Motion capture on set supervision, mocap data processing, retargeting, polishing, exporing. Some rigging and pipelnie tool development as well.



Copied from my site's blog: http://nixes.ru/?p=393