Here's a simple question:

suppose I have a 3d mesh stored in an xfile, and i wish to

rotate the mesh so that a given face is pointing "up" towards world y+

To make it simpler lets assume the mesh is a ball constructed of triangles.

How can we use the triangle definition to calculate a rotation matrix that would

rotate the ball around to bring that triangle to the top?

Or to the Front?

Or the Side?

Or to suit the Camera?

We can calculate the Plane from the Triangle's vertex data.

Do we calculate the planar normal and then somehow use that to rotate the mesh?

suppose I have a 3d mesh stored in an xfile, and i wish to

rotate the mesh so that a given face is pointing "up" towards world y+

To make it simpler lets assume the mesh is a ball constructed of triangles.

How can we use the triangle definition to calculate a rotation matrix that would

rotate the ball around to bring that triangle to the top?

Or to the Front?

Or the Side?

Or to suit the Camera?

We can calculate the Plane from the Triangle's vertex data.

Do we calculate the planar normal and then somehow use that to rotate the mesh?

nice but heavy ..

there must be a simpler way to calculate a rotation matrix that brings one plane into another.

That must be it..

we calculate the plane of the triangle,

then calculate that plane's current rotation matrix,

then invert that matrix ... am i right?

Someone who listened in math got a simple explanation?

there must be a simpler way to calculate a rotation matrix that brings one plane into another.

That must be it..

we calculate the plane of the triangle,

then calculate that plane's current rotation matrix,

then invert that matrix ... am i right?

Someone who listened in math got a simple explanation?

EvilHomer2k...this is what i remember from Math class:

So you want to rotate a triangle in space using a matrix.

First imagine a cube with one face directly towards you. Inside that face draw a triangle with the two vertices of the base being the lower left and right corners. The peak of the triangle is the mid-point of the top of the face.

Call the lower left vertix pt1, lower right pt2, peak pt3

The matrix for the triangle in x,y,z coordinates is:

pt1 = [0,0,0]

pt2 = [1,0,0]

pt3 = [.5,1,0]

Now what if you wanted to rotate the triangle so that it was on the top face. Its coordinates in that case would be:

pt1 = [0,1,0]

pt2 = [1,1,0]

pt3 = [.5,1,1]

Notice that the only difference is that some of the 0s are now 1s but the original values in the first matrix are still there. This is because the triangle only rotated 90 degrees.

So how do you show the triangle smoothly move from one position to another? Just make those values that change go slower. In other word increment those values that changed from 0 to 1 in small increments. (e.g. (.1),(.2),(.3),(.4)....(1)) but increase each one uniformly (unless you want a stretch effect)

Its just a matter of inrementing or decrementing variables.

All other coordinates of your ball can be relative to the one triangle.

Not sure if this will help you but i thought i would take a shot.

:alright:

So you want to rotate a triangle in space using a matrix.

First imagine a cube with one face directly towards you. Inside that face draw a triangle with the two vertices of the base being the lower left and right corners. The peak of the triangle is the mid-point of the top of the face.

```
___________
```

/\

/ \

/ \

__________

You get the picture.
Call the lower left vertix pt1, lower right pt2, peak pt3

The matrix for the triangle in x,y,z coordinates is:

pt1 = [0,0,0]

pt2 = [1,0,0]

pt3 = [.5,1,0]

Now what if you wanted to rotate the triangle so that it was on the top face. Its coordinates in that case would be:

pt1 = [0,1,0]

pt2 = [1,1,0]

pt3 = [.5,1,1]

Notice that the only difference is that some of the 0s are now 1s but the original values in the first matrix are still there. This is because the triangle only rotated 90 degrees.

So how do you show the triangle smoothly move from one position to another? Just make those values that change go slower. In other word increment those values that changed from 0 to 1 in small increments. (e.g. (.1),(.2),(.3),(.4)....(1)) but increase each one uniformly (unless you want a stretch effect)

Its just a matter of inrementing or decrementing variables.

All other coordinates of your ball can be relative to the one triangle.

Not sure if this will help you but i thought i would take a shot.

:alright:

I think you just get the normal, convert that to a metirx then as you say, invert and multiply everything by it. I think... :)

Afternoon, E?in.

Using the normals would only work if, when averaged together, they are identical to the faces' normal.

Instead of averaging the normals of each vertice on the face, maybe it'd be better to just avarage the position vertices themselves?

Cheers,

Scronty

Using the normals would only work if, when averaged together, they are identical to the faces' normal.

Instead of averaging the normals of each vertice on the face, maybe it'd be better to just avarage the position vertices themselves?

Cheers,

Scronty

bitRake...thanx for the edit

I'm useless with the keyboard

:alright:

I'm useless with the keyboard

:alright:

Sorry Scronty, I ment get the normal of the paticular face you want at the top, thanks for clearing that up :alright:

I solved the problem, and then I found a real solution (typical :tongue: )

For my application I have a (roughly) spherical World with my Player located

on one of many triangles, at some rather arbitrary coordinate yet nontheless located on the plane of and within the bounds of a single triangle.

I wanted to rotate the world and the player to bring the player to the top.

My solution was to trace a ray from the centre of the planet to the unrotated 3d coordinate of the player on the planet's surface. This gives me a triaxial set of rotation angles (xy,xz,yz) which I could apply using a YawPitchRoll matrix.

In my case, however, and yes I am breaking rules here but rules shmules...

I simply used that Ray to define the World Up Vector for Rending :tongue:

This is the first (maybe only) time I'll ever change the World UP, but to me it presented a shortcut, because this ray truly does point up at all times, in the frame of reference of a player located on that surface and standing vertically.

The REAL Solution I later found was to use the handy dandy D3DXRotationAxisMatrix (think that's right) function, used to create a rotation matrix for an arbitrary axis (any 2 points in 3d space).

Thanks for the rebound as always.

For my application I have a (roughly) spherical World with my Player located

on one of many triangles, at some rather arbitrary coordinate yet nontheless located on the plane of and within the bounds of a single triangle.

I wanted to rotate the world and the player to bring the player to the top.

My solution was to trace a ray from the centre of the planet to the unrotated 3d coordinate of the player on the planet's surface. This gives me a triaxial set of rotation angles (xy,xz,yz) which I could apply using a YawPitchRoll matrix.

In my case, however, and yes I am breaking rules here but rules shmules...

I simply used that Ray to define the World Up Vector for Rending :tongue:

This is the first (maybe only) time I'll ever change the World UP, but to me it presented a shortcut, because this ray truly does point up at all times, in the frame of reference of a player located on that surface and standing vertically.

The REAL Solution I later found was to use the handy dandy D3DXRotationAxisMatrix (think that's right) function, used to create a rotation matrix for an arbitrary axis (any 2 points in 3d space).

Thanks for the rebound as always.

You know, I prefer your solution to the "REAL" solution. Your solution is a thousand times more efficient.