Dreamotion3D : Création d'un cube et questions

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

Dreamotion3D : Création d'un cube et questions

Message par comtois »

J'ai repris l'exemple du cube, et j'ai plusieurs questions :

Les axes sont orientés comment ?Je dirais
vers la droite de l'écran pour l'axe des x
vers le haut de l'écran pour l'axe des y
et l'axe des z sort de l'écran
Est-ce bien ça ?

en fait j'ai un doute sur l'axe des z, j'ai l'impression qu'il est dirigé vers l'écran ? ou c'est moi qui devrais faire une pause.

Dans le code qui suit, j'ai défini un cube avec
Face du haut = bleu
Face du bas = blanc
Face de devant = jaune
Face de derrière = orange
Face gauche = vert
Face droite = rouge

Et j'ai le rouge et le vert d'inversés par rapport à la face jaune qui représente la face avant.

J'ai pourtant les vertices de cette face à +0.5 sur l'axe des z.

Deuxième question .
Comment créer une texture transparente, c'est à dire que j'ai mon cube et je peux définir les couleurs de chaque face, mais j'aimerais ajouter un cadre noir sur chaque face, je peux utiliser une texture, mais je voudrais conserver la couleur des faces. J'imagine qu'il faut jouer avec les paramètres de DM_BrushAddRender(*brush, #D3DRS_CULLMODE, #D3DCULL_NONE) ? j'ai pas trouvé les bons.
Pour tester le code avec la texture il suffit d'enlever le commentaire devant cette ligne ;DM_PaintEntity(*entity, *brush, 0).

Dernier point, les pivots c'est pas mal, mais j'ai la même question qu'avec les joints, comment on fait pour supprimer une association à un pivot ?
et pour faire changer de pivot à une entity ?

Code : Tout sélectionner

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

Declare CreateCube()

Global *camera.CEntity
Global *font.CFont
Define *Cube
Global *brush.CBrush
Global *texture.CTexture

;-Initialisation 
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  End
EndIf

;-ouvre un ecran 3D
DM_Graphics3D(800, 600, 32,  1, 1)
*font = DM_LoadFont( "Arial",16, 2)

;-Texture
*texture = DM_CreateTexture(256,256)
;ré-oriente le buffer de sortie graphique vers notre texture
DM_SetBuffer(*texture)
DM_BeginScene()
  DM_ClsScreen (  0, 0,   0, 255)      ; efface le buffer avec une couleur
  DM_SetColor2D(255, 0,   0, 255)      ; change couleur du trait
  DM_DrawRect  (  1, 1, 254, 254)      ; dessin d'un rectangle 2D
