# Rotate A Quad Along Axis To Face Camera

This topic is 2146 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I am having some success aligning a particle to a direction and then rotating it along its axis. At the moment I am just constantly rotating it. How do I calculate the correct rotation so it always faces the camera?

Please have a look at this video:

I am using DPSF. I have modified the "FlyingSparks" demo.

To calculate the orientation Quaternion I run this code:

private void UpdateOrientation(DefaultTextureQuadTextureCoordinatesParticle cparticle, float felapsedtimeinseconds)
{
var normalized = cparticle.Velocity;
normalized.Normalize();
cparticle.Orientation = Quaternion.Identity;
cparticle.Right = -normalized;
_rotation += 0.03f;
cparticle.Orientation = Quaternion.CreateFromAxisAngle(normalized, _rotation) * cparticle.Orientation;
}

After some trial and error the above code produces what you see in the video.

Line 5: resets the orientation.
Line 6: aligns the quad to the velocity direction.
Line 7: increments the rotation.
Line 8: further rotates the quad along its axis by the rotation.

What I am asking is how do I calculate the rotation?

I am not a maths expert. I can guess that I need the normal of the particle, calculated within line 6 and then use that to determine it's difference from the camera direction. I have looked at some billboarding techniques but they don't offer exactly what I want.

I am very close to finishing my game and this is the last hurdle, any help or pointers would be greatly appreciated, thank you for taking the time to look at this

##### Share on other sites

Basically, stop rotating it! :)

Get the transform matrix of your camera:

X = [ a b c 0 ]

Y = [ d e f 0 ]

Z = [ g h i 0 ]

The camera *looks* down Z, and the X/Y axes are left/right and up/down respectively. Given the width & height of your quad, you can compute the points directly:

P0 =  X * (width/2) + Y * (height/2)

P1 = -X * (width/2) + Y * (height/2)

P2 = -X * (width/2) - Y * (height/2)

P3 =  X * (width/2) - Y * (height/2)

##### Share on other sites

Thanks Rob.

I found a solution within the library, after learning some basic math.

 Orientation3D.SetUpDirection(ref cparticle.Orientation, Vector3.Cross(cparticle.Velocity, CameraPosition - cparticle.Position));


I'll try to see if I can use your method to edit the vertices directly, but it looks a little like the function it calls is doing as you suggest anyway.

        public static Quaternion GetRotationTo(Vector3 CurrentDirection, Vector3 DesiredDirection, Vector3 sFallbackAxis)
{
Quaternion quaternion = new Quaternion();
Vector3 vector = CurrentDirection;
Vector3 vector2 = DesiredDirection;
vector.Normalize();
vector2.Normalize();
float num = Vector3.Dot(vector, vector2);
if (num >= 1f)
{
return Quaternion.Identity;
}
if (num <= -0.999999f)
{
if (sFallbackAxis != Vector3.Zero)
{
sFallbackAxis.Normalize();
return Quaternion.CreateFromAxisAngle(sFallbackAxis, 3.141593f);
}
Vector3 axis = Vector3.Cross(Vector3.UnitX, vector);
if (axis.LengthSquared() < 0.999998f)
{
axis = Vector3.Cross(Vector3.UnitY, vector);
}
axis.Normalize();
return Quaternion.CreateFromAxisAngle(axis, 3.141593f);
}
Vector3 vector4 = Vector3.Cross(vector, vector2);
double num2 = Math.Sqrt((double) ((1f + num) * 2f));
double num3 = 1.0 / num2;
quaternion.X = (float) (vector4.X * num3);
quaternion.Y = (float) (vector4.Y * num3);
quaternion.Z = (float) (vector4.Z * num3);
quaternion.W = (float) (num2 * 0.5);
quaternion.Normalize();
return quaternion;
}


##### Share on other sites

Your method seems way simpler :)

1. 1
2. 2
Rutin
20
3. 3
khawk
17
4. 4
A4L
14
5. 5

• 12
• 16
• 26
• 10
• 11
• ### Forum Statistics

• Total Topics
633756
• Total Posts
3013710
×