Sphere 3D

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Dr. Dri a écrit :(sauf qu'à la fin j'avais envie de gerber lol)
Désolé :lol:
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.
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Super Comtois ! 8O

Un peu Hypnotique, mais vraiment super. 8)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

http://www.rubiks.com/lvl3/index_lvl3.c ... vl3=clbsol#

la solution, mais moi j'ai jamais regardé, je veux trouver tout seul ! :)
Pas encore réussi :roll:
Est beau ce qui plaît sans concept :)
Speedy Galerie
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici la methode que j'utilise et qui est tres bien decrite la :

http://cyril.webzzanine.net/cube/index.html

sauf pour le dernier mouvement , j'en es trouvé un par moi meme
tres simple a retenir , contrairement a celui qui est donné dans cette methode



tu n'y arrivera jamais tous seul , car cela demande un sacres boulot
d'investigation, et de retenir, les test qui reussissent (dans le deplacement des couleurs) , etde ne pas s'embrouiller au millieu d'une recherche...
:?
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Super balèze la démo que l'on peut "rotationner" :D

13 seconde 57 8O Oh l'autre :)
http://members.chello.nl/r.vanbruchem/Ron_13.57.avi

trouvé sur ce site de fous furieux
http://www.speedcubing.com/

25 seconde 63 d'une main !
http://members.chello.nl/r.vanbruchem/3 ... on-Gyu.wmv
et de la gauche en plus :lol:

Et ce gamin de 6 ans (il a un peu plus de mal car ses mains sont encore trop petites ! )
37 secondes! http://studwww.ugent.be/~snhendri/UlfWong_3789.wmv
Dobro c'est pas possible tu ronffles pendant tes essais :lol:
Est beau ce qui plaît sans concept :)
Speedy Galerie
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Je crois que j'ai trouvé un bug dans ton code

Code : Tout sélectionner

   ;Pole sud 
   *PtrV\px=0
   *PtrV\py=0    
   *PtrV\pz=-1
   CalculNormale
   *PtrV\Couleur=MaCouleur(Random(255),Random(255),Random(255))
   *PtrV\u=0
   *PtrV\v=0
   *PtrV + SizeOf(Vertex)
   
   ;Pole nord
   *PtrV\px=0
   *PtrV\py=0    
   *PtrV\pz=1
  CalculNormale
   *PtrV\Couleur=MaCouleur(Random(255),Random(255),Random(255))
   *PtrV\u=0
   *PtrV\v=0 
Les pôles sont opposés mais ont la même coordonnée de texture
Je serais tenté de dire que le pôle sud est en bas (u = 0 et v = 1)

Dri :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

pour le rubik , je dois sûrement m'y prendre comme un manche , un jour va falloir que je prenne le temps de comprendre comment fonctionne rotateEntity() avec PB :)
on tourne dans les repères de l'entity ? de la scène 3D ? Pourquoi faut-il faire un RotateEntity0,X,0,0) pour tourner sur l'axe des Y de la scène ?
Est-ce que la rotation sur chaque axe est indépendante des autres axes ?
Apparemment non.

Je ne sais pas si c'est un bug , en tout cas , ça ne m'arrange pas :d

Dans le code suivant j'ai un phénomène curieux :
Pour tester , l'ordre d'appui sur les touches est important , c'est une version light de mon code .

Après avoir lancé le programme , il faut appuyer sur la flèche haut du curseur. Le cube va tourner , et la face bleue va s'orienter correctement.
Jusque là tout va bien.

Ensuite si j'appuie sur la flèche droite, le cube va bien tourner autour de l'axe fixe (matérialisé par un cube vert) , et il se place à la bonne position , par contre il tourne sur l'axe X alors que je ne demande pas de rotation en X !
Voila mon problème , il ne devrait pas tourner en X , alors est-ce un bug ou je n'ai rien compris aux fonctionnement des rotations ? ce qui est fort possible.

Et ça c'est un exe qui montre concrètement le but de ce code.
http://perso.wanadoo.fr/comtois/sources/Rubik.exe
Si vous lancez le code , et que vous utilisez les flèches gauche et droite ,la face tourne bien . Par contre si vous utilisez les flèches haut et bas pour faire tourner la face de droite , et qu'ensuite vous utilisez les flèches gauche et droite , on retrouve le problème de rotation en X.

J'ai une version plus complète en cours ,il est maintenant possible de tourner dans tous les sens , mais toujours avec mon erreur de rotation en X :?

Code : Tout sélectionner

;- Initialisation
If InitEngine3D() = 0
 MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
 End
EndIf

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse()=0
 MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
 End
ElseIf OpenScreen( 800 , 600 , 32 , "M3D_Matrix3D" ) = 0
 MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
 End
EndIf
Structure Vertex
px.f
py.f
pz.f
nx.f
ny.f
nz.f
co.l
tu.f
tv.f
EndStructure

Structure Face
  p1.w
  p2.w
  p3.w
  p4.w
  p5.w
  p6.w
EndStructure
Structure s_Cube
  No.l
EndStructure
Structure s_Angle
  AngleX.f
  AngleY.f
  AngleZ.f
EndStructure
Macro MaCouleur(Rouge,Vert,Bleu)
  Rouge << 16 + Vert << 8 + Bleu
EndMacro

;-Texture
For i = 0 To 2
CreateTexture(i,64,64)
StartDrawing(TextureOutput(i))
Box(0,0,64,64,$111111)
If i = 0
  Box(1,1,62,62,$FFFFFF)