DM_EndScene()
;de nouveau le buffer vers l'ecran
DM_SetBuffer(#Null)

;-Brush
*brush = DM_CreateBrush(Str(*entity))
DM_BrushAmbient(*brush, 255,128,0,255)
DM_BrushDiffuse(*brush, 255,128,0,255)
DM_BrushTexture(*brush, *texture, 0)
; modifie l'état de rendu de la Brush pour voir de tous les cotés
DM_BrushAddRender(*brush, #D3DRS_CULLMODE, #D3DCULL_NONE)

;-creation du cube
*Cube = CreateCube()
DM_ScaleEntity(*Cube, 20, 20, 20)

;-Camera
*camera = DM_CreateCamera(#Null)
DM_PositionEntity(*camera, 0, 50, 150)
DM_CameraClsColor(*camera, 25, 25, 25)
DM_PointEntity(*camera, *Cube)

Repeat

  ExamineKeyboard()
  DM_TurnEntity(*Cube, 0, 1, 0)

  DM_BeginScene()
    DM_Renderworld()
  DM_EndScene()

Until KeyboardPushed(#PB_Key_Escape)
DM_ClearGraphics()
End

Procedure CreateCube()
  Define.CEntity *entity
  *entity = DM_CreateMesh(12, 24, 1, #Null)

  Restore Vertex
  For i= 0 To 23
    Read x.f : Read y.f : Read z.f
    Read u.f : Read v.f
    ;Read Rouge : Read Vert : Read bleu
    rouge = 0 : Vert = 0 : Bleu = 0
    ;Couleur dessus
    If i >=0 And i <=3
      Rouge = 0 : Vert = 0 : bleu = 255
    EndIf
    ;Couleur dessous
    If i >=4 And i <=7
      Rouge = 255 : Vert = 255 : bleu = 255
    EndIf
    ;Couleur devant
    If i >=8 And i <=11
      Rouge = 255 : Vert = 255 : bleu = 0
    EndIf
    ;Couleur derriere
    If i >=12 And i <=15
      Rouge = 255 : Vert = 128 : bleu = 0
    EndIf
    ;Couleur gauche
    If i >=16 And i <=19
      Rouge = 0 : Vert = 255 : bleu = 0
    EndIf      
    ;Couleur droit
    If i >=20 And i <=23
      Rouge = 255 : Vert = 0 : bleu = 0
    EndIf  
    ;les coordonnées de vertex
    DM_VertexCoords(*entity, i, x, y, z)
    ;les coordonnées de texture (canal 0)
    DM_VertexTexCoords(*entity, i, 0, u, v)
    ;Couleurs 
    DM_VertexColor(*entity, i, rouge, vert, bleu, 255)    
  Next i
  ;les triangles
  Restore Indice
  For i = 0 To 11
    Read v1.l : Read v2.l : Read v3.l
    DM_VertexTriangle(*entity, i, v1, v2, v3, 0)
  Next i
  ; affecte la brush créee a notre entity
  ;DM_PaintEntity(*entity, *brush, 0)
  ; génératon auto des normales de l'entity créée
  DM_UpdateNormal(*entity)
  ProcedureReturn *entity
EndProcedure


DataSection
Vertex:
; liste des 24 vertex avec leurs coordonnées de textures
;Haut
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f  0.5, 0.5, 0.5, 0, 1
Data.f -0.5, 0.5,-0.5, 1, 0
Data.f  0.5, 0.5,-0.5, 1, 1

;Bas
Data.f -0.5,-0.5, 0.5, 1, 0
Data.f -0.5,-0.5,-0.5, 1, 1
Data.f  0.5,-0.5, 0.5, 0, 0
Data.f  0.5,-0.5,-0.5, 0, 1

;Devant
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f -0.5,-0.5, 0.5, 0, 1
Data.f  0.5, 0.5, 0.5, 1, 0
Data.f  0.5,-0.5, 0.5, 1, 1

;Derrière
Data.f -0.5, 0.5,-0.5, 1, 0
Data.f  0.5, 0.5,-0.5, 1, 1
Data.f -0.5,-0.5,-0.5, 0, 0
Data.f  0.5,-0.5,-0.5, 0, 1

;Gauche
Data.f -0.5, 0.5,-0.5, 1, 0
Data.f -0.5,-0.5,-0.5, 1, 1
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f -0.5,-0.5, 0.5, 0, 1

;Droit
Data.f  0.5, 0.5,-0.5, 0, 0
Data.f  0.5, 0.5, 0.5, 0, 1
Data.f  0.5,-0.5,-0.5, 1, 0
Data.f  0.5,-0.5, 0.5, 1, 1

Indice:
;liste des faces
Data.l  0,  1,  2
Data.l  1,  3,  2
Data.l  4,  5,  6
Data.l  5,  7,  6
Data.l  8,  9, 10
Data.l  9, 11, 10
Data.l 12, 13, 14
Data.l 13, 15, 14
Data.l 16, 17, 18
Data.l 17, 19, 18
Data.l 20, 21, 22
Data.l 21, 23, 22
EndDataSection
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.
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 »

Voici comment sont orienté les axes:
Image

Pour les texture transparentes, c'est un sujet complexe, sur lequel je bute
d'ailleurs encore sous certains aspect. Dans ton cas déjà, il faut bien penser
que tu va appliquer ta texture créée sur le stage n°1 de ton cube, pour
conserver sur le stage 0 tets couleurs. Il faut donc d'abord signifier que
ton cube sera avec deux canaux de textures, soit ecrire au début: DM_EntityFormat(2)

En suite, si tu veux appliquer ta texture correctement, il faut aussi passer les
coordonnées de textures sur le canal 1 en plus du 0, donc ecrire:
DM_VertexTexCoords(*entity, i, 0, u, v) : DM_VertexTexCoords(*entity, i, 1, u, v)

En suite, dernière étape, grace l'init de certains état, il faut spécifier la transparence
de la texture du stage1:
DM_BrushAddTextureStage(*brush, 1, #D3DTSS_COLOROP, #D3DTOP_BLENDTEXTUREALPHA )
DM_BrushRestoreTextureStage(*brush, 1, #D3DTSS_COLOROP, #D3DTOP_MODULATE )

Mais attention. Cette methode ne fonctionne pas avec toutes les textures, par exemple
avec la texture que tu créé en début de programme, cela ne semble pas fonctionner.
Par contre, en important une texture déjà faite, cela donne ceci:
Image


Enfin, pour les pivot, je pense que tu veux parler des lien Parent/Enfants entre
les entity. Si c'est le cas, alors tu a l'instruction DM_DetachEntity(*entity) qui
libère une entity de son parent.
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Ok alors l'axe z est dirigé vers l'écran, donc l'inverse du moteur ogre, c'est bon à savoir , je commençais à douter :)

Pour les textures je n'ai pas encore le réflexe de penser plusieurs canaux, ça va venir, merci pour l'exemple, je vais tester ça.

Pour les pivots, j'ai plus qu'à mettre en pratique, dès demain si j'ai du courage.


Merci pour toutes ces réponses.
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.
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 vais pondre un petit sample dans le pack aussi pour jeter les bases...
;)
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Ben j'ai commencé avec ça , ça merdouille, je ne sais pas encore si c'est moi ou le moteur, pour l'instant, je dirais que c'est moi :?
Mais où ? je cherche, je cherche, je viens de mettre en place un fichier espion pour suivre l'évolution de mon tableau Rubik.

Tout fonctionne bien si je teste chacune des rotations possibles individuellement, en forçant le type
;Type = Random(8)
Type = #Devant ; ou #Gauche etc
Alors pourquoi ça merde quand je mets un type aléatoire ? mystère et boule de gomme. Pour l'instant je pense que ton moteur est hors de cause, faut que je trouve ma boulette, si quelqu'un la trouve je suis preneur :)

[EDIT]
Enfin je me demande quand même si c'est pas le DetachEntity() qui fout le bazar??

[EDIT2]
Finalement si je mets

Code : Tout sélectionner

Type = Random(1)
DetachEntity() fonctionne bien c'est mon code qui est mauvais :?
Bon je vais chercher pourquoi !

Code : Tout sélectionner

;Comtois le 11/11/06
;Rubik 
;Fichiers Include
IncludePath "..\Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"    
IncludeFile "PhysX.pbi" 

Enumeration 
  #Haut
  #Bas
  #Devant
  #Derriere
  #Gauche
  #Droit
  #CentreX
  #CentreY
  #CentreZ
EndEnumeration

Declare CreateCube(x, y, z)
Declare DetacheRotation()
Declare ParentRotation(No)
Declare Rotation(No, S)
Declare MiseAJour(Type, S)

Global *camera.CEntity
Global *font.CFont
Global *brush.CBrush
Global *texture.CTexture
Global Taille
Define Angle

Global Dim *Pivot(8)
Global Dim *Rubik(2, 2, 2)
Global Dim *TempRubik(2, 2, 2)
;-Initialisation 
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  End
EndIf

;-ouvre un ecran 3D
DM_Graphics3D(800, 600, 32,  1, 1)

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

;-Texture
*texture = DM_CreateTexture(256,256)
;ré-oriente le buffer de sortie graphique vers notre texture
DM_SetBuffer(*texture)
DM_BeginScene()
  DM_ClsScreen (  0, 0,   0, 255)      ; efface le buffer avec une couleur
  DM_SetColor2D(255, 0,   0, 255)      ; change couleur du trait
  DM_DrawRect  (  1, 1, 254, 254)      ; dessin d'un rectangle 2D
DM_EndScene()
;de nouveau le buffer vers l'ecran
DM_SetBuffer(#Null)

;-Brush
*brush = DM_CreateBrush(Str(*entity))
DM_BrushAmbient(*brush, 255,128,0,255)
DM_BrushDiffuse(*brush, 255,128,0,255)
DM_BrushTexture(*brush, *texture, 0)
; modifie l'état de rendu de la Brush pour voir de tous les cotés
DM_BrushAddRender(*brush, #D3DRS_CULLMODE, #D3DCULL_NONE)

;-Creation rubik cube
Taille = 50
For z = 0 To 2
  For y = 0 To 2
    For x = 0 To 2
      No = CreateCube(x, y, z)
      DM_ScaleEntity(No, Taille - 2, Taille - 2, Taille - 2)
      DM_PositionEntity(No, (x-1) * Taille , (y-1) * Taille , (z-1) * Taille)
      *Rubik(x,y,z) = No
    Next x
  Next y
Next z

;-Pivots
For i = 0 To 8
  *Pivot(i) = DM_CreatePivot()
Next i
Angle = 90
  
;-Light
;DM_AmbiantLight(180, 180, 180)

;-camera
*camera = DM_CreateCamera(#Null)
DM_CameraClsColor(*camera, 0, 0, 85)
DM_PositionEntity(*camera, DM_EntityX(*Rubik(1,1,1)) + 250,DM_EntityY(*Rubik(1,1,1)) + 250, DM_EntityZ(*Rubik(1,1,1)) - 250)
DM_PointEntity(*camera, *Rubik(1,1,1))

;-Boucle principale

;CreateFile(0,"Test")
Repeat

; If Angle = 0
;   WriteStringN(0,"Type = " + Str(Type) + " Sens = " + Str(Sens))
;   For z = 0 To 2
;       For y = 0 To 2
;         WriteStringN(0,Str(*Rubik(0, y, z)) + " " + Str(*Rubik(1, y, z)) + " " + Str(*Rubik(2, y, z)))
;       Next y
;   Next z   
;   WriteStringN(0,"-------------") 
; EndIf
  
  ExamineKeyboard()

  If Angle < 90
    Rotation(Type, Sens)
    Angle + 1
    If Angle = 90
      MiseAjour(Type, Sens)       
    EndIf  
  EndIf

  If Angle = 90
    DetacheRotation()
    Angle = 0
    Type = Random(8)
    Repeat
      Sens = 1-Random(2)
    Until Sens <> 0
    ParentRotation(Type)
  EndIf
    
  DM_BeginScene()
    DM_Renderworld()
  DM_EndScene()

Until KeyboardPushed(#PB_Key_Escape)
DM_ClearGraphics()
End

Procedure MiseAjour(Type, Sens)
  Define *Temp
  If Type = #Haut Or Type = #Droit Or Type = #Derriere
    h = 2
  ElseIf Type = #CentreX Or Type = #CentreY Or Type = #CentreZ
    h = 1
  ElseIf Type = #Bas Or Type = #Gauche Or type = #Devant
    h = 0
  EndIf  
  
  CopyMemory(*Rubik(), *TempRubik(), SizeOf(Long) * 27)
  
  If Type = #Haut Or Type = #Bas Or Type = #CentreY 
    If Sens
      
      *Rubik(0, h, 2) = *TempRubik(2, h, 2)  
      *Rubik(1, h, 2) = *TempRubik(2, h, 1)
      *Rubik(2, h, 2) = *TempRubik(2, h, 0)
      
      *Rubik(0, h, 1) = *TempRubik(1, h, 2)  
      *Rubik(1, h, 1) = *TempRubik(1, h, 1)
      *Rubik(2, h, 1) = *TempRubik(1, h, 0)  
      
      *Rubik(0, h, 0) = *TempRubik(0, h, 2)
      *Rubik(1, h, 0) = *TempRubik(0, h, 1)
      *Rubik(2, h, 0) = *TempRubik(0, h, 0)
    Else
      
      *Rubik(0, h, 0) = *TempRubik(0, h, 2)  
      *Rubik(0, h, 1) = *TempRubik(1, h, 2)
      *Rubik(0, h, 2) = *TempRubik(2, h, 2)
      
      *Rubik(1, h, 0) = *TempRubik(0, h, 1)  
      *Rubik(1, h, 1) = *TempRubik(1, h, 1)
      *Rubik(1, h, 2) = *TempRubik(2, h, 1)  
      
      *Rubik(2, h, 0) = *TempRubik(0, h, 0)
      *Rubik(2, h, 1) = *TempRubik(1, h, 0)
      *Rubik(2, h, 2) = *TempRubik(2, h, 0)

    EndIf
  
  ElseIf Type = #Gauche Or Type = #Droit Or Type = #CentreX    
    If Sens
      
      *Rubik(h, 0, 0) = *TempRubik(h, 0, 2)  
      *Rubik(h, 0, 1) = *TempRubik(h, 1, 2)
      *Rubik(h, 0, 2) = *TempRubik(h, 2, 2)
      
      *Rubik(h, 1, 0) = *TempRubik(h, 0, 1)  
      *Rubik(h, 1, 1) = *TempRubik(h, 1, 1)
      *Rubik(h, 1, 2) = *TempRubik(h, 2, 1)  
      
      *Rubik(h, 2, 0) = *TempRubik(h, 0, 0)
      *Rubik(h, 2, 1) = *TempRubik(h, 1, 0)
      *Rubik(h, 2, 2) = *TempRubik(h, 2, 0)

    Else
      
      *Rubik(h, 0, 2) = *TempRubik(h, 2, 2)  
      *Rubik(h, 1, 2) = *TempRubik(h, 2, 1)
      *Rubik(h, 2, 2) = *TempRubik(h, 2, 0)
      
      *Rubik(h, 0, 1) = *TempRubik(h, 1, 2)  
      *Rubik(h, 1, 1) = *TempRubik(h, 1, 1)
      *Rubik(h, 2, 1) = *TempRubik(h, 1, 0)  
      
      *Rubik(h, 0, 0) = *TempRubik(h, 0, 2)
      *Rubik(h, 1, 0) = *TempRubik(h, 0, 1)
      *Rubik(h, 2, 0) = *TempRubik(h, 0, 0)

    EndIf  
  
  Else  
    If Sens
    
      *Rubik(0, 0, h) = *TempRubik(0, 2, h)  
      *Rubik(0, 1, h) = *TempRubik(1, 2, h)
      *Rubik(0, 2, h) = *TempRubik(2, 2, h)
      
      *Rubik(1, 0, h) = *TempRubik(0, 1, h)  
      *Rubik(1, 1, h) = *TempRubik(1, 1, h)
      *Rubik(1, 2, h) = *TempRubik(2, 1, h)  
      
      *Rubik(2, 0, h) = *TempRubik(0, 0, h)
      *Rubik(2, 1, h) = *TempRubik(1, 0, h)
      *Rubik(2, 2, h) = *TempRubik(2, 0, h) 
      
    Else
    
      *Rubik(0, 2, h) = *TempRubik(2, 2, h)  
      *Rubik(1, 2, h) = *TempRubik(2, 1, h)
      *Rubik(2, 2, h) = *TempRubik(2, 0, h)
      
      *Rubik(0, 1, h) = *TempRubik(1, 2, h)  
      *Rubik(1, 1, h) = *TempRubik(1, 1, h)
      *Rubik(2, 1, h) = *TempRubik(1, 0, h)  
      
      *Rubik(0, 0, h) = *TempRubik(0, 2, h)
      *Rubik(1, 0, h) = *TempRubik(0, 1, h)
      *Rubik(2, 0, h) = *TempRubik(0, 0, h)       

    EndIf
    
  EndIf
  
EndProcedure

Procedure DetacheRotation()
  For x = 0 To 2
    For y = 0 To 2 
      For z = 0 To 2
        If DM_GetParent(*Rubik(x, y, z))
          DM_DetachEntity(*Rubik(x, y, z))
        EndIf  
      Next z
    Next y  
  Next x 
EndProcedure
Procedure ParentRotation(No)
  Select No
    Case #Haut 
      For x = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(x, 2, z), *Pivot(#Haut))
        Next z
      Next x      
    Case #Bas
      For x = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(x, 0, z), *Pivot(#Bas))
        Next z
      Next x  
    Case #Devant
      For x = 0 To 2
        For y = 0 To 2
          DM_EntityParent(*Rubik(x, y, 0), *Pivot(#Devant))
        Next y
      Next x  
    Case #Derriere
      For x = 0 To 2
        For y = 0 To 2
          DM_EntityParent(*Rubik(x, y, 2), *Pivot(#Derriere))
        Next y
      Next x  
    Case #Gauche
      For y = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(0, y, z), *Pivot(#Gauche))
        Next z
      Next y  
    Case #Droit
      For y = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(2, y, z), *Pivot(#Droit))
        Next z
      Next y   
    Case #CentreX
      For y = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(1, y, z), *Pivot(#CentreX))
        Next z
      Next y 
    Case #CentreY 
      For x = 0 To 2
        For z = 0 To 2
          DM_EntityParent(*Rubik(x, 1, z), *Pivot(#CentreY))
        Next z
      Next x  
    Case #CentreZ 
      For x = 0 To 2
        For y = 0 To 2
          DM_EntityParent(*Rubik(x, y, 1), *Pivot(#CentreZ))
        Next y
      Next x               
  EndSelect
EndProcedure
Procedure Rotation(No, S)
  Select No
    Case #Haut 
      DM_TurnEntity(*pivot(#Haut)    , 0, S, 0)
    Case #Bas
      DM_TurnEntity(*pivot(#Bas)     , 0, S, 0)
    Case #Devant
      DM_TurnEntity(*pivot(#Devant)  , 0, 0, S)
    Case #Derriere
      DM_TurnEntity(*pivot(#Derriere), 0, 0, S)
    Case #Gauche
      DM_TurnEntity(*pivot(#Gauche)  , S, 0, 0)
    Case #Droit
      DM_TurnEntity(*pivot(#Droit)   , S, 0, 0)
    Case #CentreX
      DM_TurnEntity(*pivot(#CentreX) , S, 0, 0)
    Case #CentreY 
      DM_TurnEntity(*pivot(#CentreY) , 0, S, 0)
    Case #CentreZ 
      DM_TurnEntity(*pivot(#CentreZ) , 0, 0, S)    
  EndSelect
EndProcedure
Procedure CreateCube(xx, yy, zz)
  Define.CEntity *entity
  DM_EntityFormat(2)
  *entity = DM_CreateMesh(12, 24, 1, #Null)

  Restore Vertex
  For i= 0 To 23
    Read x.f : Read y.f : Read z.f
    Read u.f : Read v.f
    ;Read Rouge : Read Vert : Read bleu
    rouge = 0 : Vert = 0 : Bleu = 0
    ;Couleur dessus
    If yy = 2 And i >=0 And i <=3
      Rouge = 0 : Vert = 0 : bleu = 255
    EndIf
    ;Couleur dessous
    If yy = 0 And i >=4 And i <=7
      Rouge = 255 : Vert = 255 : bleu = 255
    EndIf
    ;Couleur derriere
    If zz = 2 And i >=8 And i <=11
      Rouge = 255 : Vert = 255 : bleu = 0
    EndIf
    ;Couleur devant
    If zz = 0 And i >=12 And i <=15
      Rouge = 255 : Vert = 128 : bleu = 0
    EndIf
    ;Couleur gauche
    If xx = 0 And i >=16 And i <=19
      Rouge = 0 : Vert = 255 : bleu = 0
    EndIf      
    ;Couleur droit
    If xx = 2 And i >=20 And i <=23
      Rouge = 255 : Vert = 0 : bleu = 0
    EndIf  
    ;les coordonnées de vertex
    DM_VertexCoords(*entity, i, x, y, z)
    ;les coordonnées de texture (canal 0)
    DM_VertexTexCoords(*entity, i, 0, u, v)
    DM_VertexTexCoords(*entity, i, 1, u, v)
    ;Couleurs 
    DM_VertexColor(*entity, i, rouge, vert, bleu, 255)    
  Next i
  ;les triangles
  Restore Indice
  For i = 0 To 11
    Read v1.l : Read v2.l : Read v3.l
    DM_VertexTriangle(*entity, i, v1, v2, v3, 0)
  Next i
  ; affecte la brush créee a notre entity
  ;DM_PaintEntity(*entity, *brush, 0)
  ; génératon auto des normales de l'entity créée
  DM_UpdateNormal(*entity)
  ProcedureReturn *entity
EndProcedure
DataSection
Vertex:
; liste des 24 vertex avec leurs coordonnées de textures
;Haut
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f  0.5, 0.5, 0.5, 0, 1
Data.f -0.5, 0.5,-0.5, 1, 0
Data.f  0.5, 0.5,-0.5, 1, 1

;Bas
Data.f -0.5,-0.5, 0.5, 0, 0
Data.f -0.5,-0.5,-0.5, 0, 1
Data.f  0.5,-0.5, 0.5, 1, 0
Data.f  0.5,-0.5,-0.5, 1, 1

;Derrière
Data.f -0.5, 0.5, 0.5, 0, 0
Data.f -0.5,-0.5, 0.5, 0, 1
Data.f  0.5, 0.5, 0.5, 1, 0
Data.f  0.5,-0.5, 0.5, 1, 1

;Devant
Data.f -0.5, 0.5,-0.5, 0, 0
Data.f  0.5, 0.5,-0.5, 0, 1
Data.f -0.5,-0.5,-0.5, 1, 0
Data.f  0.5,-0.5,-0.5, 1, 1

;Gauche
Data.f -0.5, 0.5,-0.5, 0, 0
Data.f -0.5,-0.5,-0.5, 0, 1
Data.f -0.5, 0.5, 0.5, 1, 0
Data.f -0.5,-0.5, 0.5, 1, 1

;Droit
Data.f  0.5, 0.5,-0.5, 0, 0
Data.f  0.5, 0.5, 0.5, 0, 1
Data.f  0.5,-0.5,-0.5, 1, 0
Data.f  0.5,-0.5, 0.5, 1, 1

Indice:
;liste des faces
Data.l  0,  1,  2
Data.l  1,  3,  2
Data.l  4,  5,  6
Data.l  5,  7,  6
Data.l  8,  9, 10
Data.l  9, 11, 10
Data.l 12, 13, 14
Data.l 13, 15, 14
Data.l 16, 17, 18
Data.l 17, 19, 18
Data.l 20, 21, 22
Data.l 21, 23, 22
EndDataSection
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.
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 suis en train de regarder ton code.
J'ai remarqué que en faisant déjà cela

Code : Tout sélectionner

  If Angle < 90
    Rotation(Type, Sens)
    Angle + 1
    ;If Angle = 90
    ;  MiseAjour(Type, Sens)       
    ;EndIf 
  EndIf
les rotations sont respectées. Donc je vais me pencher sur la procedure'MiseAjour()'
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

il est super ce rubick :D

bon j'ai hate de voir le resultat "sans bug" :D

effectivement c'est domage que les couleurs ne garde pas leur position :?
:D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je ne suis pas sûr, je vais faire l'essai, mais il faut sans doute que je redéfinisse à chaque fois la position des cubes par rapport au pivot en cours ?
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.
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 »

En fait lorsque que tu 'Detach' une entity d'un pivot (ou d'une autre entity d'ailleurs),
elle reprend une position absolu, dans ton cas c-à-d zero.

En y pensant, ce n'est pas trop logique, je travaille pour corriger, pour que quand tu detache, l'entity
reste dans la position qui était la sienne par rapport a l'ancien parent ...
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'attends la mise à jour avec impatience, je commençais à devenir fou avec ce bug :)

En attendant je vais préparer la gestion des rotations à la souris, c'est pas le plus simple
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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ce genre de prg est un super test pour les fonctions 3D du moteur , je trouve :D

ça fait bosser Tmyke, mais le résultat sera la :D

c'est un peu le reproche que l'on peut faire a Fred, a propos de la 3D pour Pure, il ne nous a jamais vraiment demandé si nous étions intéressés , et quels fonctions nous aurions voulus

pour le coup Tmyke va griller Ogre pour le purebasic , si il continue :D
et en plus en Français :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Le plus drôle c'est que sur le forum anglais ils n'ont encore rien capté! Pourtant ce n'est pas faute d'essayer de les convaincre... C'est essentiellement dû au problème de traduction, mais je pense que c'est mieux ainsi : continuer à bien perfectionner le moteur avec un petit comité restreint français, avant de le montrer "au monde". Après, si tmyke le veut, on l'aidera pour la traduction :)
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 »

Merci de votre soutien. Pour la communauté Anglosaxonne, ne t'en fait pas djes, avec une
doc traduite une fois termnée, un moteur un peu plus mur, avec les quelques ajout important
a venir (anim B3D et shadows) alors cela viendra naturellement je pense :)

Mais revenons a nos moutons, ou plutot a nos cubes:

J'ai donc commencé a voir pour corriger les défaut liés au pivots:
Pour ce qui est de détacher un élément, le problème se situe dans la
restitution des angle a la suite de la conversion d'Euler. Pour les
positions par contre cela semble bon.

Pour la manip inverse, c-à-d de ré-implenter une entity vers son parent,
la c'est pareil, je me tire les cheveux. Donc c'est une partie a finaliser.
Pour l'instant une fois l'Entity remise sur un parent, les coordonnées
relative sont a zero

J'ai quand meme mis en ligne le dernière version en l'état. Test Comtois
poour voir si déjà cela permet de faire avancer ton code...
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

c'est pire qu'avant, je vois les cubes disparaitre, et ça finit par me planter le pc.

De plus, mon exemple WaterWorld ne fonctionne plus, j'ai une erreur invalid memory access sur cette ligne

Code : Tout sélectionner

NX_CreateStaticElement(*mesh, 10, 0)
J'ai installé les dernières libs, dernières dll , aussi bien du moteur physique que graphique
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.
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, donc retour en arrière pour l'instant, j'ai remis en ligne l'ancienne version...
Force et sagesse...
Répondre