TWild

Ok, I figured it out...

(used CreateBillboard instead of CreateConstrainedBillboard)

First, I created a billboard matrix manually:

Matrix lookAt = entity.World;

lookAt.Forward = Vector3.Normalize(camera.Position - entity.Position);

lookAt.Right = Vector3.Normalize(Vector3.Cross(new Vector3(0.0f, 1.0f, 0.0f), lookAt.Forward));

lookAt.Up = Vector3.Cross(lookAt.Forward, lookAt.Right);

Which, after starting the program, had the following values:

lookAt:

+ Forward {X:0.7715393 Y:-0.6361816 Z:0 }

+ Up {X:0.6361815 Y:0.7715393 Z:0 }

+ Right {X:0 Y:0 Z:**-0.9999999**}

+ Translation {X:-57 Y:57 Z:0 }

Then, I created a matrix using the Matrix.CreateBillboard method:

Matrix billboard = Matrix.CreateBillboard(entity.Position, camera.Position, camera.Up, camera.Forward);

Which, after starting the program had the following values:

+ Forward {X:0.7715393 Y:-0.6361816 Z:0 }

+ Up {X:0.6361815 Y:0.7715393 Z:0 }

+ Right {X:0 Y:0 Z:**0.9999999**}

+ Translation {X:-57 Y:57 Z:0 }

Notice that lookAt's Right property (which displays properly) has a **- **value, whereas, billboard's does not.

So, I simply negated it

billboard.Right = -billboard.Right;

And then setting the shader parameter:

m_Effect.Parameters["gWVP"].SetValue(billboard * camera.View * camera.Projection);

So, I'm not sure if this is a bug in Matrix.CreateBillboard or I'm just not using it correctly.