Autodesk release Character Generator. Cloud based tool to easily create textured and rigged character models.

21. February 2014

 

 

Indie developers are increasingly purchasing “off the shelf’ assets to ease the workload on their game project.  The popularity of resources like the Unity Asset Store, Turbo Squid and Mixamo are certainly proof.  These resources are especially useful for the artistically challenged developers amongst us.  Now, Autodesk is throwing their hat into the ring with Character Generator.

 

AutodeskCharacterGenerator

What is Character Generator?  In their own words:

Drastically reduce the time needed to create customized, rigged and ready-to-animate 3D characters with Autodesk® Character Generator; a new, easy-to-use, web-based service. With Character Generator, users have control over a character’s body, face, clothes and hair, and can then generate their customized character for use in popular animation packages: Autodesk® Maya®, Autodesk® Maya LT™, and Autodesk® 3ds Max® software as well as in game engines like Unity.

 

 

Basically you use a number of pre made components to generate models for export to Maya, Max and Unity.  ( Why no Softimage love? )

 

So, you pick a character:

2

 

Refine the body.

3

 

Add details/accesories:

4

 

And export as an FBX or Maya file:

5

 

It is available in two forms, paid and free.  The cost seems tied to the complexity of the model you’ve created.  Free versions obviously have some limitations, as shown on this (somewhat odd) chart below.  I am assuming the lack of checkmarks on the paid side was a mistake on Autodesks part. :)

6

 

Exported models are rigged with a HumanIK rig.  Perhaps the most noticeable difference between Free and Paid is the free version is limited to low quality models.  That’s a bit of a loaded expression, as what do they mean by “quality”?  If they simply mean polygon, for many people that isn’t a huge drawback. 

 

Then again, you can try it completely free, so what have you got to lose?  I glossed over a great deal of functionality in this post, so if you are interested, you should check out the Autodesk product page.

 

A few questions still remain for me.  If you are using an Autodesk toolchain, trying this out is a no brainer.  But if you are using other tools like Blender or Modo, how well does this slot into your pipeline?  How well does a HumanIK rig work in Unity, or does it work at all?  Im going to try and get back to you.  If you’ve tried it with a non-Autodesk toolchain, how was your experience?

,




Registering for an Apple Developer ID.

20. February 2014

This is one of those things I’ve put off forever but I am finally getting to the point I have to do it.  It’s time to sign up for an iOS developer license.  Without one ( and paying 99$ a year ) you cannot deploy your code to Apple devices.  The Simulator gets you most of the way there but eventually you need to run on an actual device.

 

I am going to document the process in case it’s helpful for anyone in the future.  If this ends up being obscenely straight forward, I apologize for the dull as toast post. :)

 

Head to developer.apple.com

Click Member Center

A1

 

 

Either log in or register.  Registration is free at this point.

A2

 

Click on Programs & Add-ons

A3

 

 

Locate iOS Developer Program and select Join Today

A4

 

In an exercise in redundant redundancy, now click Enroll Now.

A5

 

Just in case you haven’t gotten sick of superfluous button clicking, now click Continue.

A6

 

… ok, this is nowhere near as streamlined as it should be.  Anyways pick if you want to use an existing developer id, or create a new one, even though I imagine 99.99% of people will use existing.

A7

 

 

Are you a business or individual?  Individual makes things a heck of a lot easier… you simply need a credit card.  Fill in the credit card details and click continue.

A10

 

Are you feeling deja-vu?  I certainly am.  Anyway, select iOS Developer Program, then Continue.

A11

 

Review the details you’ve given and select Continue.

A10

 

Select Buy Now:

A12

 

 

 

… and, log in again.  Yeah really.  Isn’t Apple the one thats supposed to be all about usability???  Granted, you are logging in to the App Store, so perhaps its a different account for you.

A13

 

… and now, you need to enter your billing information… AGAIN.  This time with credit card details.  This is getting kind of stupid, as there was a completely redundant few steps earlier it appears.  Once you’ve confirmed or entered your payment details, it’s time to pay the piper.

A14

 

The department of redundancy comes knocking again.  Apple seriously, don’t see a few opportunities for optimization in this process here?  None at all.

A15

 

… and assuming your credit is ok...

A16

 

 

… now what?

Now you wait apparently.  Unbelievably, this isn’t a completely automated process.  You simply get an email saying your order is being processed.  That’s rather anti-climactic, especially for the “I WANT IT NOW” crowd.

 

So, about 45 minutes, the following email arrives:

A17

 

… that said, don’t expect things to be all good just yet.  Log in to Member Center go to Programs and Add-ons and...

 

A18

 

Sigh, not quite there yet.  Lame.  A few hours later, still nothing.  I’ll edit in once it is actually ready to go.

 

EDIT: 4 hours after application the account is now active.  Now if you log in to developer.apple.com, you will see an option for certificates.

A19

 

You need a certificate to run on device.  The easiest way to request a certificate is directly in Xcode, but you can manually request a certificate here as well.




XNA installer released. Easily install XNA on Visual Studio 2012/2013

20. February 2014

