Créer un tileset 3D

Généralités sur la programmation 3D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Créer un tileset 3D

Message 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
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Créer un tileset 3D

Message 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.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Créer un tileset 3D

Message 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:
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Créer un tileset 3D

Message 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 ?
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Créer un tileset 3D

Message 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 ?
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Créer un tileset 3D

Message 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 ;).
Répondre