Dreamotion3D : Coquillage

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Dreamotion3D : Coquillage

Message par comtois »

J'ai des soucis avec la couleur du mesh , pourtant j'ai fait comme d'hab il me semble ?

Code : Tout sélectionner

;Fichiers Include
IncludePath "..\Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"    

Global *camera.CEntity, *entity.CEntity
Global *font.CFont
Global *brush.CBrush
Global *texture.CTexture

  
If InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf

ExamineDesktops()
Texte$ = "Morphing 3D"
Sx = DesktopWidth(0)
Sy = DesktopHeight(0)
Sd = DesktopDepth(0)
OpenScreen(Sx, Sy,Sd, Texte$)
DM_InitGraphics(ScreenID(), Sd, 1, 1)
*DM_d3d9    = DM_GetD3D9()
*DM_d3dDev9 = DM_GetDevice9()
DM_WIDTH    = ScreenWidth
DM_HEIGHT   = ScreenHeight

;-font
*font = DM_LoadFont("Arial", 8, 1)
DM_SetColorText(*font, 255, 255, 0,255)

#E = 2.71828182

Global Pas.f

Procedure.f Exp(value.f)
  ProcedureReturn Pow(#E, value)
EndProcedure

Macro CX(p1,p2)
  exp(p1/k)*Cos(p1)*(1+b*Cos(p2))
EndMacro
Macro   CY(p1,p2)
  exp(p1/k)*Sin(p1)*(1+b*Cos(p2))
EndMacro
Macro CZ(p1,p2)
  exp(p1/k)*(1+b*Sin(p2))
EndMacro

Procedure CreateMeshCoquillage()
;http://aesculier.chez-alice.fr/fichiersPovray/coquillages/coquillages.html
; equation - Coquillage
;x=exp(p1/k)*Cos(p1)*(1+b*Cos(p2))
;y=exp(p1/k)*Sin(p1)*(1+b*Cos(p2))
;z=exp(p1/k)*(1+b*Sin(p2))
;Peut s'appliquer à toute surface paramétrique en mettant les
;bonnes formules dans CX, CY, CZ

  k       = 10      
  b.f     = 0.49268  
  umin.f  = -34               
  umax.f  = -4      
  NbSommet = 25000  
  NbTriangle = 12500 * 2 
     
     
  vmin.f  = 0        ;
  vmax.f  =  6.3     ;
  uiter.f = 140      ;  nombre de pas en u
  viter.f = 40       ;  nombre de pas en v


  iu.f    = (umax-umin)/uiter 
  iv.f    = (vmax-vmin)/viter 

  Define.f uu, vv
   
  Define.f x1, y1, z1
  Define.f x2, y2, z2
  Define.f x3, y3, z3
  Define.f x4, y4, z4
    
  uu = umin   
  p = 0
  ;rouge = $DB
  ;vert = 17
  ;bleu = $02
  rouge = 255
  vert = 255
  bleu = 0
  *entity = DM_CreateMesh(NbTriangle, NbSommet, 1, #Null)
  While (uu<=umax)                     
    vv = vmin
    While (vv<=vmax)                     
      ;POINTS     
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv)) 
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255) 
      i + 1
      uu=uu+iu   
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv)) 
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255) 
      i + 1         
      vv=vv+iv
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv)) 
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255) 
      i + 1
      uu=uu-iu
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv)) 
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255) 
      i + 1
      vv=vv-iv

      ;TRIANGLES   
      DM_VertexTriangle(*entity, t, p, p + 1, p + 2, 0)  
      t + 1
      DM_VertexTriangle(*entity, t, p, p + 2, p + 3, 0)
      t + 1
      DM_VertexTriangle(*entity, t, p + 2, p + 1, p, 0)  
      t + 1
      DM_VertexTriangle(*entity, t, p + 3, p + 2, p, 0)
      t + 1    
      p + 4

      vv = vv+iv
    Wend                 
    uu = uu+iu
  Wend   

  DM_UpdateNormal(*entity)
  DM_ScaleEntity(*entity, 120, 120, 120)
   
