PDA

View Full Version : Character GUI Maker


listener
12-08-2010, 01:14 PM
Still work in progress...

Character GUI maker in 3ds max, Soon to be available free of charge.

http://www.youtube.com/watch?v=ysqz3oR4gpw

All comments and critics are welcome.

EDIT 06/02/2011: New prerelease video

http://www.youtube.com/watch?v=VCwS10xXeMY

adolfhack
12-08-2010, 02:44 PM
oh my god .. cant wait till then .... :)

PEN
12-08-2010, 03:32 PM
Looks cool, I'm working on the same thing right now. Nice implementation.

elT
12-08-2010, 03:50 PM
Awesome to hear that from you. When Dejan started working with us the first thing I gave him to read was your article on MaxScript and .NET. We are also big fans of the tutorials on your site, the Pen attribute holder and of course, the control objects. :)

PEN
12-08-2010, 05:57 PM
Glad you like them.

Light
12-08-2010, 08:17 PM
I did something similar at work last year, nobody wanted to use it. I guess not everyone appreciates good character tools (:




Light

denisT
12-08-2010, 10:11 PM
I did something similar at work last year, nobody wanted to use it.


I have the same experience...

elT
12-08-2010, 10:19 PM
Some people like it, some don't. In my experience however, the more options I give the less they whine. And the less they whine the more time there is to make other cool stuff nobody will use or not whine about not having. :)

PEN
12-08-2010, 11:25 PM
Animation tool sets are a pain, mostly because they are for animators. I have always found that animators whine the most and usually know the least. They will not wake ip early enough to make the morning meeting then complain that they didn't get asked their opinion on the new character rig. If you were to get the animation team around the table at the same time you would get a different answer from each one on what the character rig and tools should be.

I think I'm starting to sound bitter after all these years.

hbajramovic
12-09-2010, 07:10 AM
Animation tool sets are a pain, mostly because they are for animators. I have always found that animators whine the most and usually know the least. They will not wake ip early enough to make the morning meeting then complain that they didn't get asked their opinion on the new character rig. If you were to get the animation team around the table at the same time you would get a different answer from each one on what the character rig and tools should be.

I think I'm starting to sound bitter after all these years.

SOOOO TRUE !!!

darijan
12-09-2010, 07:13 AM
I cant believe that the same experience with animators i a world wide thing... :buttrock:
Paul I don't think you sound bitter...I understand you completely

LoneRobot
12-09-2010, 10:56 AM
Nice work, like the tabbed approach. It's similar to the system we are using in production at the moment -
http://forums.cgsociety.org/showthread.php?f=98&t=888071&page=1&pp=15
http://lonerobot.net/?p=840

I did something similar at work last year, nobody wanted to use it. I guess not everyone appreciates good character tools (:
dang, if they don't want to use tools written by you Light, there's no hope for us mortal TD's.

Coming from an animation background and not necessarily a technical one i've found that animation tools are like marmite for most people. There are people who couldn't care less about the extras. And there are people who can't live without them. I have an animator who can't work without tools I did years ago - they have just incorporated them into their workflow. The other thing I get is that people ask for things that have already been in the pipeline for months, or they go somewhere else and assume these things are already built into max. That's quite hard sometimes because its a case of nobody notices tools that work seamlessly, they just assume they have always been there. But as soon as there is a bug on another you get 20 people building TD efffigies, ready to burn. I think its one of those things that if something works, then you've done your job and you're not going to get any other credit than that.

elT
12-09-2010, 12:02 PM
It's always like that. When animation is so-so it's subjective. When a rig is not perfect, even if it's just skin breaking up at a random vertex and just needs to be reloaded, the TD should be burned alive. Yet when the rig is perfect(in eyes of the end user) the rig is never awesome, animation is awesome.

With time I managed to teach my self not to care and only ask for one thing, just let me do my job because I just love it even if it's just making stuff people will never use. :)

JHN
12-09-2010, 08:07 PM
I have also met a similar sentiments. For a selection tool I now simply have a small popup box that is context sensitive (do you have a hand selected or a foot) and show actions for that context: select fingers from selected hand, select limb from hand, add keyframe to limb etc. It works really well and people actually use it as it's so fast to navigate the rig with.

But yeah, animators, weird folks... Even if you have the best rig you can offer in max, they found some video on some maya or soft rig, that does a thing your rig doesn't and now they can't produce high quality work anymore... ;)

-Johan

elT
12-09-2010, 08:30 PM
I have also met a similar sentiments. For a selection tool I now simply have a small popup box that is context sensitive (do you have a hand selected or a foot) and show actions for that context: select fingers from selected hand, select limb from hand, add keyframe to limb etc. It works really well and people actually use it as it's so fast to navigate the rig with.

That sounds really cool. One of the 'features' I'm thinking of proposing to Dejan is adding context sensitive controls to the GUI like spinner for swivel on IK limbs or bendy limb joystick etc..etc.. Lots of ideas really but we just want to keep going one step at a time and there some other stuff we are trying to develop right now.



But yeah, animators, weird folks... Even if you have the best rig you can offer in max, they found some video on some maya or soft rig, that does a thing your rig doesn't and now they can't produce high quality work anymore... ;)

