Hello,

I believe there is a lot of topics about it, but I just wrote my function that returns the height. However I have strage differences in height values when moving between cells (even triangles) and I just can't realise after two days what is wrong. I am writing the code on the grounds of http://www.toymaker.info/Games/html/terrain_follow.html

Here is my structure which contains the terrain (the size of terrain is 256x256; the cell is a square with size of 1.0):

here is the function:

float Terrain::getHeight( float x, float z ) { if( !m_heightMap ) return -1; // which cell are we in int _cellX = ( int )( x - m_heightMap[0].x ); int _cellZ = ( int )( z - m_heightMap[0].z ); // to determine which triangle we are in // _____ // |\ | // | \ | // |____\| float _relativeXPos = x - _cellX; float _relativeZPos = z - _cellZ; float _height = 0.0f; float _vertex1[3], _vertex2[3], _vertex3[3], _vector1[3], _vector2[3]; VectorType _normals; // if we are in the left triangle if( _relativeXPos <= _relativeZPos ) { // get three vertices from the triangle _vertex1[0] = m_heightMap[_cellX+256].x; _vertex1[1] = m_heightMap[_cellX+256].y; _vertex1[2] = m_heightMap[_cellX+256].z; _vertex2[0] = m_heightMap[_cellX].x; _vertex2[1] = m_heightMap[_cellX].y; _vertex2[2] = m_heightMap[_cellX].z; _vertex3[0] = m_heightMap[_cellX+1].x; _vertex3[1] = m_heightMap[_cellX+1].y; _vertex3[2] = m_heightMap[_cellX+1].z; // calculate two vectors for this triangle _vector1[0] = _vertex2[0] - _vertex1[0]; _vector1[1] = _vertex2[1] - _vertex1[1]; _vector1[2] = _vertex2[2] - _vertex1[2]; _vector2[0] = _vertex3[0] - _vertex1[0]; _vector2[1] = _vertex3[1] - _vertex1[1]; _vector2[2] = _vertex3[2] - _vertex1[2]; // calculate the normal vector of the triangle _normals.x = ( _vector1[1] * _vector2[2] ) - ( _vector1[2] * _vector2[1] ); _normals.y = ( _vector1[2] * _vector2[0] ) - ( _vector1[0] * _vector2[2] ); _normals.z = ( _vector1[0] * _vector2[1] ) - ( _vector1[1] * _vector2[0] ); // normalize float _length = sqrt( ( _normals.x * _normals.x ) + ( _normals.y * _normals.y ) + ( _normals.z * _normals.z ) ); _normals.x /= _length; _normals.y /= _length; _normals.z /= _length; //P.y = V0.y+ (N.x * dx + N.z * dz ) / -N.y _height = _vertex1[1] + ( _normals.x * _relativeXPos + _normals.z * _relativeZPos ) / ( -_normals.y ); } else { // get three vertices from the triangle _vertex1[0] = m_heightMap[_cellX+1].x; _vertex1[1] = m_heightMap[_cellX+1].y; _vertex1[2] = m_heightMap[_cellX+1].z; _vertex2[0] = m_heightMap[_cellX+257].x; _vertex2[1] = m_heightMap[_cellX+257].y; _vertex2[2] = m_heightMap[_cellX+257].z; _vertex3[0] = m_heightMap[_cellX+256].x; _vertex3[1] = m_heightMap[_cellX+256].y; _vertex3[2] = m_heightMap[_cellX+256].z; // calculate the two vectors for this triangle _vector1[0] = _vertex2[0] - _vertex1[0]; _vector1[1] = _vertex2[1] - _vertex1[1]; _vector1[2] = _vertex2[2] - _vertex1[2]; _vector2[0] = _vertex3[0] - _vertex1[0]; _vector2[1] = _vertex3[1] - _vertex1[1]; _vector2[2] = _vertex3[2] - _vertex1[2]; // calculate the normal vector of the triangle _normals.x = ( _vector1[1] * _vector2[2] ) - ( _vector1[2] * _vector2[1] ); _normals.y = ( _vector1[2] * _vector2[0] ) - ( _vector1[0] * _vector2[2] ); _normals.z = ( _vector1[0] * _vector2[1] ) - ( _vector1[1] * _vector2[0] ); // normalize float _length = sqrt( ( _normals.x * _normals.x ) + ( _normals.y * _normals.y ) + ( _normals.z * _normals.z ) ); _normals.x /= _length; _normals.y /= _length; _normals.z /= _length; //P.y = V0.y+ (N.x * dx + N.z * dz ) / -N.y _height = _vertex1[1] + ( _normals.x * _relativeXPos + _normals.z * _relativeZPos ) / ( -_normals.y ); } return _height; }

for example I have bigger height difference between position (2.99, 0.5) and (3.01, 0.5), but the vertices of those triangles have almost the same height and the camera jumps strangely.

I'd really appreciate some help, please.

Thank you.