Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Interpolacion En Terrenos

Iniciado por Argantonio, 20 de Abril de 2005, 11:55:06 AM

« anterior - próximo »

Argantonio

 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!

fiero

 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
www.videopanoramas.com Videopanoramas 3D player

Astat

 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  ;)  

vincent

 Buenas,

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

Suerte!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Topper

 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.

Argantonio

 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!  :)  

vincent

 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!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Argantonio

  Vale, gracias, al final lo he hecho así y funciona bien. Los personajes ya no caminan dando saltos!  :D

Un saludo.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.