-Johan

Hahhahahaah! :cry:
Is there some great world wide telepathic connection between TDs or do we really have these identical experiences?

Light
12-09-2010, 09:56 PM
Sorry to derail the thread guys, but I am glad I am not alone. After all great minds think alike (:

I guess only we could appreciate a well done system and see the elegance in that. Then let's make our own kick ass 3d app (:

elT
12-09-2010, 10:34 PM
I'm all for it under one condition. If the autokey/set key equivalent is on, the app will at a random point in time pop out a technical question. If you answer correctly, you can continue working until another one pops out. Else, it will save the file and shut down. If you open the file that has been saved like this, it will ask the question again. :D

TDs will have no problem. However ... :D

Light
12-09-2010, 10:40 PM
I'm all for it under one condition. If the autokey/set key equivalent is on, the app will at a random point in time pop out a technical question. If you answer correctly, you can continue working until another one pops out. Else, it will save the file and shut down. If you open the file that has been saved like this, it will ask the question again. :D

TDs will have no problem. However ... :D

Good idea (:

elT
12-09-2010, 10:46 PM
Thanks! It's so good I might implement the prank in Max. I'm seriously considering it, maybe next time I get frustrated with half informed talk about gimbal lock, hierarchy etc... *evil laugh* :bounce:

PEN
12-09-2010, 11:00 PM
Thanks! It's so good I might implement the prank in Max. I'm seriously considering it, maybe next time I get frustrated with half informed talk about gimbal lock, hierarchy etc... *evil laugh* :bounce:

Ah yes, "the rotations are not broken in Maya" discussion.

elT
12-09-2010, 11:14 PM
Ah yes, "the rotations are not broken in Maya" discussion.

Seriously, you guys need to get out of my head. :cry:

kees
12-09-2010, 11:21 PM
animators

Suckimators.

listener
12-10-2010, 06:56 AM
I'm starting to think i dug up something evil when i initiated this thread:)

hbajramovic
12-10-2010, 07:57 AM
I love you guys :D

Kameleon
12-10-2010, 11:06 AM
We should work on a 3d app like Light said specially for animators that when you save a file it deletes all animation keys :-D Sorry couldn't resist.

Light
12-11-2010, 12:35 AM
Or have the app go only backwards in time and not forwards (then loops back to end), so they have to animate backwards.

Btw cheers to our fellow animators and TDs from Bosnia (:

JHN
12-11-2010, 05:29 AM
I don't know you guys, don't we all work in an app already that does all that from time to time?
:)

-Johan

listener
12-11-2010, 07:02 AM
:) So true Johan... Thank you Light and cheers to you too.

hbajramovic
12-11-2010, 09:45 AM
Or have the app go only backwards in time and not forwards (then loops back to end), so they have to animate backwards.

Btw cheers to our fellow animators and TDs from Bosnia (:

Cheers man !!! :beer:

p.s. Who wants a WHACK-A-MATOR game inside your favorite 3D app :)

elT
12-11-2010, 11:41 AM
Or have the app go only backwards in time and not forwards (then loops back to end), so they have to animate backwards.

Btw cheers to our fellow animators and TDs from Bosnia (:


Cheers mate! :beer:

eek
12-11-2010, 05:26 PM
We should work on a 3d app like Light said specially for animators that when you save a file it deletes all animation keys :-D Sorry couldn't resist.



Where there's a will, callbacks have a way :)

listener
02-04-2011, 01:07 PM
Here is UIBuilder prerelease preview any and all comments are more than welcome.....

http://www.youtube.com/watch?v=VCwS10xXeMY

shalabology
02-04-2011, 03:31 PM
marvellious, sorry if i didnt dig deep into the thread ,i guess its not maxscript thing ,anyway ,i liked it mostly the second prerelease video

elT
02-04-2011, 09:51 PM
Hah! Awesome! I wasn't at work today and I just got to see this... awesome! Though I've seen it before...It's great to see how much it's improved since the last video. :bounce:

Kickflipkid687
02-05-2011, 02:09 AM
Dang! That's awesome!

How did you do the screencap process? I wanted to do that exact thing, drag a freeform box and have it save an image. Is that via Dotnet, or would I have to do that in C#,C++ or VB?

I would very much appreciate a code snippet/reference if you wouldn't mind :D No issue if you can't.

Keep it up!

elT
02-05-2011, 02:13 AM
It's C#. But you'll have to wait for Dejan for a complete and detailed response. :)

Kickflipkid687
02-05-2011, 02:43 AM
Ah.... hmmmm.. I use a little install now called Lightshot for screengrabs, but I still would like to learn about how he did that :D

denisT
02-05-2011, 02:44 AM
It's C#.

it's exactly what i'm talking about. i don't want any kinda programming language been integrated in MAX. Give me full C# and it makes me happy.

elT
02-05-2011, 02:49 AM
it's exactly what i'm talking about. i don't want any kinda programming language been integrated in MAX. Give me full C# and it makes me happy.

I just can't wait for Blur to re-upload their Python plug in. :bounce: Python is awesome!

Haven't done any C# my self but I want to start learning quite soon. Dejan working his magic with it really got me pumped up for it.

denisT
02-05-2011, 03:02 AM
I just can't wait for Blur to re-upload their Python plug in. :bounce: Python is awesome!

python is very sloooooow! i'm doing the python in Maya, and in Motion builder. because there is no any other chance. but i will kill myself seeing the python in MAX.

Kickflipkid687
02-05-2011, 03:08 AM
http://area.autodesk.com/blogs/chris/the_maxsharp_project_python_and_c_from_3ds_max_2011x.

elT
02-05-2011, 07:04 AM
python is very sloooooow! i'm doing the python in Maya, and in Motion builder. because there is no any other chance. but i will kill myself seeing the python in MAX.

I won't pretend I've done anything too complex with it but, in my experience Python in maya is terribly implemented. It's just MEL with "pythonic" syntax. But honestly, I didn't do much, few scripts as part of Renderman 101 course at td-college.com, where the goal was to write a translator from Maya to .rib. It was fun but I hate Maya with a passion ever since. And in that regard, I didn't notice any speed issues but again, I don't think those were terribly computation intensive tools.

elT
02-05-2011, 07:06 AM
http://area.autodesk.com/blogs/chris/the_maxsharp_project_python_and_c_from_3ds_max_2011x.

Yeah, MaxSharp sounds exciting. Very.

listener
02-05-2011, 10:53 AM
Dang! That's awesome!

How did you do the screencap process? I wanted to do that exact thing, drag a freeform box and have it save an image. Is that via Dotnet, or would I have to do that in C#,C++ or VB?

I would very much appreciate a code snippet/reference if you wouldn't mind :D No issue if you can't.

Keep it up!

Thank you :)

