Page 1 sur 1

Créer un tileset 3D

Publié : ven. 15/avr./2011 15:04
par kelebrindae
Bonjour,

Pour un projet de jeu, j'aimerais créer un tileset 3D représentant des cavernes.
(Pour info: un tileset 3D est un ensemble de d'objets - un mur, un angle, etc.. - qui peuvent être mis bout à bout pour créer un niveau complet; C'est le même principe qu'en 2D.)

Avec des surfaces plane (un mur de brique, une route), ça ne pose pas trop de soucis. Mais avec des surfaces courbes (c'est le cas des murs d'une caverne), j'ai des problèmes avec le smoothing.
=> les vertex de 2 tuiles adjacentes ont beau être exactement au même endroit, le smoothing fait que la séparation se voit. :(

Pour que vous voyiez mieux ce que je veux dire, je vous ai mis ici une portion de mur que l'on peut "tuiler" bout à bout:
http://keleb.free.fr/codecorner/downloa ... e_tile.zip
Et voici le code PB qui met en évidence le problème (il crée deux entités l'une à côté de l'autre et place la caméra de façon à ce que l'on voit le problème d'ombrage/smoothing).

Je suis à cours d'idée; Quelqu'un saurait comment résoudre le problème ? Comment dois-je créer mon mesh pour qu'il soit "tuilable" sans que ça se voit ?

Code : Tout sélectionner

;- Initialisation
If InitEngine3D() = 0
  MessageRequester( "Error" , "Can't initialize 3D, check if engine3D.dll is available" , 0 )
  End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 )
  End
EndIf

result = MessageRequester("3D Tileset","Full Screen ?",#PB_MessageRequester_YesNo)
If result = 6     
  FullScreen=#True
  OpenScreen(1024,768,32,"3D Tileset")
Else           
  FullScreen=#False
  OpenWindow(0,0, 0, 800 , 600 ,"3D Tileset",#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf
  
; Load the "wall" tile and create 2 entities
Add3DArchive(".", #PB_3DArchive_FileSystem)
LoadMesh(1,"cave01_wall01_01.mesh")
CreateEntity(1, MeshID(1), #PB_Material_None,-9,0,0)
CreateEntity(2, MeshID(1), #PB_Material_None,0,0,0)


; Camera
CreateCamera(0,0,0,100,100)
CameraLocate(0, 0,10,5)
Define.f cam_x,cam_y,cam_z,light_x = -100,light_y= 100,light_z = 100
cam_x = -4.5:cam_y = 0:cam_z = -10
CameraBackColor(0,$FFBB77)

;- Light
lightMesh = CreateSphere(#PB_Any,1)
lightEntity = CreateEntity(#PB_Any,MeshID(lightMesh),#PB_Material_None)
CreateLight(0, $777777)
LightLocate(0,light_x,light_y,light_z)
EntityLocate(lightEntity,light_x,light_y,light_z) 

;- Main loop
Repeat

  If FullScreen = #False
    While WindowEvent():Wend
  EndIf
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_Up)
    MoveCamera(0,0,0,-1)
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    MoveCamera(0,0,0,1)
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    MoveCamera(0,-1,0,0)
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    MoveCamera(0,1,0,0)
  EndIf
  If KeyboardPushed(#PB_Key_PageDown)
    MoveCamera(0,0,-1,0)
  EndIf
  If KeyboardPushed(#PB_Key_PageUp)
    MoveCamera(0,0,1,0)
  EndIf
  
  If KeyboardReleased(#PB_Key_L)
    answer.s = InputRequester("Position light","Enter light position (x,y,z)",StrF(light_x,2)+","+StrF(light_y,2)+","+StrF(light_z,2) )
    light_x = ValF(StringField(answer,1,","))
    If CountString(answer,",") >= 1
      light_y = ValF(StringField(answer,2,","))
    EndIf
    If CountString(answer,",") >= 2
      light_z = ValF(StringField(answer,3,","))
    EndIf
    LightLocate(0,light_x,light_y,light_z)
    EntityLocate(lightEntity,light_x,light_y,light_z) 
  EndIf
 
  CameraLookAt(0, cam_x , cam_y, cam_z)

  RenderWorld()
  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)
  
End

Re: Créer un tileset 3D

Publié : ven. 15/avr./2011 15:52
par G-Rom
ce n'est pas un problème de purebasic ou d'ogre , la lumière est calculé par vertex , qui eux même sont normalisé lors de la création du mesh.
A toi de faire des mesh "tilable" , il faut que la normale du vertex corresponde à celle du voisin.

Re: Créer un tileset 3D

Publié : ven. 15/avr./2011 20:05
par kelebrindae
Oui, oui, j'entends bien: ce n'est ni un problème d'Ogre, ni de PB.
Il faut effectivement que la normale des vertex du bord soit la même que celle du bord voisin.

Mon souci, ce que je n'arrive pas à créer mon mesh pour qu'il en soit ainsi.
=> Si quelqu'un a un peu d'expérience d'un modeleur (Blendman avec Blender, par exemple, mais je prends tout conseil utile) et a des trucs à me donner, je suis tout ouïe.

Merci d'avance! :mrgreen:

Re: Créer un tileset 3D

Publié : sam. 16/avr./2011 14:09
par blendman
kelebrindae a écrit :Mon souci, ce que je n'arrive pas à créer mon mesh pour qu'il en soit ainsi.
=> Si quelqu'un a un peu d'expérience d'un modeleur (Blendman avec Blender, par exemple, mais je prends tout conseil utile) et a des trucs à me donner, je suis tout ouïe.:
qui me parle ?

Alors, personnellement, je suis très peu habitué aux tiles, que ce soit en 2D ou en 3D. Néanmoins, voici quelques pitites méthodes qui te seront peut être utiles ;) (en plus du conseil de G-rom)

- Pour avoir un mesh qui soit à peu près tilable, il faut que les parties qui vont se touchées soient le plus plat possible, avec le moins de relief possible
- ensuite, il ne faut pas de faces "internes", comme tu l'avais fait (je les ai supprimées sur ton mesh (.obj) et je l'ai réexporté)
- Une chose à ne surtout pas oublier : la texture va aussi être très importante dans le tile : elle doit bouclé, ainsi que le mapping qui doit être le plus nickel possible : comprendre boucler lui aussi
- enfin, tu peux aussi utiliser les couleurs vertex pour faire en sorte que ça boucle mieux (je ne l'ai pas fait sur l'exemple).

Avec une texture faite très rapido, on ne voit presque plus le bouclage de tes objets (j'ai aussi retouché le mesh vite fait) :
Image

le fichier+texture+material :
http://blendman.free.fr/dev/pb/3D/tiled3D.zip

Autre chose, tu peux aussi créer des objets moins génériques, qui ne tilent pas, mais qui peuvent s'agencer, s'imbriquer, etc les uns aux autres, notamment pour les rochers, ça marchent souvent pas mal.

Je te ferai un exemple si tu veux.
En général, pour que ça marche bien (les objets imbriqués non tilables), on recalcule les lumières et ombres par couleur vertex voire par lightmap.

Voiloutch, en espérant que cela taidera ;)

PS : tu as fait ton mesh avec Blender ?

Re: Créer un tileset 3D

Publié : mar. 19/avr./2011 8:46
par kelebrindae
Merci Blendman. Je vais tenter d'appliquer tout ça pour voir ce que ça donne.
blendman a écrit :tu as fait ton mesh avec Blender ?
Non, avec une vieille version de 3D Studio Max (la v9) que j'ai récupéré de mon boulot. J'ai trouvé un petit tuto sur les normales avec notamment le modifier "Edit Normals", qui me paraît prometteur; mais bon, c'est fou ce que ça prend comme temps de découvrir tout ça en autodidacte...

J'avais essayé de me mettre à Blender, mais j'avais été rebuté par l'ergonomie. Il faudrait que je réessaye, il paraît que la 2.57 a apporté de grosses améliorations de ce côté-là.
Quel est ton avis ?

Re: Créer un tileset 3D

Publié : mar. 19/avr./2011 14:46
par blendman
kelebrindae a écrit :Non, avec une vieille version de 3D Studio Max (la v9) que j'ai récupéré de mon boulot. J'ai trouvé un petit tuto sur les normales avec notamment le modifier "Edit Normals", qui me paraît prometteur; mais bon, c'est fou ce que ça prend comme temps de découvrir tout ça en autodidacte...
POur la modélisation 3dsmax est pas mal, mais je préfère blender. Il a moins d'outils de modélisation, c'est surtout par habitude, car je vais vraiment très vite avec ce soft.
De toutes façons, une fois qu'on maitrise max, je pense qu'on peut aller aussi vite.
J'avais essayé de me mettre à Blender, mais j'avais été rebuté par l'ergonomie. Il faudrait que je réessaye, il paraît que la 2.57 a apporté de grosses améliorations de ce côté-là.
Quel est ton avis ?
Effectivement, depuis les nouvelles 2.5x, l'interface a été revue. On peut donc avoir une interface façon 3dsmax ou maya, pour ceux qui le souhaitent. Mais les outils et les concepts ne sont pas les mêmes.

Max utilisent surtout des modifiers et ce pour tout.
Blender n'utilise des modifier que pour certaines choses

Niveau ergonomie, je pense qu'il faut tester cette nouvelle version (2.57 est la dernière stable), et voir si cela te convient.
Blender fonctionne beaucoup avec les raccourcis, c'est beaucoup plus pro que par clic et au final en production beaucoup plus rapide !

Mais on est encore loin d'avoir tous les outils de max ou maya niveau modélisation.
Pour dire vrai, on n'a même pas encore tous les outils de la 2.49 :). Ils les ajoutent progressivement et visiblement, ils attendent le développement d'un gros modules appelé "Bmesh", qui devrait permettre d'ajouter tous les outils manquants et beaucoup plus aussi, de nouveaux outils, ainsi que des fonctions présentes ou même s absentes de max ou maya.

Une fois qu'elle sera "terminée" cette nouvelle version (donc sans doute pour la 2.6), on devrait disposer de très nombreux nouveaux outils de modélisation vraiment intéressants.

Concernant le "temps réel" - pour le jeu vidéo, il manque des fonctions de bases à blender, et je pense qu'elles ne seront jamais intégrées ou en tout cas pas avant longtemps. Par exemple : les smoothing groupes, le calculs de vertex colors en fonction de la radiosité ou de la GI (je ne parle pas de backing ou de lightmap, ça c'est à peu près correct,

Ils ont même enlevés des fonctions qui étaient très pratique, comme la radiosité calculées sur les vertex (vertex lighting ou vertex color) :(
Par contre, l'engine de jeu (blender game engine ou BGE) est super balèze !
Sérieusement, on peut avoir un résultat presque équivalent à un rendu fait avec l'unreal engine !!
Là où ça pose problème c'est sur le nombre de faces, car on est très loin de pouvoir afficher autant de faces qu'avec l'unreal.
L'autre problème du BGE c'est la programmation.
On peut utiliser des script python pour le game play en les liant à des "briques logiques", mais c'est beaucoup moins pratique que de coder avec un IDE comme celui de purebasic, je trouve.

Mais il est certain que plus Blender avance plus il fait de l'ombre aux autres logiciels, il commence à être intégré dans des productions professionnelles de films d'animation en 3D de plus en plus :).
Et comme il est gratuit, ça ne coute rien de l'utiliser.

voiloutch, en espérant que cela te soit utile ;).