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.