The whole app is C# it uses just a few maxscript lines... as for the screencap no prob...
Basically the easiest way to do it is to grab a whole screen, put it in PictureBox thats docked inside a borderless form that's same size as the screen then you can use box selection to grab any part of it.

You can also do it by using COM interop but there is probably no need to complicate things because this way works great.

This is how you do it....

So like i said you make a form that's borderless and dock a picturebox in it so it fills the window..

next u do...


Size res = SystemInformation.PrimaryMonitorSize;
this.Size = res;
pictureBox1.Size = res;
pictureBox1.Location = new Point(0, 0);

Bitmap screenshot;
Rectangle region = Screen.AllScreens[0].Bounds;
screenshot = new Bitmap(res.Width, res.Height, PixelFormat.Format32bppArgb);
Graphics screenGraphics = Graphics.FromImage(screenshot);
screenGraphics.CopyFromScreen(region.Left, region.Top, 0, 0, region.Size);
Image img = (Image)screenshot;
pictureBox1.BackgroundImage = img;


You can put this in the constructor under InitializeComponent();
This gets your primary monitor size in case you have two or more monitors you can set it up so it maybe asks you what monitor image you want to grab then sets up picture box to be the size of monitor and positions it at 0,0. After that you declare bitmap and set it the size of first monitor and just grab the screenshot and convert it to Image that you set as background image of pictureBox...

So this gives you picture of your desktop in a picturebox with the size of your monitor so basically it looks all the same and you can now draw a selection box to grab your region. That is done by using mouse down, mouse move and mouse up event args for the PictureBox.

Mouse down event arg:

if (e.Button == MouseButtons.Left)
{
selecting = true;
selection = new Rectangle(new Point(e.X, e.Y), new Size());
selectionStartPoint = new Point(e.X, e.Y);
}


So when you click your mouse down we set selecting var to true to indicate that selection is taking place, initialize new rectangle selection and take starting point in selectionStartPoint

Mouse move event arg:


if (selecting)
{
if (selectionStartPoint.X < e.X)
{
selection.X = selectionStartPoint.X;
selection.Width = e.X - selectionStartPoint.X;
}
else
{
selection.X = e.X;
selection.Width = selectionStartPoint.X - e.X;
}
if (selectionStartPoint.Y < e.Y)
{
selection.Y = selectionStartPoint.Y;
selection.Height = e.Y - selectionStartPoint.Y;
}
else
{
selection.Y = e.Y;
selection.Height = selectionStartPoint.Y - e.Y;
}

pictureBox1.Refresh();
}


In mouse move event we say if selecting is active set the width and height of the rectangle depending of the mouse movement and call refresh for pictureBox so the Paint method gets called and we can actually draw our rectangle.

So the paint event should look like this:


if (selecting)
{
Pen pen = new Pen(Color.Green, 2);
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
e.Graphics.DrawRectangle(pen, selection);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, 66, 159, 255)), selection);
}


Here we again check if selection is in progress by querying status of selecting var then we do the actual drawing, in order to look nicer i actually draw two rectangles one filled and slightly transparent and the other with just dashed outline so you get nice selection box.

So we click, move mouse and draw rectangle... now we need to save our region and that happens with mouse up event


if (e.Button == MouseButtons.Left)
{
selecting = false;
pictureBox1.Refresh();
GetImage();
}
Here we check is the mouse up left mouse button then set selecting to false to indicate that selection process has finished, do the refresh of pictureBox so it redraws this time without rectangle because selecting var is now false and call GetImage() method that saves our image:


Bitmap screenshot = new Bitmap(pictureBox1.BackgroundImage);
Bitmap croped = screenshot.Clone(selection, screenshot.PixelFormat);
Image img = (Image)croped;
pictureBox1.BackgroundImage = img;

if (File.Exists(@"tmp.jpg"))
{
File.Delete(@"tmp.jpg");
}
img.Save(@"tmp.jpg");
img.Dispose();
screenshot.Dispose();
croped.Dispose();
this.Close();


This last method is kinda adapted to my needs it creates new bitmap using as size our selection rectangle and then converts all that into Image type with this line: Image img = (Image)croped; you can then do whatever you like with it... i save it as temp file that later gets handled further in the application.

That is it... i hope it helps:)

Kickflipkid687
02-05-2011, 06:54 PM
Wow, awesome man! I'm working through it right now though and found an issue, but I figured it out.

In the line

screenshot = new Bitmap(res.Width, res.Height, PixelFormat.Format32bppArgb);

I had to do instead,

screenshot = new Bitmap(res.Width, res.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

I will keep going. But I got it taking a screenshot now at my dekstop res :D

Kickflipkid687
02-05-2011, 07:17 PM
I think you may have forgot a part for the selecting bit? I'm trying to figure out where/how to setup the mouse events. Maybe I'm wrong..

listener
02-05-2011, 07:40 PM
If you add on top


System.Drawing.Imaging;

You wont have to type all that and you will get access to enum PixelFormat

As for the mouse events i just figured you did C# before so i did not want to bother u with details.
for mouse event args you can add in your class constructor, under the InitializeComponent();


pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
pictureBox1.MouseUp += new MouseEventHandler(pictureBox1_MouseUp);
pictureBox1.MouseMove += new MouseEventHandler(pictureBox1_MouseMove);

Then you just declare your eventargs, for mouse move you would do:

void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{

}

And so on....
Hope this gets you back on right track.

Kickflipkid687
02-05-2011, 08:24 PM
Ah ok, thanks alot man. I've done a little C#, but am quite new to it, sorry :P. I understand now. I will keep messing with it :D

CGTalk Moderation
02-05-2011, 08:24 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.