Page 1 sur 1

Exemple TerrainBlend

Publié : dim. 29/déc./2013 18:01
par Jenova
Salut tout le monde, c'est de nouveau moi, décidément j’arrête pas de vous embêter ces derniers temps :oops:
Comme vous l'aurez deviné je m’intéresse à la 3D de purebasic en ce moment et je décortique l'exemple TerrainBlend histoire d'essayer de comprendre comment tout cela fonctionne.
Avec l'aide de purebasic ou les termes qui y sont employés sont souvent représentatif de tout et de rien à mes yeux, et avec l'exemple TerrainBlend, excellentissime ! Il donne vraiment envie de s'y intéresser, mais je le trouve un peu avare de commentaires, j'ai beaucoup de mal à comprendre.
Ce que j'ai cru comprendre c'est :

1.
CreateTerrain(#Terrain, Taille, TailleMonde, Echelle, NbCouches, NomFichier$, Extension$)
Taille = Nombre de poly qui constitue le terrain ?
TailleMonde = TailleXY de la parcelle principale ?
____________________________________________________________________________
2.
Chaque parcelle ajouté avec DefineTerrainTile() dispose de sa propre HeightMap (il n'y a pas de HeightMap globale incluant toutes les parcelles)
____________________________________________________________________________
3.
TerrainTilePointX ou Y(#Terrain, ParcelleX, ParcelleY, x, y, z) donne à partir d'un point de l'espace 3D sa coordonné X ou Y dans l'image qui sert de heightmap à cette parcelle
____________________________________________________________________________
4.
On affecte pas directement une hauteur en jouant sur les vertex, il faut changer la valeur dans la HeightMap de la parcelle concernée qui se répercute sur le terrain dès qu'on l'update.
____________________________________________________________________________
5.
Dans l'exemple TerrainBlend, la procedure DoTerrainModify(), pourquoi on multiplie par imgSize ?

Code : Tout sélectionner

Procedure DoTerrainModify(tx, ty, wx.f, wy.f, wz.f, mBrushSizeTerrainSpace.f, TimeElapsed.f)
  imgSize.f = TerrainTileLayerMapSize(0, tx, ty)
  Pointx.f = TerrainTilePointX(0, tx, ty, wx, wy, wz) 
  Pointy.f = TerrainTilePointY(0, tx, ty, wx, wy, wz) 

  startx = (Pointx - mBrushSizeTerrainSpace) * imgSize
  starty = (Pointy - mBrushSizeTerrainSpace) * imgSize
  endx   = (Pointx + mBrushSizeTerrainSpace) * imgSize
  endy   = (Pointy + mBrushSizeTerrainSpace) * imgSize
  
  startx = Max(startx, 0)
  starty = Max(starty, 0)
  endx   = Min(endx, imgSize) 
  endy   = Min(endy, imgSize) 
  
  For y = starty To endy
    For x = startx To endx  
      
      tsXdist.f = (x / imgSize) - Pointx
      tsYdist.f = (y / imgSize) - Pointy
      
      weight.f = Min(1.0,	Sqr(tsYdist * tsYdist + tsXdist * tsXdist) / (0.5 * mBrushSizeTerrainSpace))
      weight = 1.0 - (weight * weight)
      paint.f = weight * TimeElapsed
      imgY = imgSize - y
      val.f = GetTerrainTileLayerBlend(0, tx, ty, 1, x, imgY) + paint
      Clamp(@val, 0, 1)
      SetTerrainTileLayerBlend(0, tx, ty, 1, x, imgY, val)
      
    Next x
  Next y
  UpdateTerrainTileLayerBlend(0, tx, ty, 1)
EndProcedure
Voilou, c'est vraiment chaud tout ce tatouin. J'm'en vais ré-écouter un coup de Plastic Bertrand moi :mrgreen:

Re: Exemple TerrainBlend

Publié : dim. 05/janv./2014 11:57
par comtois
L'exemple est issu de ce tutoriel

Les noms des commandes PureBasic sont parfois différents , mais ça devrait déjà t'aider à mieux comprendre d'où ça sort, et comment ça fonctionne.

On peut aussi trouver des infos dans l'aide d'Ogre :
http://www.ogre3d.org/docs/api/1.9/clas ... ml#details

TerrainTileLayerMapSize() correspond par exemple à getLayerBlendMapSize()

TerrainTilePointX/Y() correspond à getTerrainPosition()
la valeur est comprise entre 0 et 1 (pourcentage), on multiplie par la taille pour le ramener à l'échelle de la map.

Re: Exemple TerrainBlend

Publié : dim. 05/janv./2014 13:14
par Jenova
Merci beaucoup, je regarde tout ça attentivement :D

Re: Exemple TerrainBlend

Publié : dim. 05/janv./2014 13:17
par comtois
CreateTerrain(#Terrain, Taille, TailleMonde, Echelle, NbCouches, NomFichier$, Extension$)

Taille = Nombre de vertices (un côté du terrain)
TailleMonde = taille dans le monde 3D (un côté du terrain)

Re: Exemple TerrainBlend

Publié : lun. 06/janv./2014 12:48
par Jenova
Ah bah c'est sur que présenté comme ça tout deviens limpide :D
Encore merci :)