ElseIf i=1
  Box(1,1,62,62,$FF)
Else
  Box(1,1,62,62,$00FF00)
EndIf
StopDrawing()
;-Material
CreateMaterial(i,TextureID(i))
Next i
MaterialAmbientColor(0,-1)




;-Entity
Global Taille=50
Global AngleX.f,AngleY.f,AngleZ.f
Global Dim Entity.s_Angle(26)

;Création de 3 entitys
;L'entity 0 est mobile
;Les entitys 1 et 2 sont fixes , elles servent de repère
No=0
z = 1
y = 2
x = 2

For r = 0 To 2
  *Ptr.Vertex=AllocateMemory(SizeOf(Vertex)*24)
  CopyMemory(?Vertices,*Ptr,SizeOf(Vertex)*24)
  CreateMesh(No,10)
  ;Couleur dessus
  *Mem.Vertex = *Ptr
  For i = 0 To 3
    *Mem\co=MaCouleur(0,0,255)
    *Mem + SizeOf(Vertex)
  Next i 
  ;Couleur dessous
  *Mem.Vertex = *Ptr + 4 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=MaCouleur(255,255,255)
    *Mem + SizeOf(Vertex)
  Next i 
  ;Couleur devant
  *Mem.Vertex = *Ptr + 8 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=MaCouleur(255,255,0)
    *Mem + SizeOf(Vertex)
  Next i 
  ;Couleur derriere
  *Mem.Vertex = *Ptr + 12 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=MaCouleur(255,128,0)
    *Mem + SizeOf(Vertex)
  Next i 
  ;Couleur gauche
  *Mem.Vertex = *Ptr + 16 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=MaCouleur(0,255,0)
    *Mem + SizeOf(Vertex)
  Next i 
  ;Couleur droit
  *Mem.Vertex = *Ptr + 20 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=MaCouleur(255,0,0)
    *Mem + SizeOf(Vertex)
  Next i 
  SetMeshData(No, #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate , *Ptr,24) 
  SetMeshData(No,#PB_Mesh_Face,?Triangles,12)
  CreateEntity(No,MeshID(No),MaterialID(r))
  ScaleEntity(No,Taille - 1,Taille - 1,Taille - 1)
  EntityLocate(No, x * Taille , y * Taille , z * Taille)
  No+1
Next r
;Fixe la position des repères
EntityLocate(1, 2 * Taille , 1 * Taille , 1 * Taille)
EntityLocate(2, 1 * Taille , 1 * Taille , 2 * Taille)


;-Camera
CreateCamera(0,0,0,100,100)
CameraBackColor(0,RGB(0,0,255))
AmbientColor(RGB(200,200,200))
CameraLocate(0,EntityX(Centre) + 250 ,EntityY(Centre)+ 250,EntityZ(Centre))
MoveCamera(0,0,40,350)
CameraLookAt(0,EntityX(Centre),EntityY(Centre),EntityZ(Centre))


Macro CosDeg(Angle)
   Cos((Angle) * 0.0174533)
EndMacro
Macro SinDeg(Angle)
  Sin((Angle) * 0.0174533)
EndMacro
Repeat
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Right)
      Repeat
        Entity(0)\AngleZ + 1
        AngleZ + 1
        RotateEntity(0,Entity(0)\AngleX,Entity(0)\AngleY,Entity(0)\AngleZ)  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<< Pas d'angle X
        EntityLocate(0,50 - SinDeg(AngleZ-90)*Taille,50+CosDeg(AngleZ-90)*Taille,EntityZ(0))
        RenderWorld()
        FlipBuffers()
      Until AngleZ >= 90
      AngleZ = 0
    ElseIf KeyboardReleased(#PB_Key_Up)
        Repeat
          Entity(0)\AngleY + 1
          AngleY + 1
          RotateEntity(0,Entity(0)\AngleX,Entity(0)\AngleY,Entity(0)\AngleZ) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<< Pas d'angle X
          EntityLocate(0,EntityX(0),50+CosDeg(AngleY)*Taille,50+SinDeg(AngleY)*Taille)
          RenderWorld()
          FlipBuffers()
        Until AngleY >= 90
        AngleY=0
    EndIf
  EndIf
  RenderWorld()
  StartDrawing(ScreenOutput())
  DrawText(0,0,"EntityAngleX(0) = " + StrF(EntityAngleX(0),2))
  DrawText(0,20,"Entity(0)\AngleX = " + StrF(Entity(0)\AngleX,2))
  DrawText(0,60,"pourquoi EntityAngleX(0) change , alors que je ne fais pas de rotation en X ? ")
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

DataSection
Vertices:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,1

Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,1

Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,0

;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,0

Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,0

;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,0

Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,1

Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,1

Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,0

;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,0

Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,1

Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,1

Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,0

;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 0,0

Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 0,1

Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 1,0

;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 1,1

Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 1,0

Triangles:
;0 à 3
Data.w 2,1,0
Data.w 0,3,2
;4 à 7
Data.w 6,5,4
Data.w 4,7,6
;8 à 11
Data.w 10,9,8
Data.w 8,11,10
;12 à 15
Data.w 14,13,12
Data.w 12,15,14
;16 à 19
Data.w 18,17,16
Data.w 16,19,18
;20 à 23
Data.w 22,21,20
Data.w 20,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.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Bravo, c'est un excellent début :10:
j'ai hâte de pouvoir en faire une partie. :D
Répondre