Hi guys,

I'm trying to implement smooth following on my terrain and i'm running into a few problems. I am able to get the height of the nearest vertex to my position and set my players position to that, but that is a bit 'jumpy' and i'd like to smoothly follow the terrain.

What i'm currently doing is getting a vertex that corresponds to a 2d array. From this i can get the 3 other surrounding points of the players position like this:

Point3 p1 = height [ i + 1] [ j ]

Point3 p2 = height [ i ] [ j + 1]

Point3 p3 = height [ i + 1 ] [ j + 1 ]

p2 ------------- p3

|--------------/----|

|----------/--------|

|-------/-----------| <--- Players position is somewhere in there

|---/---------------|

p0---------------p1

So I currently have 4 points and i'd like to know how i can get the height at my characters position using these height values. Also, i'd like to add that the terrain is drawn with triangles, so i've been trying to determine which triangle (p0, p1, p3) or (p0, p2, p3) that the point is on before hand.

I am terribly average at mathematics and i've been trying hopelessly and my height always ends up way off.

Thanks for any help!

ps: sorry for the awful triangle drawings

- rocklobster

**0**

6 replies to this topic

Sponsor:

###
#2
Members - Reputation: **841**

Posted 06 April 2012 - 03:13 PM

What you need, is:

1. As you already know in which grid square your point lies, you can test whether it is closer to p1 or p2. Just use squared distance of 2D vectors (ignore Z)

2. Construct plane from three points (plane is given as normal vector Pn and scalar value Pd). I use P0, P1 and P3 as example triangle.

n = (P1 - P0) cross (P3 - P0)

Pn = normalize (n)

Pd = -Pn dot P0

3. Find line-plane intersection point (line is given as point Lp and direction Ld, intersection point is P)

den = Pn dot Ld

If den is 0 then line is parallel to plane

t = -(Pn dot Lp + Pd) / den

P = Lp + t * Ld

In your case you can use line, that starts from same realistic place - say 10m above the head of character and goes directly downwards - i.e. Lp = (playerX, playerY, playerLastZ + 10), Ld = (0,0,-1).

- Test, whether point is inside triangle
- Construct plane from three points
- Find line-plane intersection point

1. As you already know in which grid square your point lies, you can test whether it is closer to p1 or p2. Just use squared distance of 2D vectors (ignore Z)

2. Construct plane from three points (plane is given as normal vector Pn and scalar value Pd). I use P0, P1 and P3 as example triangle.

n = (P1 - P0) cross (P3 - P0)

Pn = normalize (n)

Pd = -Pn dot P0

3. Find line-plane intersection point (line is given as point Lp and direction Ld, intersection point is P)

den = Pn dot Ld

If den is 0 then line is parallel to plane

t = -(Pn dot Lp + Pd) / den

P = Lp + t * Ld

In your case you can use line, that starts from same realistic place - say 10m above the head of character and goes directly downwards - i.e. Lp = (playerX, playerY, playerLastZ + 10), Ld = (0,0,-1).

Lauris Kaplinski

First technology demo of my game Shinya is out: http://lauris.kaplinski.com/shinya

Khayyam 3D - a freeware poser and scene builder application: http://khayyam.kaplinski.com/

First technology demo of my game Shinya is out: http://lauris.kaplinski.com/shinya

Khayyam 3D - a freeware poser and scene builder application: http://khayyam.kaplinski.com/

###
#4
Members - Reputation: **841**

Posted 07 April 2012 - 04:15 AM

I should have said "squared distance between two 2D points :-)Thanks for the reply, i'm understanding most of it. Just what do u mean by

Just use squared distance of 2D vectors (ignore Z)

To determine where your point lies, you have to project it to XY plane. I.e. if you have player position P=(Px,Py,Pz), make it 2D vector P'=(Pz,Py) and test, int which triangle it lies by finding the its distance from 2D vectors P1'=(P1x,P1y) and P2'=(P2x,P2y)

And instead of calculating and comparing actual distances between P and P1 or P2, you can compare squared distances. I.e. instead of

L = sqrt ((Px - P1x)*(Px - P1x) + (Py-P1y)*(Py-P1y))

You can leave out square root and use

Lsquared = (Px - P1x)*(Px - P1x) + (Py-P1y)*(Py-P1y)

Now this is pointless optmization - but it does not hurt.

Lauris Kaplinski

First technology demo of my game Shinya is out: http://lauris.kaplinski.com/shinya

Khayyam 3D - a freeware poser and scene builder application: http://khayyam.kaplinski.com/

First technology demo of my game Shinya is out: http://lauris.kaplinski.com/shinya

Khayyam 3D - a freeware poser and scene builder application: http://khayyam.kaplinski.com/

###
#6
Members - Reputation: **841**

Posted 08 April 2012 - 05:25 AM

Oh, yes of course ;-)If Y is my up vector, shouldn't i be using x and z to find the distance between the points?

Lauris Kaplinski

First technology demo of my game Shinya is out: http://lauris.kaplinski.com/shinya

Khayyam 3D - a freeware poser and scene builder application: http://khayyam.kaplinski.com/

First technology demo of my game Shinya is out: http://lauris.kaplinski.com/shinya

Khayyam 3D - a freeware poser and scene builder application: http://khayyam.kaplinski.com/