We all know XNA is pretty much dead but it is far from useless.  One of the big problems with XNA was it was heavily tied to XNA Studio or Visual Studio 2010.  Now, a few years on and two releases of Visual Studio later, keeping a version of VS2K10 around just for XNA is getting kind of annoying for many.  There is a manual process for installing all the various required components, but as will all “manual processes”, that requires work… who likes doing work?

 

Fortunately though, for those of us that are labour adverse but want to use XNA in a more modern IDE, there is now a solution.  The XNA Enabler.

 

 

I’ve been able to apply these steps to several machines successfully, but manually copying files and running obscure commands gets old after a while.  Taking what I’ve learned from these articles, I wrote a quick utility app that performs the necessary steps to get XNA running with the click of a button.

XNA Enabler

The app scans the registry at start up, looking for any required software.  Specifically, it looks for Visual Studio 2010, 2012, 2013 and the XNA Framework, XNA Game Studio and XNA 4.0 Refresh.  If all XNA components, Visual Studio 2010 and at least one newer version of Visual Studio are found, you can click the “Enable XNA” button to simply copy the files around on your machine.  If XNA and/or Visual Studio 2010 are not present, the “Copy XNA” button unpacks the required XNA files (about 50 megs worth) onto your drive and puts them in the right places.  It also runs several individual XNA installers (framework redistributable, shared components and platform tools).  Either operation will then reset your Visual Studio extension cache and force a rebuild using the “devenv.exe /setup” command line option.

 

Very cool stuff! There is one very important comment from the post that I should draw special attention to.

 It also requires UAC privileges because the “devenv.exe /setup” command fails otherwise.

You can download the complete package here.  Warning, it’s 52MB in size as it contains the required XNA files.




Ok now, what the hell is going on here. Blender and bones are going to be the death of me

18. February 2014

So i’ve posted a lot lately about my recent experiences with working with bones exported from Blender to LibGDX.  I encountered two problems, first only the base of the bone was available once exported.  Second, bones that were external to the mesh weren’t being updated.  The first isn’t really a big deal, except the solution to it seemingly is impacted by the second problem.  There was a thread over on LibGDX forums I posted my experiences on, and Xoppa, the guy behind the 3D portions of LibGDX posted that my observations simply weren’t correct.  This post here is mostly a recap of that thread.  I am not sure if anything in this thread will be of value to any of you, but it does illustrate that sometimes… who knows, it might just be gremlins!

 

So I set about creating a minimal sample to illustrate the problem I was having.  I have literally done this a few dozen, perhaps hundred, of times the past week.

 

I created an ultra simple model in Blender, with a bone external to mesh.  In my experiences to this point, every time I try to get the position of this external bone, the results will always be 0,0,0.  All internal bones will work fine, but the external one won’t.

 

Here is the model:

11

 

Simple enough, a mesh with a simple 3 bone armature bound to it.  What you don’t see is I’ve also done a small animation sequence ( as Default Take ).

 

I then load it with the following code.  The idea is draw a sphere at the location of each bone.  Pretty much what I expected to see is two two spheres, with the third one missing ( as it will actually be at 0,0,0, the same location as the first one.

package com.gamefromscratch;

 

import com.badlogic.gdx.ApplicationListener;

import com.badlogic.gdx.Files.FileType;

import com.badlogic.gdx.Gdx;

import com.badlogic.gdx.graphics.Color;

import com.badlogic.gdx.graphics.GL10;

import com.badlogic.gdx.graphics.GL20;

import com.badlogic.gdx.graphics.PerspectiveCamera;

import com.badlogic.gdx.graphics.VertexAttributes.Usage;

import com.badlogic.gdx.graphics.g3d.Environment;

import com.badlogic.gdx.graphics.g3d.Material;

import com.badlogic.gdx.graphics.g3d.Model;

import com.badlogic.gdx.graphics.g3d.ModelBatch;

import com.badlogic.gdx.graphics.g3d.ModelInstance;

import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;

import com.badlogic.gdx.graphics.g3d.loader.G3dModelLoader;

import com.badlogic.gdx.graphics.g3d.model.Node;

import com.badlogic.gdx.utils.JsonReader;

import com.badlogic.gdx.graphics.g3d.utils.AnimationController;

import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;

import com.badlogic.gdx.math.Vector3;

 

 

public class TankDemo implements ApplicationListener {

    private PerspectiveCamera camera;

    private ModelBatch modelBatch;

    private AnimationController animationController;

    

    private Model model;

    private ModelInstance modelInstance;

 

    private Model pivot;

    private ModelInstance p1, p2, p3;

    private Node bone1,bone2,bone3;

    

    private Environment environment;

    

    @Override

    public void create() {  

    camera = new PerspectiveCamera(

   75,

                Gdx.graphics.getWidth(),

                Gdx.graphics.getHeight());

        

        camera.position.set(0f,0f,-8f);

        camera.lookAt(0f,0f,0f);

        camera.near = 0.1f; 

        camera.far = 300.0f;

 

        modelBatch = new ModelBatch();

        

        JsonReader jsonReader = new JsonReader();

        G3dModelLoader modelLoader = new G3dModelLoader(jsonReader);

        model = modelLoader.loadModel(Gdx.files.getFileHandle("data/demo.g3dj", FileType.Internal));

        modelInstance = new ModelInstance(model);

        

        animationController = new AnimationController(modelInstance);

        animationController.animate("Default Take",-1,null,0);

        

        bone1 = modelInstance.getNode("Bone");

        bone2 = modelInstance.getNode("Bone_001");

        bone3 = modelInstance.getNode("Bone_002");

        

        ModelBuilder mb = new ModelBuilder();

        

        pivot = mb.createSphere(0.5f,0.5f,0.5f,10,10,GL20.GL_LINES,new Material(ColorAttribute.createDiffuse(Color.RED)),Usage.Position | Usage.Normal);

        p1 = new ModelInstance(pivot);

        p2 = new ModelInstance(pivot);

        p3 = new ModelInstance(pivot);

        

 

        

        environment = new Environment();

        environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.8f, 0.8f, 0.8f, 1.0f));

    }

 

    @Override

    public void dispose() {

        modelBatch.dispose();

        model.dispose();

    }

 

    @Override

    public void render() {

        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        Gdx.gl.glClearColor(1, 1, 1, 1);

        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        

        animationController.update(Gdx.graphics.getDeltaTime());

        Vector3 pos = new Vector3();

        bone1.globalTransform.getTranslation(pos);

        p1.transform.set(bone1.globalTransform);

        p2.transform.set(bone2.globalTransform);

        p3.transform.set(bone3.globalTransform);

        

        camera.update();

        modelBatch.begin(camera);

        modelBatch.render(modelInstance, environment);

        modelBatch.render(p1, environment);

        modelBatch.render(p2, environment);

        modelBatch.render(p3, environment);

        

        modelBatch.end();

    }

 

    @Override

    public void resize(int width, int height) {

    }

 

    @Override

    public void pause() {

    }

 

    @Override

    public void resume() {

    }

 

}

 

