Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Argantonio en 20 de Abril de 2005, 11:55:06 AM

Título: Interpolacion En Terrenos
Publicado por: Argantonio en 20 de Abril de 2005, 11:55:06 AM
 Hola, estoy haciendo un motor 3D y he implementado geomipmapping para los terrenos, el problema que tengo es que para hacer que los personajes caminen por él necesito interpolar la altura en los triangulos, ya que uso un mapa de alturas para hacer el paisaje y solo tengo la altura en los vertices, así que cuando el personaje anda va a saltos metiendose a veces debajo de la tierra...

¿Alguien sabe como se podría interpolar la altura en un punto de un triangulo conociendo sus vértices? O algún tutorial o página que me sirva de ayuda.

¡Muchas gracias!
Título: Interpolacion En Terrenos
Publicado por: fiero en 20 de Abril de 2005, 12:22:13 PM
 Echale un vistazo al ejemplo Pick de DirectX. En él se calculan las coordenadas de la textura según la posición del ratón. De la misma forma que ese ejemplo calcula la U y V, puedes calcular la Y de tu personaje.

un saludo
Título: Interpolacion En Terrenos
Publicado por: Astat en 20 de Abril de 2005, 12:28:28 PM
 Tambien tengo un geomipmapping por ahi y lo hago asin:


float cTerrain::GetHeight(float fX, float fZ)
{
 int nX, nZ, h1, h2, h3, h4;
 float dX, dZ, fHeight;

 if (m_fTileSize != 1.0f)
 {
   fX /= m_fTileSize;     // fixme: inv
   fZ /= m_fTileSize;
 }

 nX = int(fX);   // fixme: float to int
 nZ = int(fZ);
 dX = fX - nX;
 dZ = fZ - nZ;

 if ((nX < 0) || (nZ < 0) || (nX >= (int)m_nMapSize) || (nZ >= (int)m_nMapSize))
   return 0.0f;

 h1 = nZ * m_nMapSize + nX;
 h2 = nZ * m_nMapSize + nX + 1;
 h3 = (nZ + 1) * m_nMapSize + nX;
 h4 = (nZ + 1) * m_nMapSize + nX + 1;

 if (dX + dZ < 1.0f)
 {
   fHeight = m_fHeightMap[h1];
   fHeight += dX * (m_fHeightMap[h2] - m_fHeightMap[h1]);
   fHeight += dZ * (m_fHeightMap[h3] - m_fHeightMap[h1]);
 }
 else
 {
   fHeight = m_fHeightMap[h4];
   fHeight += (1.0f - dX) * (m_fHeightMap[h3] - m_fHeightMap[h4]);
   fHeight += (1.0f - dZ) * (m_fHeightMap[h2] - m_fHeightMap[h4]);
 }

 return fHeight;
}


La funcion le pasas donde esta el personaje en el plano xz (no el triangualo como tu dices) y te pasa la altura.

m_nMapSize es el tamaño del mapa en tiles, y m_fTileSize es un multiplicador de la malla del terreno.

Espero que te sirva de algo  ;)  
Título: Interpolacion En Terrenos
Publicado por: vincent en 20 de Abril de 2005, 01:31:49 PM
 Buenas,

puedes hacer una interpolación bilineal entre los 4 puntos más cercanos del heightmap.

Suerte!
Título: Interpolacion En Terrenos
Publicado por: Topper en 20 de Abril de 2005, 07:06:46 PM
 sustituye sobre la ecuación del plano despejando Y. Necesitarás los 3 vértices del triángulo sobre el que se supone que está tu personaje para calcular la normal del plano sobre el que yace dicho triángulo....

Saludos.
Título: Interpolacion En Terrenos
Publicado por: Argantonio en 21 de Abril de 2005, 12:46:04 PM
 Hola,
creo que lo de interpolar entre los cuatro puntos más cercanos del mapa de alturas es mejor que la idea que yo tenía de buscar el tringulo e interpolar la altura, pero no entiendo la parte del código de Vincent:

if (dX + dZ < 1.0f)
{
  fHeight = m_fHeightMap[h1];
  fHeight += dX * (m_fHeightMap[h2] - m_fHeightMap[h1]);
  fHeight += dZ * (m_fHeightMap[h3] - m_fHeightMap[h1]);
}
else
{
  fHeight = m_fHeightMap[h4];
  fHeight += (1.0f - dX) * (m_fHeightMap[h3] - m_fHeightMap[h4]);
  fHeight += (1.0f - dZ) * (m_fHeightMap[h2] - m_fHeightMap[h4]);
}


que es donde está la miga... :P

Y donde puedo conseguir el ejemplo Pick de DirectX? Es que soy de OpenGl...

Muchas gracias por todas las respuestas, habeis sido muy rápidos!  :)  
Título: Interpolacion En Terrenos
Publicado por: vincent en 21 de Abril de 2005, 12:58:33 PM
 h1----------h2
|                |
|                |
|                |
|                |
h3----------h4

altura1 = ( dx * ( altura[h4] - altura[h3] ) ) + altura[h3];
altura2 = ( dx * ( altura[h2] - altura[h1] ) ) + altura[h1];
alturaFinal =  ( dy * ( altura2 - altura1 ) ) + altura1;

Creo que esto es correcto.

Saludos!
Título: Interpolacion En Terrenos
Publicado por: Argantonio en 28 de Abril de 2005, 11:29:27 AM
  Vale, gracias, al final lo he hecho así y funciona bien. Los personajes ya no caminan dando saltos!  :D

Un saludo.