Sign in to follow this  
Tar

[DX9] Following 3d path

Recommended Posts

Tar    140
I created a 3D curve (e.g. a Viviani curve) and now I would like a simple 3D object to follow the curve and, at the same, change its orientation to face the curve direction.

Following the path is easy (just a translation matrix) but changing the orientation is more tricky.

I figured out that it will be a combination of rotations. I tried many methods but none of them seemed to work (D3DXMatrixRotationX/Y/Z, D3DXMatrixRotationAxis, etc.). At some point I think I hit the gimbal lock problem as the object went upside-down.

Is there any "good practice" of moving an object in the 3D space? If I have to use quaternions, no problem. I just need to know what options I have.

Share this post


Link to post
Share on other sites
Buckeye    10747
Quote:
... at the same, change its orientation to face the curve direction

The curve direction (I assume you derive the tangent to the curve) is only one of three axes you must define to orient the object.

Actually, you only need to choose a second (probably orthogonal) axis to that direction. The third axis can be the cross-product of the direction and the second axis. You'll have to define a method to choose that second axis.

One possibility is to assume that all changes in direction are about an axis which is "right/left" to the object. That is, when there's a change in direction, calculate the cross-product of the new direction with the old and use that as your second axis. The third axis is the cross-product of the new direction and the second axis. That 3rd axis will be the object's new "up" direction.

Share this post


Link to post
Share on other sites
jyk    2094
I'll also recommend the 'parallel transport frame' as an effective means of orienting an object as it moves along a spline. (Search the forums for that term and you should find plenty of info.)

Share this post


Link to post
Share on other sites
Tar    140
Thanks for your help, both of you.

Some comments:

Buckeye:
The method you've described is very similar to the "Fixed Up" method, isn't it? It also uses a direction vector, an "up" vector, and a "right" vector. It's definitely worth giving a try as it seems to be simple enough for quick implementation.

jyk:
I've read the chapter from "Game Programming Games 2" about 'parallel transport frame'. It is explained very clear and I think I'll try this method first. I also had a look at the forum posts.

Although nobody mentioned quaternions I think they could be combined with both techniques. For example in the 'parallel transport frame' method quaternions could be used to generate smooth rotations between the frames. The "Game Programming Games 2" book suggests that.

Thanks again.

Share this post


Link to post
Share on other sites
Tar    140
The 'parallel transport frame' method works like a charm. I followed the directions from the "Game Programming Games 2" book and I did not find any major obstacles.

There is only one caveat. The books says to set the initial frame to an arbitrary frame calculated using the Fixed Up method or the Frenet Frame method. The problem is that I can't find a DirectX 9 method that would create a frame given three ortogonal axes:

Fixed Up method (V is an arbitrary vector):

D = T / |T|
R = DxV / |DxV|
U = RxD

We have three vectors that describe three axes: D - direction, R - right, and U - up. What method should I use to create a matrix given these three vectors?

For the time being, I calculated the initial frame using the 'parallel transport frame' method but it's a bit overkill.

Any suggestions?

Share this post


Link to post
Share on other sites
Buckeye    10747
I think this may be what you're looking for (I may be confused):

Given right (r), up (u) and foreward (f) vectors,

M =
| rx ry rz 0 |
| ux uy uz 0 |
| fx fy fz 0 |
| 0 0 0 1 |

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this