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