PDA

View Full Version : Terrain - How to Get Height at [x,y] - Still Having Probs! Help Plz?



Heaven
04-25-2001, 03:29 AM
I've done my best to implement the code Dans gave me in my previous post, but with mixed results. It gets me in the ballpark but it's chopping like mad on me. The transitions are not smooth between tris.

void getFaceNormal(int x, int y, float n[3])
{
float v1[3], v2[3], v3[3], v4[3];
float p1[3], p2[3];

float s=(float)step;

v1[0]=0.0f; v1[1]=0.0f; v1[2]=getMapZ(x,y);
v2[0]=0.0f; v2[1]=-s; v2[2]=getMapZ(x,y+1);
v3[0]=s; v3[1]=0.0f; v3[2]=getMapZ(x+1,y);
v4[0]=s; v4[1]=-s; v4[2]=getMapZ(x+1,y+1);

if (cam.y>=cam.x)
{
subtractvect(v1,v2,p1);
subtractvect(v2,v3,p2);
normcrossprod(p1,p2,n);
return;
}

subtractvect(v2,v3,p1);
subtractvect(v3,v4,p2);
normcrossprod(p1,p2,n);
return;
}

float getCamZ(void)
{
int mx=(int)mapX,
my=(int)mapY;

float n[3], p[3];

float c;

getFaceNormal(mx,my,n);

p[0]=0.0f;
p[1]=-(float)step;
p[2]=getMapZ(mx,my+1);

c=(n[1]*p[1] + n[2]*p[2]);

return (c - n[0]*cam.x - n[1]*cam.y) / n[2];
}

Basically I just get the face normal (somebody plz let me know if I'm doing that part wrong) and then find 'c' using the lower left point of each map square (which is common to both cells in that square), and finally calculate the height.

The result? My z values "jump" when I cross cell boundaries. At least, that's what it looks like.
www.knology.net/~heaven/files/engine2.zip (http://www.knology.net/~heaven/files/engine2.zip)

if you want to see what I'm talking about.

Thanks for any help,
Heaven

dans
04-26-2001, 05:41 AM
Ok ill assume you have figured what cell/tri you are on and have its world coordinates. You also know your objects world x,z coordinates

static float tri[3][3];

tri[0][0] = (float)x1; // plug in cell coords
tri[0][1] = (float)y1;
tri[0][2] = (float)z1;

tri[1][0] = (float)x2;
tri[1][1] = (float)y2;
tri[1][2] = (float)z2;

tri[2][0] = (float)x3;
tri[2][1] = (float)y3;
tri[2][2] = (float)z3;

static float normal[3];
GetNormalised(tri, normal); // this func return a normal for tri (normalised/unit of 1) to array called normal.. make sure the result IS normalised. These normals could and more often than not should be pre-calculated.

// Solve for c, the plane equation offset
float c = normal[0] * tri[0][0] + normal[1] * tri[0][1] + normal[2] * tri[0][2];

// Now solve for the y component of position
float ypos = (c - normal[0] * xpos - normal[2] * zpos) / normal[1];

drawobject(xpos,ypos,zpos);

Hope that helps you some more. http://www.opengl.org/discussion_boards/ubb/smile.gif

Heaven
04-27-2001, 09:05 AM
I finally got it. Thanks Dans for your help. I really appreciate it.

Persevering under your expert tutelage I finally found the cause of my problems. My "xpos" and "ypos" (and BTW I force the frustum to be x/y with z up, so I made the necessary changes to the calculations) I had clamped to 0.0f ... 1.0f. Which was fine for the xpos but not the y. I clamped the ypos to 0.0f ... -1.0f and it worked great.

Except I still experience a small "bump" at cell boundaries which causes the view to jump a small amount, but it's almost negligible in effect. I'll make it so the Z gradually changes instead of being absolutely set each frame, which should help, but if you could offer any insight I'd be most appreciative.

Thanks in advance.

Care,
Heaven

DFrey
04-27-2001, 09:14 AM
To remove any obvious jumps in the view, you can just interpolate (actually slerp) between view vectors. Gotta chose my words carefully now or this thread is likely to degrade into a quaternion vs matrix mess. http://www.opengl.org/discussion_boards/ubb/tongue.gif
But yea, just slerp your view matrix or view quarternion and you can turn that jump into a smooth gentle nudge.

[This message has been edited by DFrey (edited 04-27-2001).]