EndProcedure   


;-Mesh
CreateMeshCoquillage()

;-camera
*camera = DM_CreateCamera(#Null)
DM_CameraClsColor(*camera, 0, 0, 85)
DM_MoveEntity(*camera, 0, 0, 400)
DM_PointEntity(*camera, *entity)

;-Light
DM_AmbiantLight(75,75,75)
*light = DM_CreateLight(1)
DM_LightColor(*light, 255,  255,  255, 255)
pas = 0.8
Repeat

  DM_TurnEntity(*entity, pas, pas/2,-pas)

  ExamineKeyboard()

  DM_BeginScene()
    DM_RenderWorld()
  DM_EndScene()  
Until KeyboardPushed(#PB_Key_Escape)
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.
Anonyme

Message par Anonyme »

on dirait que les normales ne sont pas pris en compte.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Je regarde cela et je te répond demain ;)
Force et sagesse...
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

OK. En fait cela vien du fait que tu créés visiblement deux face l'une sur l'autre,
et quand tu normalize, lors du rendu selon les face c'est la couche sup ou inf qui
est rendu, d'ou cet effet indésirable...

Voici un code qui marche bien chez moi

Code : Tout sélectionner

Procedure CreateMeshCoquillage()
  k       = 10     
  b.f     = 0.49268 
  umin.f  = -34               
  umax.f  = -4     
  NbSommet = 25000 
  NbTriangle = 12500
     
     
  vmin.f  = 0        ;
  vmax.f  =  6.3     ;
  uiter.f = 140      ;  nombre de pas en u
  viter.f = 40       ;  nombre de pas en v


  iu.f    = (umax-umin)/uiter
  iv.f    = (vmax-vmin)/viter

  Define.f uu, vv
   
  Define.f x1, y1, z1
  Define.f x2, y2, z2
  Define.f x3, y3, z3
  Define.f x4, y4, z4
   
  uu = umin   
  p = 0
  ;rouge = $DB
  vert = 0
  bleu = 0
  rouge = 255
  *entity = DM_CreateMesh(NbTriangle, NbSommet, 1)
  While (uu<=umax)                     
    vv = vmin
    While (vv<=vmax)                     
      ;POINTS     
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv))
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255)
      i + 1
      uu=uu+iu   
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv))
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255)
      i + 1         
      vv=vv+iv
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv))
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255)
      i + 1
      uu=uu-iu
      DM_VertexCoords(*entity, i, CX(uu,vv), CY(uu,vv), CZ(uu,vv))
      DM_VertexColor(*entity, i, rouge, vert, bleu, 255)
      i + 1
      vv=vv-iv

      ;TRIANGLES   
      DM_VertexTriangle(*entity, t, p, p + 1, p+2) ;DM_VertexTriangle(*entity, t, p + 2, p + 1, p, 0) 
      t + 1
      DM_VertexTriangle(*entity, t, p+2, p + 3, p) ; DM_VertexTriangle(*entity, t, p + 3, p + 2, p, 0)
      t + 1   
      p + 4

      vv = vv+iv
    Wend                 
    uu = uu+iu
  Wend   

  DM_UpdateNormal(*entity)
  DM_ScaleEntity(*entity, 120, 120, 120)
  *brush = DM_GetBrush(*entity)
  ;modifie certains paramètres de la brush
  DM_BrushAmbient(*brush, 0,255,0,255)
  DM_BrushDiffuse(*brush, 0,255,0,255)
  *brush = DM_GetBrush(*entity)
  DM_BrushAddRender(*brush, #D3DRS_CULLMODE, #D3DCULL_NONE)
  DM_BrushRestoreRender(*brush, #D3DRS_CULLMODE, #D3DCULL_CCW)
 

EndProcedure      
Force et sagesse...
Répondre