Page 1 sur 1

Dreamotion3D : Coquillage

Publié : ven. 17/nov./2006 11:49
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)

Publié : ven. 17/nov./2006 13:00
par Anonyme
on dirait que les normales ne sont pas pris en compte.

Publié : ven. 17/nov./2006 17:15
par tmyke
Je regarde cela et je te répond demain ;)

Publié : sam. 18/nov./2006 15:09
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