Exemple TerrainBlend

Généralités sur la programmation 3D
Avatar de l’utilisateur
Jenova
Messages : 96
Inscription : mar. 09/mars/2004 10:27

Exemple TerrainBlend

Message 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:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Exemple TerrainBlend

Message 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.
Dernière modification par comtois le mar. 07/janv./2014 23:20, modifié 1 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Jenova
Messages : 96
Inscription : mar. 09/mars/2004 10:27

Re: Exemple TerrainBlend

Message par Jenova »

Merci beaucoup, je regarde tout ça attentivement :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Exemple TerrainBlend

Message 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)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Jenova
Messages : 96
Inscription : mar. 09/mars/2004 10:27

Re: Exemple TerrainBlend

Message par Jenova »

Ah bah c'est sur que présenté comme ça tout deviens limpide :D
Encore merci :)
Répondre