Then when I run this code I see:

1

 

Or, with the line rendering the main mesh itself commented out to more clearly show the bone locations:

2

 

For #$@#$@ing #@$@#$ @#$@$’s sake...

 

Why the swearing?  Because this is working EXACTLY how it is supposed to.  EXACTLY how I expected it to a week ago.  Exactly how Xoppa said it should.

 

What it isn’t doing is behaving EXACTLY how it has been for the last 50 or so times I tried the same thing!  Literally every time I did this before, that final bone didn’t update.  No bones in the armature that were external to the mesh itself were updated.  So I thought maybe that’s it…  maybe something about this export caused the third bone to be part of the geometry… maybe that’s it!

Wtf

No such luck.  The exported g3dj file looks just like any dozen of others I have generated in the past.

 

This is unbelievably frustrating at this point, as a problem I have been trying furiously to work around simply seems to no longer exist.  At this point I simply have NO idea what I was doing in the past that caused the entire process to break.  And that doesn’t leave me with a warm fuzzy feeling.

 

Getting content out of Blender has never been the funnest process, but this last week has been an exercise in frustration… and at the end of the day, the source of the frustration seems to no longer exist.

 

There are a few differences between this example and some of my prior ones.  Generally I load two different Models from disk ( instead of building one using ModelBuilder ), so perhaps once I add another model to the mix I will start seeing the old behaviour ( although that really wouldn’t make much sense ).  Also, I am using a different computer than I normally use ( on my Mac today ), but it is the same version level of Blender and LibGDX, so that shouldn’t be a factor either.

 

At this point, I just don’t know what to say… maybe the fates simply hated me last week… that would explain the infernal cold they inflicted upon me!

Programming , ,




OpenTK 1.1 released

17. February 2014

 

OpenTK, a low level C# binding for the OpenGL, OpenAL and OpenCL has just hit a milestone 1.1 release.  It’s a project used behind the scenes by a number ofimage projects such as MonoGame.  Funny enough, they keep a low enough profile everyone always thinks they are dead!  Fortunately for .NET loving OpenGL fans, they are not.

 

 

This release brings a number of new goodies, including:

1. support for OpenGL 4.4 and OpenGL ES 3.0
2. strongly-typed enums for OpenGL ES 2.0 and 3.0
3. new, faster OpenGL bindings based on hand-optimized IL
4. a new SDL2 backend for improved platform compatibility
5. new Joystick and GamePad APIs under OpenTK.Input
6. improved startup time and reduced memory consumption
7. inline documentation for all OpenGL and OpenGL ES core functions
8. a greatly expanded math library
9. numerous bugfixes for Mac OS X, Windows 8 and Linux
10. ANGLE support for Windows systems without OpenGL drivers
11. support for Retina / high-DPI monitors
12. monolinker can now be used to reduce the size of OpenTK.dll
13. precompiled binaries for optional dependencies (OpenAL, SDL2, monolinker)

 

You can read the full release notes here and download the full package here.  OpenTK is an open source project hosted on Github here.

News ,