Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Projet d'un Rubik's cube en 3D | |
|
+7mindstorm Jack Jean Claude silverman Marc jjn4 Minibug 11 participants | |
Auteur | Message |
---|
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Projet d'un Rubik's cube en 3D Ven 30 Sep 2022 - 14:30 | |
| Bonjour à tous !
@Mindstorm
La position d’un objet 3d est donnée par les fonctions : o3d_x_position(N) o3d_y_position(N) o3d_z_position(N)
et pour les angles de rotation de l’objet 3d autour de ses axes : o3d_x_rotate(N) o3d_y_rotate(N) o3d_z_rotate(N)
Je vais jeter un œil sur ton code pour le 3d_chain_break…
Quelques annotations à vérifier que j’avais faites : - Lors d’un 3D_CHAIN_BREAK, l’objet 3d reprend ses anciennes coordonnées d’avant le 3D_CHAIN. - Les fonctions o3d… retournent uniquement les coordonnées d’avant le 3D_CHAIN.
Bonne continuation ! | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Ven 30 Sep 2022 - 16:37 | |
| Merci Marc - Marc a écrit:
- Quelques annotations à vérifier que j’avais faites :
- Lors d’un 3D_CHAIN_BREAK, l’objet 3d reprend ses anciennes coordonnées d’avant le 3D_CHAIN. - Les fonctions o3d… retournent uniquement les coordonnées d’avant le 3D_CHAIN. Je pense que c'est le 3d_mesh qui coince avec le 3d_breack_chain et ce serai un bug pour Jack Je vais tester tes opérateurs et au pire je fais un tableau de donnés mais ce serait moins propre. Tiens nous au courant de tes avancées | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Projet d'un Rubik's cube en 3D Ven 30 Sep 2022 - 18:15 | |
| Réponse à la question de Mindstorm dans le post du 30/09/2022 de 13:20. - Mindstorm a écrit:
- Quelqu'un peut il me dire pourquoi 3d_chain_breack ne fonctionne pas dans mon code?
Je viens des essais. Je n'ai pas trouvé d'anomalie dans ton code. Effectivement, la commande 3d_chain_break ne rompt pas le chaînage initial entre le mesh et le cube. | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Ven 30 Sep 2022 - 18:28 | |
| C'est encore plus parlant avec un bout de code le cube reste maitre du mesh même avec le 3d_chain_breack Heureusement avec tes commandes je vais gagner pas mal de temps pour identifier les faces à faire tourner Si Jack passe par là et qu'il a un peut de temps? Mais ce n'est pas très grave - Code:
-
scene3d 1 form 2:Left 2,600:height 2,800:top 2,0:width 2,70 full_space 1 cam_position 10,10,10 dim i%,j%,x,y,z,d,c,r,cub,mesh print_target_is 2 triedre()
mesh=151 :cub=150 3d_mesh mesh 3d_load_object mesh,"cube.3ds" 3d_load_texture mesh, "cube.bmp" rem constructioncube() 3d_cube cub,0.1
wait 1000 x=0:y=0:z=0 r=1 3d_chain cub,mesh for i%=1 to 3 z=r*30*i% 3d_rotate cub,x,y,z wait 300 next i% print "cub" print o3d_x_rotate (cub) print o3d_y_rotate (cub) print o3d_z_rotate (cub) print "mesh" print o3d_x_rotate (mesh) print o3d_y_rotate (mesh) print o3d_z_rotate (mesh) 3d_chain_break cub,mesh
print "breack"
wait 1000
r=1 for i%=1 to 3 x=r*30*i% 3d_rotate cub,x,y,z wait 300 next i% print "cub" print o3d_x_rotate (cub) print o3d_y_rotate (cub) print o3d_z_rotate (cub) print "mesh" print o3d_x_rotate (mesh) print o3d_y_rotate (mesh) print o3d_z_rotate (mesh)
end '___________________________________________________________________________
sub rotationprogressive() for i%=1 to 3 z=r*30*i% 3d_rotate d+1,x,y,z 3d_rotate d+2,x,y,z 3d_rotate d+3,x,y,z 3d_rotate d+4,x,y,z 3d_rotate d+5,x,y,z 3d_rotate d+6,x,y,z 3d_rotate d+7,x,y,z 3d_rotate d+8,x,y,z 3d_rotate d+9,x,y,z wait 300 next i% end_sub '___________________________________________________________________________ sub constructionmesh() for j%=1 to 9 for i%=1 to 3 mesh=(100*i%)+j% 3d_mesh mesh 3d_load_object mesh,"cube.3ds" 3d_load_texture mesh, "cube.bmp" next i% next j% end_sub '__________________________________________________________________________ sub constructioncube() for j%=1 to 9 for i%=1 to 3 cub=(10*i%)+j% 3d_cube cub,1 next i% next j% end_sub '_________________________________________________________________________ sub chainage() for j%=1 to 9 for i%=1 to 3 cub=(i%*10)+j% mesh=(i%*100)+j% 3d_chain cub,mesh next i% next j% end_sub '_________________________________________________________________________ sub positionmesh() for j%=1 to 3 z=2.01*(2-j%) c=j%*100 3d_position c+1,0,0,z 3d_position c+2,0,2.01,z 3d_position c+3,0,-2.01,z 3d_position c+4,2.01,0,z 3d_position c+5,2.01,2.01,z 3d_position c+06,2.01,-2.01,z 3d_position c+7,-2.01,0,z 3d_position c+8,-2.01,2.01,z 3d_position c+9,-2.01,-2.01,z next j% end_sub '_________________________________________________________________________ sub triedre() 3d_cube 1,1 :3d_scale 1,12,0.1,0.1 3d_cube 2,1 :3d_scale 2,0.1,12,0.1 3d_cube 3,1 :3d_scale 3,0.1,0.1,12 3d_cone 4,.8,.3 :3d_x_position 4,6 :3d_z_rotate 4,-90 3d_cone 5,.8,.3 :3d_y_position 5,6 3d_cone 6,.8,.3 :3d_z_position 6,6 :3d_x_rotate 6,-90 3d_text 7,"X" : 3d_x_position 7,6.5 3d_text 8,"Y" : 3d_y_position 8,6.5 3d_text 9,"Z" : 3d_z_position 9,7.1 :3d_y_rotate 9,90 end_sub
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Projet d'un Rubik's cube en 3D Ven 30 Sep 2022 - 22:25 | |
| @Mindstorm
Sur mon prototype de Rubik’s Cube, je ne remarque pas de dysfonctionnement de l’instruction 3d_chain_break.
Comme pour toi, ma construction repose sur l’assemblage de 27 MESHs. Le MESH central, qui n’est pas visible puisqu'il qu'il est masqué par les autres MESHs, sert de maître.
Je chaîne la couronne à faire pivoter au MESH central et je ne fais tourner que l’unique MESH central. Il entraîne les 9 autres cubes sans problème. Je romps les chaînages pour chainer une autre couronne sur le MESH central, puis la faire tourner, toujours sans anomalie.
Autrement, suite à ces constatations :
- Lorsque l’on rompt un chaînage, les cubes chaînés reprennent leur position d’avant chaînage.
- Les six fonctions O3D… ne retournent que les valeurs d’avant chaînage.
J’ai mappé le cube dans un tableau « cube%(27) ». J’ai créé un tableau à deux dimensions « cubePosition%(27,6) » dans lequel je placerai manuellement les 6 valeurs O3D… pour chaque cube en fonction des modifications d’emplacement.
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 1:24 | |
| J’ai mis mon Rubik’s Cube de travail ici : https://e-nautia.com/yoda/disk/Panoramic/Rubik_s_Cube/Cube_v6.zipLe programme affiche 3 fenêtres : 1)- La vue 3d du Rubik’s Cube. Un cliquer-déplacer permet d’orienter le cube pour observer une face cachée. 2)- Un panneau de contrôle pour effectuer toutes les rotations possibles sur un Rubik’s cube. Le sens de rotation choisi est anti-trigonométrique. Après chaque rotation, il est impératif de revenir au point de départ sous peine d’obtenir un joli caléidoscope. Par exemple, si vous tournez la face bleue de 270°, il faudra la remettre à sa place en cliquant sur -270° avant d’opérer la rotation d’une autre face. 3)- Un panneau de commande pour cacher un ou plusieurs cubes. Ceci permet d’observer le comportement du cube central (qui porte le numéro 14). Le "Mindstorm’s Triède" peut être également caché. Le code-source est commenté. La partie « rotation » est en fin de code. Elle est composée de 6 petits sous-programmes : un par face. Ces SUBs reçoivent en paramètre l’angle de rotation à effectuer. Ce programme est en cours de développement. Il n’est pas achevé. Il est mis à disposition pour comprendre et tester les commandes 3D appliquées sur un Rubik’s Cube. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 7:03 | |
| Bonjour à tous ! Belle progression Marc ! Très pratique ton système de débogage... Félicitation pour le résultat même si tu es encore loin d'avoir fini. Je n'aurai jamais été capable d'en faire autant ! Vraiment bravo pour ces premiers résultats ! | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 9:09 | |
| super travail Marc Cela confirme mon analyse, il y a probablement un problème au chainage dé-chainage quand on mélange objet natif et mesh. Je suis contant que tu n’emploie pas la même voie que moi et si sylverman ou Minibug veulent participer, j'ai trouvé une autre solution sans chainage cette nuit. Il suffit de soumettre le déplacement et la rotation directement au cube. Cette voie est accessible aux codeurs...
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 10:12 | |
| Bonjour Mindstorm, - Mindstorm a écrit:
- si sylverman ou Minibug veulent participer, j'ai trouvé une autre solution sans chainage cette nuit.
Non j'ai définitivement abandonné l'idée. Je n'ai pas le niveau pour ce projet ! Je ne maitrise ni la 3D ni les fonctions trigonométriques. Cela dit, je suis le sujet avec beaucoup d'attention et je vois que Marc progresse bien ! | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 10:30 | |
| Salut à tous ! - Mindstorm a écrit:
- Il suffit de soumettre le déplacement et la rotation directement au cube.
Je pense que tu veux faire tourner simultanément chaque petit cube élémentaire d’une face en leur appliquant une série de formules mathématiques ? Si c’est le cas, voici une ébauche d’une version que j'avais faite où il n’y a pas de chaînage. Si cela peut t’aider… - Code:
-
' Debug Rubik's cube dim cube%(27)
label rouge90, bleu90, vert90, jaune90, orange90, blanc90 label rouge180, bleu180, vert180, jaune180, orange180, blanc180 label rouge270, bleu270, vert270, jaune270, orange270, blanc270 label rouge_90, bleu_90, vert_90, jaune_90, orange_90, blanc_90 label rouge_180, bleu_180, vert_180, jaune_180, orange_180, blanc_180 label rouge_270, bleu_270, vert_270, jaune_270, orange_270, blanc_270 label orienterCube, quitter
degrees
interfaceGraphique3D() creerPanneauControle()
end ' ------------------------------------------------------------------------------ orienterCube: off_mouse_down 1
while mouse_left_up(1) = 0 ' déplacement de la caméra en x cam_x_position cos(mouse_x_position(1))*12 cam_z_position sin(mouse_x_position(1))*12 ' déplacement de la caméra en y cam_y_position int(mouse_y_position(1)/20)-12 end_while
on_mouse_down 1,orienterCube return ' ------------------------------------------------------------------------------ sub interfaceGraphique3D() dim_local i%
' créer la fenêtre principale width 0,width(0) - width_client(0) + 500 height 0,height(0) - height_client(0) + 500
' créer la scène 3d scene3d 1 width 1,500 height 1,500 color 1,20,20,20 ' placement de la caméra cam_position 8,8,8 ' création des 27 cubes texturés for i% = 1 TO 27 3d_mesh i% 3d_load_object i%,"cube.3ds" 3d_load_texture i%,str$(i%)+"DebugCube.bmp" next i%
' disposition des cubes dans les différentes tranches ' avant centre arrière ' 1 2 3 10 11 12 19 20 21 ' 4 5 6 13 14 15 22 23 24 ' 7 8 9 16 17 18 25 26 27
' tranche avant 3d_position 1,-2,2,2 3d_position 2,0,2,2 3d_position 3,2,2,2 3d_position 4,-2,0,2 3d_position 5,0,0,2 3d_position 6,2,0,2 3d_position 7,-2,-2,2 3d_position 8,0,-2,2 3d_position 9,2,-2,2
' tranche centrale 3d_position 10,-2,2,0 3d_position 11,0,2,0 3d_position 12,2,2,0 3d_position 13,-2,0,0 3d_position 14,0,0,0 3d_position 15,2,0,0 3d_position 16,-2,-2,0 3d_position 17,0,-2,0 3d_position 18,2,-2,0 ' tranche arrière 3d_position 19,-2,2,-2 3d_position 20,0,2,-2 3d_position 21,2,2,-2 3d_position 22,-2,0,-2 3d_position 23,0,0,-2 3d_position 24,2,0,-2 3d_position 25,-2,-2,-2 3d_position 26,0,-2,-2 3d_position 27,2,-2,-2
' mappage des positions des cubes for i% = 1 to 27 cube%(i%) = i% next i%
on_mouse_down 1,orienterCube end_sub ' ------------------------------------------------------------------------------ sub creerPanneauControle() form 100 width 100,width(100) - width_client(100) + 320 height 100,height(100) - height_client(100) + 320 left 100,705 top 100,380 caption 100,"Panneau de contrôle" color 100,20,20,20 on_close 100,quitter
image 150 creerBoutons() serigraphieBoutons() end_sub ' ------------------------------------------------------------------------------ sub creerBoutons() dim_local i%, left_position% command_target_is 100 ' modèle bouton picture 136 width 136,50 height 136,50 top 136,260 left 136,260 color 136,0,0,1 2d_target_is 136 ' bords noirs arrondis 2d_line 8,3,42,3 2d_line 42,4,44,4 2d_point 44,5 2d_line 45,6,45,8 2d_line 46,8,46,42 2d_line 45,42,45,44 2d_point 44,44 2d_line 42,45,44,45 2d_line 8,46,42,46 2d_line 6,45,8,45 2d_point 5,44 2d_line 4,42,4,44 2d_line 3,8,3,42 2d_line 4,6,4,8 2d_point 5,5 2d_line 6,4,8,4
2d_flood 20,20,255,255,255 2d_image_copy 150,0,0,50,50
' boutons rouges left_position% = 10 for i% = 101 to 106 picture i% width i%,50 height i%,50 top i%,10 left i%,left_position% 2d_target_is i% 2d_image_paste 150,0,0 2d_flood 20,20,232,40,40 left_position% = left_position% + 50 next i%
' boutons verts left_position% = 10 for i% = 107 to 112 picture i% width i%,50 height i%,50 top i%,60 left i%,left_position% 2d_target_is i% 2d_image_paste 150,0,0 2d_flood 20,20,40,232,40 left_position% = left_position% + 50 next i%
' boutons bleus left_position% = 10 for i% = 113 to 118 picture i% width i%,50 height i%,50 top i%,110 left i%,left_position% 2d_target_is i% 2d_image_paste 150,0,0 2d_flood 20,20,40,40,232 left_position% = left_position% + 50 next i%
' boutons oranges left_position% = 10 for i% = 119 to 124 picture i% width i%,50 height i%,50 top i%,160 left i%,left_position% 2d_target_is i% 2d_image_paste 150,0,0 2d_flood 20,20,232,127,40 left_position% = left_position% + 50 next i%
' boutons jaunes left_position% = 10 for i% = 125 to 130 picture i% width i%,50 height i%,50 top i%,210 left i%,left_position% 2d_target_is i% 2d_image_paste 150,0,0 2d_flood 20,20,245,245,0 left_position% = left_position% + 50 next i%
' boutons blancs left_position% = 10 for i% = 131 to 135 picture i% width i%,50 height i%,50 top i%,260 left i%,left_position% 2d_target_is i% 2d_image_paste 150,0,0 2d_flood 20,20,255,255,255 left_position% = left_position% + 50 next i%
on_click 101,rouge_270 on_click 102,rouge_180 on_click 103,rouge_90 on_click 104,rouge90 on_click 105,rouge180 on_click 106,rouge270 on_click 107,vert_270 on_click 108,vert_180 on_click 109,vert_90 on_click 110,vert90 on_click 111,vert180 on_click 112,vert270 on_click 113,bleu_270 on_click 114,bleu_180 on_click 115,bleu_90 on_click 116,bleu90 on_click 117,bleu180 on_click 118,bleu270 on_click 119,orange_270 on_click 120,orange_180 on_click 121,orange_90 on_click 122,orange90 on_click 123,orange180 on_click 124,orange270 on_click 125,jaune_270 on_click 126,jaune_180 on_click 127,jaune_90 on_click 128,jaune90 on_click 129,jaune180 on_click 130,jaune270 on_click 131,blanc_270 on_click 132,blanc_180 on_click 133,blanc_90 on_click 134,blanc90 on_click 135,blanc180 on_click 136,blanc270 command_target_is 0 end_sub ' ------------------------------------------------------------------------------ sub serigraphieBoutons() dim_local colonne%, num_objet%
num_objet% = 101 for colonne% = 1 to 6 print_target_is num_objet% 2d_target_is num_objet% 2d_fill_color color_pixel_red(num_objet%,25,25),color_pixel_green(num_objet%,25,25),color_pixel_blue(num_objet%,25,25) font_name num_objet%,"Arial" font_size num_objet%,11 print_locate 8,16 print "-270°" num_objet% = num_objet% + 6 next colonne%
num_objet% = 102 for colonne% = 1 to 6 print_target_is num_objet% 2d_target_is num_objet% 2d_fill_color color_pixel_red(num_objet%,25,25),color_pixel_green(num_objet%,25,25),color_pixel_blue(num_objet%,25,25) font_name num_objet%,"Arial" font_size num_objet%,11 print_locate 8,16 print "-180°" num_objet% = num_objet% + 6 next colonne%
num_objet% = 103 for colonne% = 1 to 6 print_target_is num_objet% 2d_target_is num_objet% 2d_fill_color color_pixel_red(num_objet%,25,25),color_pixel_green(num_objet%,25,25),color_pixel_blue(num_objet%,25,25) font_name num_objet%,"Arial" font_size num_objet%,11 print_locate 12,16 print "-90°" num_objet% = num_objet% + 6 next colonne%
num_objet% = 104 for colonne% = 1 to 6 print_target_is num_objet% 2d_target_is num_objet% 2d_fill_color color_pixel_red(num_objet%,25,25),color_pixel_green(num_objet%,25,25),color_pixel_blue(num_objet%,25,25) font_name num_objet%,"Arial" font_size num_objet%,11 print_locate 15,16 print "90°" num_objet% = num_objet% + 6 next colonne%
num_objet% = 105 for colonne% = 1 to 6 print_target_is num_objet% 2d_target_is num_objet% 2d_fill_color color_pixel_red(num_objet%,25,25),color_pixel_green(num_objet%,25,25),color_pixel_blue(num_objet%,25,25) font_name num_objet%,"Arial" font_size num_objet%,11 print_locate 11,16 print "180°" num_objet% = num_objet% + 6 next colonne%
num_objet% = 106 for colonne% = 1 to 6 print_target_is num_objet% 2d_target_is num_objet% 2d_fill_color color_pixel_red(num_objet%,25,25),color_pixel_green(num_objet%,25,25),color_pixel_blue(num_objet%,25,25) font_name num_objet%,"Arial" font_size num_objet%,11 print_locate 11,16 print "270°" num_objet% = num_objet% + 6 next colonne% end_sub ' ------------------------------------------------------------------------------ rouge90: inactive 0 : inactive 100 rotationFaceRouge(-90) active 0 : active 100 return ' ------------------------------------------------------------------------------ bleu90: inactive 0 : inactive 100 rotationFaceBleue(-90) active 0 : active 100 return ' ------------------------------------------------------------------------------ vert90: inactive 0 : inactive 100 rotationFaceVerte(90) active 0 : active 100 return ' ------------------------------------------------------------------------------ jaune90: inactive 0 : inactive 100 rotationFaceJaune(90) active 0 : active 100 return ' ------------------------------------------------------------------------------ orange90: inactive 0 : inactive 100 rotationFaceOrange(90) active 0 : active 100 return ' ------------------------------------------------------------------------------ blanc90: inactive 0 : inactive 100 rotationFaceBlanche(-90) active 0 : active 100 return ' ------------------------------------------------------------------------------ rouge180: inactive 0 : inactive 100 rotationFaceRouge(-180) active 0 : active 100 return ' ------------------------------------------------------------------------------ bleu180: inactive 0 : inactive 100 rotationFaceBleue(-180) active 0 : active 100 return ' ------------------------------------------------------------------------------ vert180: inactive 0 : inactive 100 rotationFaceVerte(180) active 0 : active 100 return ' ------------------------------------------------------------------------------ jaune180: inactive 0 : inactive 100 rotationFaceJaune(180) active 0 : active 100 return ' ------------------------------------------------------------------------------ orange180: inactive 0 : inactive 100 rotationFaceOrange(180) active 0 : active 100 return ' ------------------------------------------------------------------------------ blanc180: inactive 0 : inactive 100 rotationFaceBlanche(-180) active 0 : active 100 return ' ------------------------------------------------------------------------------ rouge270: inactive 0 : inactive 100 rotationFaceRouge(-270) active 0 : active 100 return ' ------------------------------------------------------------------------------ bleu270: inactive 0 : inactive 100 rotationFaceBleue(-270) active 0 : active 100 return ' ------------------------------------------------------------------------------ vert270: inactive 0 : inactive 100 rotationFaceVerte(270) active 0 : active 100 return ' ------------------------------------------------------------------------------ jaune270: inactive 0 : inactive 100 rotationFaceJaune(270) active 0 : active 100 return ' ------------------------------------------------------------------------------ orange270: inactive 0 : inactive 100 rotationFaceOrange(270) active 0 : active 100 return ' ------------------------------------------------------------------------------ blanc270: inactive 0 : inactive 100 rotationFaceBlanche(-270) active 0 : active 100 return ' ------------------------------------------------------------------------------ rouge_90: inactive 0 : inactive 100 rotationFaceRouge(90) active 0 : active 100 return ' ------------------------------------------------------------------------------ bleu_90: inactive 0 : inactive 100 rotationFaceBleue(90) active 0 : active 100 return ' ------------------------------------------------------------------------------ vert_90: inactive 0 : inactive 100 rotationFaceVerte(-90) active 0 : active 100 return ' ------------------------------------------------------------------------------ jaune_90: inactive 0 : inactive 100 rotationFaceJaune(-90) active 0 : active 100 return ' ------------------------------------------------------------------------------ orange_90: inactive 0 : inactive 100 rotationFaceOrange(-90) active 0 : active 100 return ' ------------------------------------------------------------------------------ blanc_90: inactive 0 : inactive 100 rotationFaceBlanche(90) active 0 : active 100 return ' ------------------------------------------------------------------------------ rouge_180: inactive 0 : inactive 100 rotationFaceRouge(180) active 0 : active 100 return ' ------------------------------------------------------------------------------ bleu_180: inactive 0 : inactive 100 rotationFaceBleue(180) active 0 : active 100 return ' ------------------------------------------------------------------------------ vert_180: inactive 0 : inactive 100 rotationFaceVerte(-180) active 0 : active 100 return ' ------------------------------------------------------------------------------ jaune_180: inactive 0 : inactive 100 rotationFaceJaune(-180) active 0 : active 100 return ' ------------------------------------------------------------------------------ orange_180: inactive 0 : inactive 100 rotationFaceOrange(-180) active 0 : active 100 return ' ------------------------------------------------------------------------------ blanc_180: inactive 0 : inactive 100 rotationFaceBlanche(180) active 0 : active 100 return ' ------------------------------------------------------------------------------ rouge_270: inactive 0 : inactive 100 rotationFaceRouge(270) active 0 : active 100 return ' ------------------------------------------------------------------------------ bleu_270: inactive 0 : inactive 100 rotationFaceBleue(270) active 0 : active 100 return ' ------------------------------------------------------------------------------ vert_270: inactive 0 : inactive 100 rotationFaceVerte(-270) active 0 : active 100 return ' ------------------------------------------------------------------------------ jaune_270: inactive 0 : inactive 100 rotationFaceJaune(-270) active 0 : active 100 return ' ------------------------------------------------------------------------------ orange_270: inactive 0 : inactive 100 rotationFaceOrange(-270) active 0 : active 100 return ' ------------------------------------------------------------------------------ blanc_270: inactive 0 : inactive 100 rotationFaceBlanche(270) active 0 : active 100 return ' ------------------------------------------------------------------------------ sub rotationFaceRouge(r%) dim_local angleDepart%, angleStop%, sensRotation% ' Le centre de la face est ROUGE
' on détermine les sens de rotation if r% < 0 sensRotation% = -1 else sensRotation% = 1 end_if angleDepart% = o3d_x_rotate(13) angleStop% = angleDepart% + r% for r% = angleDepart% to angleStop% step sensRotation%
3d_x_rotate 13,r% :' centre rouge
3d_x_rotate 19,r% 3d_z_position 19,sqr(8)*cos(135+r%) 3d_y_position 19,sqr(8)*sin(135+r%)
3d_x_rotate 10,r% 3d_z_position 10,2*cos(90+r%) 3d_y_position 10,2*sin(90+r%)
3d_x_rotate 1,r% 3d_z_position 1,sqr(8)*cos(45+r%) 3d_y_position 1,sqr(8)*sin(45+r%)
3d_x_rotate 4,r% 3d_z_position 4,2*cos(r%) 3d_y_position 4,2*sin(r%)
3d_x_rotate 7,r% 3d_z_position 7,sqr(8)*cos(-45+r%) 3d_y_position 7,sqr(8)*sin(-45+r%)
3d_x_rotate 16,r% 3d_z_position 16,2*cos(-90+r%) 3d_y_position 16,2*sin(-90+r%)
3d_x_rotate 25,r% 3d_z_position 25,sqr(8)*cos(-135+r%) 3d_y_position 25,sqr(8)*sin(-135+r%)
3d_x_rotate 22,r% 3d_z_position 22,2*cos(-180+r%) 3d_y_position 22,2*sin(-180+r%)
pause 5 next r% end_sub ' ------------------------------------------------------------------------------ sub rotationFaceBleue(r%) dim_local angleDepart%, angleStop%, sensRotation% ' Le centre de la face est BLEU
' on détermine les sens de rotation if r% < 0 sensRotation% = -1 else sensRotation% = 1 end_if angleDepart% = o3d_z_rotate(5) angleStop% = angleDepart% + r% for r% = angleDepart% to angleStop% step sensRotation%
3d_z_rotate 5,r% :' centre bleu
3d_z_rotate 1,r% 3d_x_position 1,sqr(8)*cos(135+r%) 3d_y_position 1,sqr(8)*sin(135+r%)
3d_z_rotate 2,r% 3d_x_position 2,2*cos(90+r%) 3d_y_position 2,2*sin(90+r%)
3d_z_rotate 3,r% 3d_x_position 3,sqr(8)*cos(45+r%) 3d_y_position 3,sqr(8)*sin(45+r%)
3d_z_rotate 6,r% 3d_x_position 6,2*cos(r%) 3d_y_position 6,2*sin(r%)
3d_z_rotate 9,r% 3d_x_position 9,sqr(8)*cos(-45+r%) 3d_y_position 9,sqr(8)*sin(-45+r%)
3d_z_rotate 8,r% 3d_x_position 8,2*cos(-90+r%) 3d_y_position 8,2*sin(-90+r%)
3d_z_rotate 7,r% 3d_x_position 7,sqr(8)*cos(-135+r%) 3d_y_position 7,sqr(8)*sin(-135+r%)
3d_z_rotate 4,r% 3d_x_position 4,2*cos(-180+r%) 3d_y_position 4,2*sin(-180+r%)
pause 5 next r% end_sub ' ------------------------------------------------------------------------------ sub rotationFaceOrange(r%) dim_local angleDepart%, angleStop%, sensRotation% ' Le centre de la face est ORANGE
' on détermine les sens de rotation if r% < 0 sensRotation% = -1 else sensRotation% = 1 end_if angleDepart% = o3d_x_rotate(15) angleStop% = angleDepart% + r% for r% = angleDepart% to angleStop% step sensRotation%
3d_x_rotate 15,r% :' centre orange
3d_x_rotate 3,r% 3d_z_position 3,sqr(8)*cos(135+r%) 3d_y_position 3,sqr(8)*sin(135+r%)
3d_x_rotate 12,r% 3d_z_position 12,2*cos(90+r%) 3d_y_position 12,2*sin(90+r%)
3d_x_rotate 21,r% 3d_z_position 21,sqr(8)*cos(45+r%) 3d_y_position 21,sqr(8)*sin(45+r%)
3d_x_rotate 24,r% 3d_z_position 24,2*cos(r%) 3d_y_position 24,2*sin(r%)
3d_x_rotate 27,r% 3d_z_position 27,sqr(8)*cos(-45+r%) 3d_y_position 27,sqr(8)*sin(-45+r%)
3d_x_rotate 18,r% 3d_z_position 18,2*cos(-90+r%) 3d_y_position 18,2*sin(-90+r%)
3d_x_rotate 9,r% 3d_z_position 9,sqr(8)*cos(-135+r%) 3d_y_position 9,sqr(8)*sin(-135+r%)
3d_x_rotate 6,r% 3d_z_position 6,2*cos(-180+r%) 3d_y_position 6,2*sin(-180+r%)
pause 5 next r% end_sub ' ------------------------------------------------------------------------------ sub rotationFaceVerte(r%) dim_local angleDepart%, angleStop%, sensRotation% ' Le centre de la face est VERTE
' on détermine les sens de rotation if r% < 0 sensRotation% = -1 else sensRotation% = 1 end_if angleDepart% = o3d_z_rotate(23) angleStop% = angleDepart% + r% for r% = angleDepart% to angleStop% step sensRotation%
3d_z_rotate 23,r% :' centre vert
3d_z_rotate 21,r% 3d_x_position 21,sqr(8)*cos(135+r%) 3d_y_position 21,sqr(8)*sin(135+r%)
3d_z_rotate 20,r% 3d_x_position 20,2*cos(90+r%) 3d_y_position 20,2*sin(90+r%)
3d_z_rotate 19,r% 3d_x_position 19,sqr(8)*cos(45+r%) 3d_y_position 19,sqr(8)*sin(45+r%)
3d_z_rotate 22,r% 3d_x_position 22,2*cos(r%) 3d_y_position 22,2*sin(r%)
3d_z_rotate 25,r% 3d_x_position 25,sqr(8)*cos(-45+r%) 3d_y_position 25,sqr(8)*sin(-45+r%)
3d_z_rotate 26,r% 3d_x_position 26,2*cos(-90+r%) 3d_y_position 26,2*sin(-90+r%)
3d_z_rotate 27,r% 3d_x_position 27,sqr(8)*cos(-135+r%) 3d_y_position 27,sqr(8)*sin(-135+r%)
3d_z_rotate 24,r% 3d_x_position 24,2*cos(-180+r%) 3d_y_position 24,2*sin(-180+r%)
pause 5 next r% end_sub ' ------------------------------------------------------------------------------ sub rotationFaceBlanche(r%) dim_local angleDepart%, angleStop%, sensRotation% ' Le centre de la face est BLANCHE
' on détermine les sens de rotation if r% < 0 sensRotation% = -1 else sensRotation% = 1 end_if angleDepart% = o3d_y_rotate(11) angleStop% = angleDepart% + r% for r% = angleDepart% to angleStop% step sensRotation%
3d_y_rotate 11,r% :' centre blanc
3d_y_rotate 3,r% 3d_z_position 3,sqr(8)*cos(45+r%) 3d_x_position 3,sqr(8)*sin(45+r%)
3d_y_rotate 2,r% 3d_z_position 2,2*cos(r%) 3d_x_position 2,2*sin(r%)
3d_y_rotate 1,r% 3d_z_position 1,sqr(8)*cos(-45+r%) 3d_x_position 1,sqr(8)*sin(-45+r%)
3d_y_rotate 10,r% 3d_z_position 10,2*cos(-90+r%) 3d_x_position 10,2*sin(-90+r%)
3d_y_rotate 19,r% 3d_z_position 19,sqr(8)*cos(-135+r%) 3d_x_position 19,sqr(8)*sin(-135+r%)
3d_y_rotate 20,r% 3d_z_position 20,2*cos(-180+r%) 3d_x_position 20,2*sin(-180+r%)
3d_y_rotate 21,r% 3d_z_position 21,sqr(8)*cos(-225+r%) 3d_x_position 21,sqr(8)*sin(-225+r%)
3d_y_rotate 12,r% 3d_z_position 12,2*cos(-270+r%) 3d_x_position 12,2*sin(-270+r%)
pause 5 next r% end_sub ' ------------------------------------------------------------------------------ sub rotationFaceJaune(r%) dim_local angleDepart%, angleStop%, sensRotation% ' Le centre de la face est JAUNE
' on détermine les sens de rotation if r% < 0 sensRotation% = -1 else sensRotation% = 1 end_if angleDepart% = o3d_y_rotate(17) angleStop% = angleDepart% + r% for r% = angleDepart% to angleStop% step sensRotation%
3d_y_rotate 17,r% :' centre jaune
3d_y_rotate 27,r% 3d_z_position 27,sqr(8)*cos(135+r%) 3d_x_position 27,sqr(8)*sin(135+r%)
3d_y_rotate 26,r% 3d_z_position 26,2*cos(180+r%) 3d_x_position 26,2*sin(180+r%)
3d_y_rotate 25,r% 3d_z_position 25,sqr(8)*cos(225+r%) 3d_x_position 25,sqr(8)*sin(225+r%)
3d_y_rotate 16,r% 3d_z_position 16,2*cos(-90+r%) 3d_x_position 16,2*sin(-90+r%)
3d_y_rotate 7,r% 3d_z_position 7,sqr(8)*cos(-45+r%) 3d_x_position 7,sqr(8)*sin(-45+r%)
3d_y_rotate 8,r% 3d_z_position 8,2*cos(r%) 3d_x_position 8,2*sin(r%)
3d_y_rotate 9,r% 3d_z_position 9,sqr(8)*cos(45+r%) 3d_x_position 9,sqr(8)*sin(45+r%)
3d_y_rotate 18,r% 3d_z_position 18,2*cos(90+r%) 3d_x_position 18,2*sin(90+r%)
pause 5 next r% end_sub
' ------------------------------------------------------------------------------ quitter: terminate return Pour les rotations, mêmes remarques que pour le cube chainé. Il n’y a pas encore de mise en mémoire des 6 paramètres de chaque cube élémentaire après une rotation. Il faut donc retourner à la position initiale de la face avant d’en tourner une autre. Bonne continuation ! | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 11:14 | |
| - Marc a écrit:
- Il n’y a pas encore de mise en mémoire des 6 paramètres de chaque cube élémentaire après une rotation
Je ne suis pas sur de te comprendre, regarde mon démonstrateur. Chaque cube conservent la mémoire de ça rotation "cub 90 0 90" Pour reprendre l'idée que un codeur est capable de résoudre ce qui parait ne pas être dans son champ de compétence. Il suffit de lui dire que chaque cube mesh comporte toutes les couleurs et en tournant sur lui même il se comporte comme un pixel. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 12:23 | |
| Bonjour Mindstorm,
J'ai appliqué la texture des carrés de marc sur ton code de la page précédente. Ca permet d'avoir une meilleur visibilité.
C'est vrai que ton code est relativement simple et court comparé à celui de Marc. Mais est il possible d'effectuer les autres déplacements aussi facilement ? | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 12:28 | |
| - mindstorm a écrit:
- ... et si sylverman ou Minibug veulent participer, j'ai trouvé une autre solution sans chainage cette nuit.
En fait, je participe silencieusement. Pour le problème de 3d_chain_break, je me suis rendu compte que ça ne fonctionnait pas correctement lorsque j'ai posté le bug de 3d_chain. Du coup, j'ai opté pour la solution sans chainage, alors j'utilise le cube fourni par Jack pour coder. J'avance lentement | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 21:18 | |
| Bonjour à tous @Minibug La réponse est simple, pour un codeur qui maitrise les Matrices (par exemple papydall ) rien de plus facile. Pour un dessinateur industriel qui révise son bac, un peut de transpiration pour chercher ces cours ... (une heure sur internet pour moi) mais promis, le code doit être cours. Pour toi, pense à la méthode de la main droite et regarde mes déplacements, ils ne sont pas si simple! (dans le repère X,Y,Z les coordonnées i,j,k du cube tourne avec le cube(c'est un mini trièdre qui appartient au cube)) Pour Silverman , normalement après avoir codé la rotation du cube pour obtenir la bonne couleur sur la bonne face...(soit pas mal de ligne de code il me semble!) la solution sera au bout du tunnel car les cubes ne se déplacent pas et le choix des faces en est facilité. attention Marc vas tous nous ridiculiser bon courage | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Sam 1 Oct 2022 - 22:17 | |
| - Mindstorm a écrit:
- attention Marc vas tous nous ridiculiser
Ca risquerai bien d'arriver... Il maitrise parfaitement la programmation et en plus il est très à l'aise en trigonométrie. Et pout terminer il travaille de façon méthodique et il est très organisé. Rien qu'à voir le travail de préparation sur le cube.... | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Dim 2 Oct 2022 - 11:40 | |
| Pour vous permettre de coiffer Marc sur le poteau Un dernier coup de pouce Le trièdrev"ijk" visible. Pour ma part j'utilise ma main droite (le pouce est i, l'index j et le majeur k) première étape i est sur l'axe X,j sur l'axe Y et k sur l'axe Z si je veux une rotation suivant l'axe Z de 90° je tourne le cub suivant l'axe k(z du cub) de 90° après la rotation i est passé sur l'axe Y , j est en -X et k ne change pas Donc, si je veux maintenant une rotation suivant l'axe X de 90° je cherche l'axe du cub qui est sur l'axe X et son sens soit -j(-zcub) j'ai fini pour tourné suivant l'axe des X de 90° il suffit tournée le cub suivant l'axe j(ycub)mais de -90° et ainsi de suite le code est fini, il suffit de l'écrire - Code:
-
scene3d 1 form 2:Left 2,600:height 2,800:top 2,0:width 2,70 full_space 1 cam_position 10,10,10 dim i%,j%,x,y,z,d,c,r,cub,mesh,cubi,cubj,cubk print_target_is 2 triedre()
mesh=151 :cub=150:cubi=145:cubj=146:cubk=147 3d_mesh mesh 3d_load_object mesh,"cube.3ds" 3d_load_texture mesh, "cube.bmp" rem constructioncube() 3d_cube cub,0.1 :3d_chain cub,mesh triedreijk()
wait 2000 x=0:y=0:z=0 r=1
for i%=1 to 3 z=r*30*i% 3d_rotate cub,x,y,z 3d_rotate cubi,x,y,z 3d_rotate cubj,x,y,z 3d_rotate cubk,x,y,z wait 300 next i% print "cub" print o3d_x_rotate (cub) print o3d_y_rotate (cub) print o3d_z_rotate (cub)
wait 1000
end '___________________________________________________________________________
sub rotationprogressive() for i%=1 to 3 z=r*30*i% 3d_rotate d+1,x,y,z 3d_rotate d+2,x,y,z 3d_rotate d+3,x,y,z 3d_rotate d+4,x,y,z 3d_rotate d+5,x,y,z 3d_rotate d+6,x,y,z 3d_rotate d+7,x,y,z 3d_rotate d+8,x,y,z 3d_rotate d+9,x,y,z wait 300 next i% end_sub '___________________________________________________________________________ sub constructionmesh() for j%=1 to 9 for i%=1 to 3 mesh=(100*i%)+j% 3d_mesh mesh 3d_load_object mesh,"cube.3ds" 3d_load_texture mesh, "cube.bmp" next i% next j% end_sub '__________________________________________________________________________ sub constructioncube() for j%=1 to 9 for i%=1 to 3 cub=(10*i%)+j% 3d_cube cub,1 next i% next j% end_sub '_________________________________________________________________________ sub chainage() for j%=1 to 9 for i%=1 to 3 cub=(i%*10)+j% mesh=(i%*100)+j% 3d_chain cub,mesh next i% next j% end_sub '_________________________________________________________________________ sub positionmesh() for j%=1 to 3 z=2.01*(2-j%) c=j%*100 3d_position c+1,0,0,z 3d_position c+2,0,2.01,z 3d_position c+3,0,-2.01,z 3d_position c+4,2.01,0,z 3d_position c+5,2.01,2.01,z 3d_position c+06,2.01,-2.01,z 3d_position c+7,-2.01,0,z 3d_position c+8,-2.01,2.01,z 3d_position c+9,-2.01,-2.01,z next j% end_sub '_________________________________________________________________________ sub triedre() 3d_cube 1,1 :3d_scale 1,12,0.1,0.1 3d_cube 2,1 :3d_scale 2,0.1,12,0.1 3d_cube 3,1 :3d_scale 3,0.1,0.1,12 3d_cone 4,.8,.3 :3d_x_position 4,6 :3d_z_rotate 4,-90 3d_cone 5,.8,.3 :3d_y_position 5,6 3d_cone 6,.8,.3 :3d_z_position 6,6 :3d_x_rotate 6,-90 3d_text 7,"X" : 3d_x_position 7,6.5 3d_text 8,"Y" : 3d_y_position 8,6.5 3d_text 9,"Z" : 3d_z_position 9,7.1 :3d_y_rotate 9,90 end_sub '_________________________________________________________________________ sub triedreijk() 3d_cube cubi,0.1 3d_cube cubj,0.1 3d_cube cubk,0.1 3d_text 10004,"i" :3d_x_position 10004,2:3d_color 10004,200,0,0 :3d_chain cubi,10004 3d_text 10005,"j" :3d_y_position 10005,2:3d_color 10005,200,0,0 :3d_chain cubj,10005 3d_text 10006,"k" :3d_z_position 10006,2:3d_color 10006,200,0,0 :3d_chain cubk,10006 end_sub
| |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 15:09 | |
| Bon, en fait c'était pas si compliqué à réaliser, mais panoramic nous a réservé une bien mauvaise surprise le fourbe! Il m'a fallu moins de deux jours pour coder, et après une pause de qq jours, quatre de plus pour comprendre pourquoi mon code ne fonctionnait pas correctement(des copier-coller-merdé...). Pourtant, tout était logique dans le code, c'était incompréhensible Je décide de tester le fondamental et là, miracle! En vérifiant le sens de rotation de chaque axe, et bien devinez... Il y en a un qui tourne à l'envers, un rebelle, si si !!! Les axes Y et Z tournent en sens horaire, tandis que L'axe X tourne dans le sens anti-horaire, lui! C'était juste à cause de ça que mon code ne marchait pas . Et le votre aussi, forcément Après avoir tenu compte de ce problème dans le programme, ça marche beaucoup mieux . Bien que le code ne soit pas complètement nettoyé et commenté, je le présente quand même. Voici 10 rotations de couronnes, au hasard : - Code:
-
dim posX%,posY%,posZ% dim NorientX%,NorientY%,NorientZ%
dim i%,obj%,Angle_rot,A%,x,y,z,Norient%,pos%,rot%,axe$,face$,tmp dim objX,objY,objZ dim txt$ dim test%,arrondi%
posX%=3 posY%=4 posZ%=5 NorientX%=9 NorientY%=10 NorientZ%=11
creation_scene()
' MAIN ========================================================================= ' ' Angle_rot = +-90 ou +-180 ou +-270 ' axe$ = "x" ou "y" ou "z" ' face$ = "-2" ou "0" ou "2" ' ' ==============================================================================
' qq tests aléatoires for test%=1 to 10 arrondi%=rnd(2.499)+1 Angle_rot = arrondi% * 90 * sgn(rnd(1)-0.5) ' arrondi% = rnd(2.499)+1 select arrondi% case 1: axe$="x" case 2: axe$="y" case 3: axe$="z" end_select ' arrondi% = rnd(2.499)+1 select arrondi% case 1: face$="-2" case 2: face$="0" case 3: face$="2" end_select ' caption 0,"Test n°"+str$(test%)+" : Angle = "+str$(Angle_rot)+"° / Axe = "+axe$+" / Couronne = "+face$ rotation_couronne(Angle_rot,axe$,face$) next test% caption 0,"Terminé"
END ' ============================================================================== sub rotation_couronne(Angle_rot,axe$,face$) if mod(angle_rot,360)=0 exit_sub else angle_rot=mod(angle_rot,360) end_if axe$=lower$(axe$) if axe$<>"x" and axe$<>"y" and axe$<>"z" then exit_sub if axe$="x" then pos%=posX% if axe$="y" then pos%=posY% if axe$="z" then pos%=posZ% if face$<>"-2" and face$<>"0" and face$<>"2" then exit_sub ' Norient%=pos%+6 rot%=pos%-2 ' for A%=sgn(Angle_rot) to Angle_rot step sgn(Angle_rot) for i%=1 to 27 if grid_read$(1,i%,pos%)=face$ ' objX=val(grid_read$(1,i%,posX%)) objY=val(grid_read$(1,i%,posY%)) objZ=val(grid_read$(1,i%,posZ%)) Matrice_Rotation(objX,objY,objZ,A%,rot%) ' 3d_position i%,x,y,z ' tmp=val(grid_read$(1,i%,Norient%)) if Norient%=NorientX% and abs(tmp)>1 then tmp=0-tmp if Norient%=NorientY% and abs(tmp)=1 then tmp=0-tmp if Norient%=NorientZ% and abs(tmp)=1 then tmp=0-tmp ' select tmp case -3: 3d_z_rotate i%,o3d_z_rotate(i%)-1*sgn(Angle_rot) case -2: 3d_y_rotate i%,o3d_y_rotate(i%)-1*sgn(Angle_rot) case -1: 3d_x_rotate i%,o3d_x_rotate(i%)-1*sgn(Angle_rot) case 1 : 3d_x_rotate i%,o3d_x_rotate(i%)+1*sgn(Angle_rot) case 2 : 3d_y_rotate i%,o3d_y_rotate(i%)+1*sgn(Angle_rot) case 3 : 3d_z_rotate i%,o3d_z_rotate(i%)+1*sgn(Angle_rot) end_select end_if next i% display next A%
' mise à jour des données for i%=1 to 27 if grid_read$(1,i%,pos%)=face$ ' ' positions x=val(grid_read$(1,i%,posX%)) y=val(grid_read$(1,i%,posY%)) z=val(grid_read$(1,i%,posZ%)) Matrice_Rotation(x,y,z,Angle_rot,rot%) grid_write 1,i%,posX%,str$(x) grid_write 1,i%,posY%,str$(y) grid_write 1,i%,posZ%,str$(z) ' ' sens de rotation x=val(grid_read$(1,i%,NorientX%)) y=val(grid_read$(1,i%,NorientY%)) z=val(grid_read$(1,i%,NorientZ%)) Matrice_Rotation(x,y,z,Angle_rot,rot%) grid_write 1,i%,NorientX%,str$(x) grid_write 1,i%,NorientY%,str$(y) grid_write 1,i%,NorientZ%,str$(z) end_if next i% end_sub
sub Matrice_Rotation(px,py,pz,ang,axe) select axe case 1: ' matrice de rotation X en sens anti horaire x = px*1 +py*0 +pz*0 y = px*0 +py*cos(0-ang) -pz*sin(0-ang) z = px*0 +py*sin(0-ang) +pz*cos(0-ang) case 2: ' matrice de rotation Y en sens horaire x = px*cos(ang) +py*0 +pz*sin(ang) y = px*0 +py*1 -pz*0 z = px*(0-sin(ang)) +py*0 +pz*cos(ang) case 3: ' matrice de rotation Z en sens horaire x = px*cos(ang) -py*sin(ang) +pz*0 y = px*sin(ang) +py*cos(ang) +pz*0 z = px*0 +py*0 +pz*1 end_select x=round_float(x,3) y=round_float(y,3) z=round_float(z,3) end_sub
fnc round_float(round_float_mon_nb,round_float_decimales%) dim_local round_float_tmp% ' arrondi 'float' round_float_tmp%=round_float_mon_nb*power(10,round_float_decimales%) round_float_mon_nb=round_float_tmp%/(power(10,round_float_decimales%)) result round_float_mon_nb end_fnc
sub creation_scene() ' données stockées dans un grid create_hide grid 1 ' left 1,450 : width 1,800 : height 1,680 : full_space 0 :' débogage pour CREATE_HIDE en rem create_show grid_row 1,27 grid_row_fixed 1,0 grid_column 1,11 grid_column_fixed 1,0 ' creation scène degrees SCENE3D 2:HEIGHT 2,400:WIDTH 2,400 axes_show color 2,64,64,64 ' la caméra est créée en 0,0,5 ' on la déplace pour voir 3 faces du cube CAM_POSITION -10,6,6 ' on crée 27 cubes texturés FOR I%=1 TO 27 ' txt$=str$(I%) : 3D_MESH I%:3D_LOAD_OBJECT I%,"CUBE.3DS":3D_LOAD_TEXTURE I%,"CUBE"+txt$+".BMP" :' débogage 3D_MESH I%:3D_LOAD_OBJECT I%,"CUBE.3DS":3D_LOAD_TEXTURE I%,"CUBEmarc.BMP" NEXT I% ' X axe rouge, sens de rotation anti-horaire ' Y axe vert, sens de rotation horaire ' Z axe bleu, sens de rotation horaire
' placement et texturage des objets obj%=0 for x=-2 to 2 step 2 for y=-2 to 2 step 2 for z=-2 to 2 step 2 obj%=obj%+1 ' placer les cubes 3d_position obj%,x,y,z ' position et orientation mémorisées dans un grid grid_write 1,obj%,posX%,str$(x) grid_write 1,obj%,posY%,str$(y) grid_write 1,obj%,posZ%,str$(z) grid_write 1,obj%,NorientX%,"1" grid_write 1,obj%,NorientY%,"2" grid_write 1,obj%,NorientZ%,"3" next z next y next x end_sub
Au passage, ça rend vraiment bien avec la texture fourni par Marc! EDIT: Fait quelques modifications mineures
Dernière édition par silverman le Lun 3 Oct 2022 - 20:32, édité 9 fois | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 16:59 | |
| Chapeau Sylverman A première vue ce n'est pas un bug! - Sylverman a écrit:
- Les axes Y et Z tournent en sens horaire, tandis que L'axe X tourne dans le sens anti-horaire, lui!
Tu n'a juste pas utilisé la méthode de la main droite. A confirmer par un codeur mathématicien | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 17:02 | |
| Bonjour Silverman, Comme tu n'as joint aucun fichier j'ai adapté les fichiers bmp avec ceux de Marc, le cube.3ds et le cube.bmp. J'ai tester ton code...mais a part afficher le cube c'est tout ce que je vois... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 17:28 | |
| @mindstorm Peu importe le placement des axes, ils ont une rotation propre imposé par le moteur 3D. Par exemple en darkbasic (langage de programmation 3D que j'ai pratiqué), le sens de rotation est le même pour les 3 axes, c'est commode et le rubik's cube aurait été simple à coder. En panoramic, après avoir compris le problème, il a fallu pour les axes, inverser les rotations uniquement quand : Y ou Z sont venus se superposer à X (on s'apprête à tourner autour de X), X est venu se superposer à Y (on s'apprête à tourner autour de Y), X est venu se superposer à Z (on s'apprête à tourner autour de Z). Sans cet axe inversé, ça n'aurait pas été difficile à coder et je suis convaincu que les panoramiciens auraient déjà fini de coder le rubik's cube. Un code qui montre l'inversion de la rotation de X par rapport aux 2 autres axes: - Code:
-
dim i%
form 1 : top 1,32 : left 1,0 caption 1,"Rotation autour de l'axe X" command_target_is 1 scene3d 10 : 3d_target_is 10 axes_show cam_position -5,0,0 light_position -5,0,0 point_position 0,0,0.01 3d_cube 11,1
form 2 : top 2,32 : left 2,320 caption 2,"Rotation autour de l'axe Y" command_target_is 2 scene3d 20 : 3d_target_is 20 axes_show cam_position 0,-5,0 light_position 0,-5,0 point_position 0,0,0.01 3d_cube 21,1
form 3 : top 3,32 : left 3,640 caption 3,"Rotation autour de l'axe Z" command_target_is 3 scene3d 30 : 3d_target_is 30 axes_show cam_position 0,0,-5 light_position 0,0,-5 point_position 0,0,0.01 3d_cube 31,1
command_target_is 0
for i%=1 to 360 3d_x_rotate 11,o3d_x_rotate(11)+1 3d_y_rotate 21,o3d_y_rotate(21)+1 3d_z_rotate 31,o3d_z_rotate(31)+1 pause 1 display next i%
L'axe testé sort de l'oeil et regarde l'horizon. Pour X, on vois bien que ça tourne à l'envers! @minibug Oh la boulette! Une modification de dernière minute. J'ai ajouté les ligne 62 et 66 et j'y avait mis des "or" à la place des "and". Ca marche maintenant et c'est corrigé dans mon post précédent
Dernière édition par silverman le Lun 3 Oct 2022 - 20:39, édité 2 fois | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 19:19 | |
| | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 20:26 | |
| Tu as raison sylverman la méthode de la main droit t'aurait juste évité de chercher le sens de rotation de chaque axe. Tu reste le vainqueur sans conteste de ce jeu!!! Je continu sur ma voie (je code très lentement par manque de pratique) | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 21:18 | |
| Bravo Silverman ! Oui tu est le premier a avoir un cube entièrement fonctionnel !! Tu es le champion en titre !!! En plus le fonctionnement de ta sub est très simple avec les paramètres à renseigner. Du coup je vais peut être tenter une interface utilisateur avec des boutons permettant les déplacements. et peut être 2 ou 3 autres choses que j'ai en tête... | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Projet d'un Rubik's cube en 3D Lun 3 Oct 2022 - 21:27 | |
| Bonsoir à tous ! Waouuhh ! Bravo Silverman ! Très belle réussite ! | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Projet d'un Rubik's cube en 3D Mar 4 Oct 2022 - 19:19 | |
| Bonsoir tout le monde ! En partant du code de Silverman, j'ai réalisé une petite interface pour piloter les mouvements du cube. Ce n'est pas super en terme d'esthétique car j'ai utilisé des images de flèches existantes. Mais elle ne sont pas toutes dans l'angle exacte du cube. Je reprendrai cela plus tard... En attentant vous pouvez télécharger le fichier depuis ce lien. Il suffit de le déposer ou vous voulez. vous cliquez pour l'installer et c'est tout ! Ensuite vous cliquez sur le fichier RubiksCube.exe pour le lancement comme d'habitude. Encore un grand merci à toute la communauté et plus particulièrement à Silverman pour son code ! | |
| | | Contenu sponsorisé
| Sujet: Re: Projet d'un Rubik's cube en 3D | |
| |
| | | | Projet d'un Rubik's cube en 3D | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |