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 Mar 4 Oct 2022 - 21:30
Minibug a écrit:
...j'ai réalisé une petite interface pour piloter les mouvements du cube...
Bravo Minibug ! Cela fonctionne bien !
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 - 21:48
C'est surtout Silverman qu'il faut remercier !!
ET toi Marc ou en est ton programme ? On attends pour avoir une autre approche, ainsi que Mindstorm...
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 Mer 5 Oct 2022 - 19:16
des nouvelles du front Pour l'instant je suis un peut noyer (quatre jours déjà) avec les transformation des coordonnées cartésienne en coordonnées sphérique et inversement. Il faudra bien que j'y arrive Après, mon plan est défini et il n'y aura plus qu'à dérouler
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 Mer 5 Oct 2022 - 23:38
Bonsoir à tous !
Minibug a écrit:
ET toi Marc ou en est ton programme ?
Mon programme est à l’arrêt. Je n’étais pas disponible le week-end dernier pour y travailler. Silverman a diffusé une solution parfaitement fonctionnelle , je n’irai pas plus loin pour l’instant. Mindstorm nous prépare aussi une version.
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
Sujet: Re: Projet d'un Rubik's cube en 3D Jeu 6 Oct 2022 - 2:08
mindstorm a écrit:
Pour l'instant je suis un peut noyer (quatre jours déjà) avec les transformation des coordonnées cartésienne en coordonnées sphérique et inversement.
Coordonnées sphériques:
Les trois coordonnées d'un point P sont r, theta et phi. r mesure la longueur du rayon vecteur qui va de O à P L'angle theta mesure l'inclinaison de ce rayon vecteur à l'axe Oz et phi mesure l'angle à partir de l'axe Ox de la projection du rayon vecteur sur le plan xOy.
Remarque : Pour phi , la formule ci-dessus n'est valable que pour x > 0. Dans le cas général, il faut utiliser la fonction atan2(y,x) qui n'est malheuseument pas implementée dans Panoramic. Si tu en as besoin, je peux fournir un code de cette fonction.
@ Minibug et les autres: Pardon pour ce hors-sujet! Je voulais simplement répondre à notre ami mindstorm.
Bon courage et bonne continuation pour ce beau projet du 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 Jeu 6 Oct 2022 - 8:22
Bonjour Papydall,
Citation :
@ Minibug et les autres: Pardon pour ce hors-sujet! Je voulais simplement répondre à notre ami mindstorm.
Pas de problème. Et tant qu'on y apprends quelque chose c'est toujours bénéfique !
@Papydall et @tous avez vous vu le programme de Silverman sur la page précédente ? Il a relevé le défi du rubik's cube et en plus avec un code relativement court !
On attends les autres approches de Mindstorm et Marc. A suivre...
PS : A mince je crois que Marc a déclaré forfait...
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
Sujet: Re: Projet d'un Rubik's cube en 3D Jeu 6 Oct 2022 - 12:13
Bonjour à tous,
J'ai téléchargé à partir de ce lien fourni par minibug =>rubikscube Formidable ! A+
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 Jeu 6 Oct 2022 - 12:43
Bonjour à tous !
Maintenant que notre ami Silverman a réussi à faire tourner les faces du cube sans accroc, je me suis concentré sur le déplacement de la caméra suivant les axes x et y de la souris.
Le code ci-dessous permet de faire tourner la caméra autour du Rubik’s Cube, à l’horizontale ou à la verticale sans déformation.
Utilisez le cliquer-déplacer pour orienter la vue.
Pour faire fonctionner le programme, vous aurez besoin du cube.3ds de Mindstorm et de votre texture préférée pour habiller les petits cubes.
Code:
' Déplacement caméra suivant (x,y) de la souris label orienterCube, quitter
dim x_positionCamera%, y_positionCamera%, z_positionCamera% dim x_souris%, y_souris%, x%, y%, z%, i%, distanceCamera%, y1%
degrees
interfaceGraphique3D()
end ' ------------------------------------------------------------------------------ orienterCube: off_mouse_down 1
' on quitte le sous-programme si c'est le bouton droit de la souris qui est enfoncé if mouse_right_down(1) = 1 on_mouse_down 1,orienterCube return end_if
' orientation de la caméra sur son propre axe de visée (axe Z). y1% = y%
y1% = mod(y1%,360)
if ((y1% > 89 ) and (y1% < 270 )) or ((y1% < -89) and (y1% > -270)) cam_roll 180 else cam_roll 0 end_if
pause 20 end_while
' mémorisation de la nouvelle position de la caméra x_positionCamera% = mouse_x_position(1) - x_souris% + x_positionCamera% y_positionCamera% = mouse_y_position(1) - y_souris% + y_positionCamera%
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 au lancement du programme distanceCamera% = 12 x_positionCamera% = 54 y_positionCamera% = 25 cam_x_position cos(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera% cam_z_position sin(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera% cam_y_position sin(y_positionCamera%) * distanceCamera%
' 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%,"cube.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
Edit du 09/10/2022 14:55 Modification / amélioration du code.
Dernière édition par Marc le Dim 9 Oct 2022 - 14:57, édité 1 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 Jeu 6 Oct 2022 - 18:49
Merci Papydall C'est bien avec ces formules (trouvés dans un vieux livre de math)que je me bats. En effet theta=90 est parfait pour les rotations suivant l'axe des Z mais pour les rotation en X et Y Pour X et Y, a force de tourner en rond, j'ai pris le décision de faire un tableur excel pour tester de manière rustique.
Papydall a écrit:
Coordonnées sphériques: Les trois coordonnées d'un point P sont r, theta et phi. r mesure la longueur du rayon vecteur qui va de O à P L'angle theta mesure l'inclinaison de ce rayon vecteur à l'axe Oz et phi mesure l'angle à partir de l'axe Ox de la projection du rayon vecteur sur le plan xOy.
Je ne suis pas fière de la méthode mais je n'ai eu ce résultat qu'hier soir. merci pour ton soutient
Dernière édition par mindstorm le Dim 9 Oct 2022 - 9:35, édité 1 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 Sam 8 Oct 2022 - 22:45
Il me restait un soucis Je ne parviens pas à faire la liaison entre ces action Ca alors, Je l'avais sous les yeux dans un repère sphérique le Y est en HAUT merci à tous
Dernière édition par mindstorm le Dim 9 Oct 2022 - 9:37, édité 3 fois
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 Dim 9 Oct 2022 - 9:25
Bonjour Mindstorm et bonjour à tous !
Mindstorm a écrit:
Je ne parviens pas à faire la liaison entre ces action
Je n'ai pas compris ce que tu souhaites faire exactement. J'ai testé ton programme ci-dessus, tout semble tourner. Est-ce un problème de déplacement de la caméra autour du 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 9 Oct 2022 - 9:32
excuse moi Marc nous nous sommes croisé C'est bien un problème de rotation de la caméra. Comme la nuit porte conseil...je me suis souvenu qu'il ne faut pas vouloir faire deux chose à la fois Bref l’équation est juste et le soucis est entre la chaise et l'écran. Pour la rotation camera il me faut juste un cam_roll pour l'orientation suivant Z et le plus gros sera fait merci encore
Dernière édition par mindstorm le Lun 10 Oct 2022 - 13:01, édité 1 fois
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 Dim 9 Oct 2022 - 9:42
@Mindstorm
Ok, pas de soucis. Oui, il faut utiliser cam_roll.
Tu as un exemple dans le source que j'ai posté un peu plus haut, le jeudi 06 octobre à 12h43. C'est dans le sous-programme orienterCube.
Pour éviter les instructions degree_to_radian, tu peux mettre en tête de ton programme l'instruction DEGREES : tous les calculs seront automatiquement effectués en degrés.
Bonne programmation !
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 9 Oct 2022 - 12:12
Merci Marc je ne voulais pas copier mais ... tu me fais gagner pas mal de temps
Dernière édition par mindstorm le Lun 10 Oct 2022 - 13:01, édité 1 fois
Jean Claude aime ce 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 Dim 9 Oct 2022 - 14:32
J'ai modifié et affiné l'algorithme qui détermine le moment où la caméra doit opérer une rotation de 180°.
Nouveau code :
Code:
y1% = y%
y1% = mod(y1%,360)
if ((y1% > 89 ) and (y1% < 270 )) or ((y1% < -89) and (y1% > -270)) cam_roll 180 else cam_roll 0 end_if
Et le code complet :
Code:
' Déplacement caméra suivant (x,y) de la souris label orienterCube, quitter
dim x_positionCamera%, y_positionCamera%, z_positionCamera% dim x_souris%, y_souris%, x%, y%, z%, i%, distanceCamera%, y1%
degrees
interfaceGraphique3D()
end ' ------------------------------------------------------------------------------ orienterCube: off_mouse_down 1
' on quitte le sous-programme si c'est le bouton droit de la souris qui est enfoncé if mouse_right_down(1) = 1 on_mouse_down 1,orienterCube return end_if
' orientation de la caméra sur son propre axe de visée (axe Z). y1% = y%
y1% = mod(y1%,360)
if ((y1% > 89 ) and (y1% < 270 )) or ((y1% < -89) and (y1% > -270)) cam_roll 180 else cam_roll 0 end_if
pause 20 end_while
' mémorisation de la nouvelle position de la caméra x_positionCamera% = mouse_x_position(1) - x_souris% + x_positionCamera% y_positionCamera% = mouse_y_position(1) - y_souris% + y_positionCamera%
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 au lancement du programme distanceCamera% = 12 x_positionCamera% = 54 y_positionCamera% = 25 cam_x_position cos(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera% cam_z_position sin(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera% cam_y_position sin(y_positionCamera%) * distanceCamera%
' 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%,"cube.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
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
Sujet: Re: Projet d'un Rubik's cube en 3D Dim 9 Oct 2022 - 17:44
@minibug J'ai ajouté une variable vitesse pour accélérer la rotation des couronnes, c'est plus agréable je trouve. Très peu de modifications de la sub sub rotation_couronne(), aucun changement pour l'utiliser:
Code:
sub rotation_couronne(Angle_rot,axe$,face$) dim_local vit% 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 vit%=3 :' combinaisons des chiffres 2,3,3,5 Ex.:vit%=2, ou 3, ou 12, etc... ' for A%=0 to Angle_rot step sgn(Angle_rot)*vit% if A%<>0 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%)-vit%*sgn(Angle_rot) case -2: 3d_y_rotate i%,o3d_y_rotate(i%)-vit%*sgn(Angle_rot) case -1: 3d_x_rotate i%,o3d_x_rotate(i%)-vit%*sgn(Angle_rot) case 1 : 3d_x_rotate i%,o3d_x_rotate(i%)+vit%*sgn(Angle_rot) case 2 : 3d_y_rotate i%,o3d_y_rotate(i%)+vit%*sgn(Angle_rot) case 3 : 3d_z_rotate i%,o3d_z_rotate(i%)+vit%*sgn(Angle_rot) end_select end_if next i% display end_if 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
@marc Ton code fonctionne vraiment bien!
Jean Claude aime ce message
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
Sujet: Re: Projet d'un Rubik's cube en 3D Dim 9 Oct 2022 - 20:57
Salut tout le monde.
J'ai téléchargé à partir du lien donné par Jean Claude que je salue. C'est vraiment du beau travail! Merci à tout ceux qui ont participé à ce code.
J'ai voulu apporter mon grain de sel ( et de poivre aussi). J'ai tout chambardé (difficile de modifier un code dont on n'est pas l'auteur). J'ai apporté un peu beaucoup de modifications, d'ajouts, etc... Dans le menu, actuellement seul le sous-menu Tester un algo du sous-menu Tester le rubik's cube est fonctionnel.
Remarque : J'ai déplacé les images des flèches ainsi que cube.bmp et cube.3ds dans un sous-dossier Images du dossier du programme. En tenir compte dans, SUB creation_scene() en ligne 96.
Je vous soumets ma copie et c'est à vous de juger.
Code:
rem ============================================================================ rem Programme RUBIK’S CUBE Réalisé par Silverman rem ------- rem Interface graphique et réaménagement du code par Minibug rem ------- rem Avec la participation de Papydall rem ------- rem Réalisation Septembre-Octobre 2022 rem ============================================================================
for i% = 9902 to 9906 : on_click i%,choix_menu : next i% for i% = 9911 to 9918 : on_click i%,choix_menu : next i% for i% = 9951 to 9952 : on_click i%,choix_menu : next i%
END_SUB rem ============================================================================ Choix_menu: select number_click case 9902 : Reinitialiser_Rubik() case 9903 : Melanger_Rubik() case 9904 : Resoudre_Rubik() case 9905 : ' Ne rien faire ! case 9906 : terminate case 9911 : Tester_Melange() case 9913 : Super_Flip() case 9914 : CheckerBoard() case 9915 : Hi() case 9916 : Plus_Minus() case 9917 : Dot_Cross_Line() case 9918 : Flower_with_stem() ' etc.. case 9951 : Aide() case 9952 : Propos()
end_select return rem ============================================================================ SUB GUI() alpha 9961 : top 9961,80 : left 9961, 600+20 : font_bold 9961 font_name 9961,"arial" : font_color 9961,0,255,255 : font_size 9961,14 alpha 9962 : top 9962,120 : left 9962, 600+20 : font_bold 9962 font_name 9962,"arial" : font_color 9962,255,255,0 : font_size 9962,14
END_SUB rem ============================================================================ ' ------------------------------ CREATION DES LABEL ----------------------------- SUB creation_label() LABEL clic, choix_menu END_SUB rem ============================================================================ ' --------------------------- CREATION DES VARIABLES --------------------------- SUB creation_variables() DIM no% , clic% DIM form% , tableau% , scene% , panel%(18),image%(18) DIM i% , A% , x,y,z , posX%,posY%,posZ% , NorientX%,NorientY%,NorientZ% posX% = 3 : posY% = 4 : posZ% = 5 : NorientX% = 9 : NorientY% = 10 : NorientZ% = 11 END_SUB rem ============================================================================ ' ---------------------------- CREATION DU SCENE_3D ---------------------------- sub creation_scene() DIM_LOCAL obj% dir_change dir_current$ + "\Images" WIDTH no%,600+600 : HEIGHT no%,600+100 : COLOR no%,136,109,110 CAPTION 0,"Rubik's cube Par Silverman - finitions par Minibug - participation de Papydall" form% = no% : no% = no% + 1 ' données stockées dans un grid GRID no% : HIDE no% : GRID_ROW no%,27 : GRID_ROW_FIXED no%,0 GRID_COLUMN no%,11 : GRID_COLUMN_FIXED no%,0 : tableau% = no% : no% = no% + 1 ' creation scène DEGREES SCENE3D no% : HEIGHT no%,HEIGHT_CLIENT(form%)-100 : WIDTH no%,600 COLOR no%,136,109,110 : scene% = no% : no% = no% + 1 ' 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 3D_MESH i% : 3D_LOAD_OBJECT i%,"cube.3ds" : 3D_LOAD_TEXTURE i%,"Cube.bmp" NEXT i% ' X axe rouge - rotation anti-horaire ' Y axe vert - rotation horaire ' Z axe bleu - 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 tableau%,obj%,posX%,STR$(x) GRID_WRITE tableau%,obj%,posY%,STR$(y) GRID_WRITE tableau%,obj%,posZ%,STR$(z) GRID_WRITE tableau%,obj%,NorientX%,"1" GRID_WRITE tableau%,obj%,NorientY%,"2" GRID_WRITE tableau%,obj%,NorientZ%,"3" NEXT z NEXT y NEXT x END_SUB rem ============================================================================ ' ----------------------------- CREATION GRAPHIQUE ----------------------------- SUB creation_graphique() ' Création des boutons sous forme de flèches FOR i% = 1 TO 18 PANEL no% : WIDTH no%,50 : HEIGHT no%,50 : panel%(I%) = no% : no% = no% + 1 PICTURE no% : PARENT no%,no%-1 : WIDTH no%,50 : HEIGHT no%,50 STRETCH_ON no% : ON_CLICK no%,clic : image%(i%) = no% : no% = no% + 1 NEXT i% ' ---------------------------------------------------------------------------- ' Rotation Z LEFT panel%(1),270 : TOP panel%(1),090 : FILE_LOAD image%(1),"FlecheZb.bmp" hint panel%(1),"1/4 de tour, sens horaire, face gauche" no% = no% + 1 button no% : top no%,070 : left no%,290 : width no%,20 : caption no%,"L" LEFT panel%(2),320 : TOP panel%(2),100 : FILE_LOAD image%(2),"FlecheZb.bmp" hint panel%(2),"1/4 de tour de haut en bas, courone entre les faces gauche et droit" no% = no% + 1 button no% : top no%,080 : left no%,340 : width no%,20 : caption no%,"M"
LEFT panel%(3),370 : TOP panel%(3),110 : FILE_LOAD image%(3),"FlecheZb.bmp" hint panel%(3),"1/4 de tour, sens anti-horaire, face droite" no% = no% + 1 button no% : top no%,90 : left no%,390 : width no%,20 : caption no%,"R'"
LEFT panel%(4),170 : TOP panel%(4),410 : FILE_LOAD image%(4),"FlecheZh.bmp" hint panel%(4), "1/4 de tour, sens anti-horaire, face gauche" no% = no% + 1 button no% : top no%,460 : left no%,185 : width no%,20 : caption no%,"L'"
LEFT panel%(5),220 : TOP panel%(5),435 : FILE_LOAD image%(5),"FlecheZh.bmp" hint panel%(5),"1/4 de tour de bas en haut, courone entre les faces gauche et droit" no% = no% + 1 button no% : top no%,485 : left no%,235 : width no%,20 : caption no%,"M'"
LEFT panel%(6),270 : TOP panel%(6),460 : FILE_LOAD image%(6),"FlecheZh.bmp" hint panel%(6),"1/4 de tour, sens horaire, face droite" no% = no% + 1 button no% : top no%,510 : left no%,285 : width no%,20 : caption no%,"R" ' ---------------------------------------------------------------------------- ' Rotation X LEFT panel%(07),140 : TOP panel%(07),110 : FILE_LOAD image%(07),"FlecheXb.bmp" hint panel%(7),"1/4 de tour, sens horaire, face avant" no% = no% + 1 button no% : top no%, 85 : left no%,155 : width no%,20 : caption no%,"F"
LEFT panel%(08),180 : TOP panel%(08),100 : FILE_LOAD image%(08),"FlecheXb.bmp" hint panel%(8),"1/4 de tour de gauche à droite, couronne entre les faces avant et arrière" no% = no% + 1 button no% : top no%,75 : left no%,195 : width no%,20 : caption no%,"S"
LEFT panel%(09),220 : TOP panel%(09),090 : FILE_LOAD image%(09),"FlecheXb.bmp" hint panel%(9),"1/4 de tour, sens anti-horaire, face arrière" no% = no% + 1 button no% : top no%,65 : left no%,235 : width no%,20 : caption no%,"B'"
LEFT panel%(10),370 : TOP panel%(10),410 : FILE_LOAD image%(10),"FlecheXh.bmp" hint panel%(10), "1/4 de tour, sens anti-horaire, face avant" no% = no% + 1 button no% : top no%,460 : left no%,385 : width no%,20 : caption no%,"F'"
LEFT panel%(11),390 : TOP panel%(11),370 : FILE_LOAD image%(11),"FlecheXh.bmp" hint panel%(11),"1/4 de tour de droite à gauche, couronne entre les faces avant et arrière" no% = no% + 1 button no% : top no%,395 : left no%,440 : width no%,20 : caption no%,"S'"
LEFT panel%(12),410 : TOP panel%(12),340 : FILE_LOAD image%(12),"FlecheXh.bmp" hint panel%(12),"1/4 de tour, sens horaire, face arrière" no% = no% + 1 button no% : top no%,355 : left no%,460 : width no%,20 : caption no%,"B"
' Rotation Y LEFT panel%(13),070 : TOP panel%(13),200 : FILE_LOAD image%(13),"FlecheYg.bmp" hint panel%(13),"1/4 de tour, sens anti-horaire, face haut" no% = no% + 1 button no% : top no%,220 : left no%,50 : width no%,20 : caption no%,"U"
LEFT panel%(14),080 : TOP panel%(14),260 : FILE_LOAD image%(14),"FlecheYg.bmp" hint panel%(14),"1/4 de tour de gauche à droite de la couronne entre les faces haut et bas" no% = no% + 1 button no% : top no%,280 : left no%,060 : width no%,20 : caption no%,"E"
LEFT panel%(15),090 : TOP panel%(15),320 : FILE_LOAD image%(15),"FlecheYg.bmp" hint panel%(15),"1/4 de tour, sens horaire, face bas" no% = no% + 1 button no% : top no%,330 : left no%,070 : width no%,20 : caption no%,"D"
LEFT panel%(16),450 : TOP panel%(16),180 : FILE_LOAD image%(16),"FlecheYd.bmp" hint panel%(16),"1/4 de tour, sens horaire, face haut" no% = no% + 1 button no% : top no%,190 : left no%,500 : width no%,20 : caption no%,"U'"
LEFT panel%(17),440 : TOP panel%(17),230 : FILE_LOAD image%(17),"FlecheYd.bmp" hint panel%(17),"1/4 de tour de droite à gauche de la couronne entre les faces haut et bas" no% = no% + 1 button no% : top no%,250 : left no%,490 : width no%,20 : caption no%,"E'"
LEFT panel%(18),430 : TOP panel%(18),280 : FILE_LOAD image%(18),"FlecheYd.bmp" hint panel%(18),"1/4 de tour, sens anti-horaire, face bas" no% = no% + 1 button no% : top no%,290 : left no%,480 : width no%,20 : caption no%,"D'"
END_SUB rem ============================================================================ ' --------------------------- ROTATION DES COURONNES --------------------------- SUB rotation_couronne(Angle_rot,axe$,face$) DIM_LOCAL objX,objY,objZ,pos%,rot%,Norient%,tmp 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$(tableau%,i%,pos%) = face$ ' objX = VAL(GRID_READ$(tableau%,i%,posX%)) objY = VAL(GRID_READ$(tableau%,i%,posY%)) objZ = VAL(GRID_READ$(tableau%,i%,posZ%)) Rot(objX,objY,objZ,A%,rot%) ' 3D_POSITION i%,x,y,z ' tmp = VAL(GRID_READ$(tableau%,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 A% = Angle_rot for i% = 1 TO 27 IF GRID_READ$(tableau%,i%,pos%) = face$ ' positions maj_pos(rot%) ' sens de rotation maj_Norient(rot%) END_IF NEXT i% END_SUB rem ============================================================================ ' ------------------------- MISE A JOUR LES POSITIONS -------------------------- SUB maj_pos(a) x = VAL(GRID_READ$(tableau%,i%,posX%)) y = VAL(GRID_READ$(tableau%,i%,posY%)) z = VAL(GRID_READ$(tableau%,i%,posZ%)) Rot(x,y,z,A%,a) GRID_WRITE tableau%,i%,posX%,STR$(x) GRID_WRITE tableau%,i%,posY%,STR$(y) GRID_WRITE tableau%,i%,posZ%,STR$(z) END_SUB rem ============================================================================ ' ------------------------ MISE A JOUR LES ORIENTATIONS ------------------------ SUB maj_Norient(a) x = VAL(GRID_READ$(tableau%,i%,NorientX%)) y = VAL(GRID_READ$(tableau%,i%,NorientY%)) z = VAL(GRID_READ$(tableau%,i%,NorientZ%)) Rot(x,y,z,A%,a) GRID_WRITE tableau%,i%,NorientX%,STR$(x) GRID_WRITE tableau%,i%,NorientY%,STR$(y) GRID_WRITE tableau%,i%,NorientZ%,STR$(z) END_SUB rem ============================================================================ ' --------------------------------- ROTATIONS ---------------------------------- SUB Rot(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 rem ============================================================================ ' ---------------------------- FONCION round_float ----------------------------- 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 rem ============================================================================ ' ---------------------------- GESTION DES CLICS ------------------------------- clic: clic% = NUMBER_CLICK FOR I% = 1 TO 18 OFF_CLICK image%(I%) NEXT I% ' Angle_rot = + -90 ou + -180 ou + -270 ' axe$ = "x" ou "y" ou "z" ' face$ = "-2" ou "0" ou "2" IF clic% = image%(1) THEN rotation_couronne(90,"z",-2) : ' L IF clic% = image%(2) THEN rotation_couronne(90,"z",0) : ' M IF clic% = image%(3) THEN rotation_couronne(90,"z",2) : ' R' IF clic% = image%(4) THEN rotation_couronne(-90,"z",-2) : ' L' IF clic% = image%(5) THEN rotation_couronne(-90,"z",0) : ' M' IF clic% = image%(6) THEN rotation_couronne(-90,"z",2) : ' R
IF clic% = image%(7) THEN rotation_couronne(-90,"x",-2) : ' F IF clic% = image%(8) THEN rotation_couronne(-90,"x",0) : ' S IF clic% = image%(9) THEN rotation_couronne(-90,"x",2) : ' B' IF clic% = image%(10) THEN rotation_couronne(90,"x",-2) : ' F' IF clic% = image%(11) THEN rotation_couronne(90,"x",0) : ' S' IF clic% = image%(12) THEN rotation_couronne(90,"x",2) : ' B
IF clic% = image%(13) THEN rotation_couronne(90,"y",2) : ' U IF clic% = image%(14) THEN rotation_couronne(90,"y",0) : ' E IF clic% = image%(15) THEN rotation_couronne(90,"y",-2) : ' D IF clic% = image%(16) THEN rotation_couronne(-90,"y",2) : ' U' IF clic% = image%(17) THEN rotation_couronne(-90,"y",0) : ' E' IF clic% = image%(18) THEN rotation_couronne(-90,"y",-2) : ' D'
FOR I% = 1 TO 18 ON_CLICK image%(I%),clic NEXT I% RETURN rem ============================================================================ SUB Reinitialiser_Rubik() message "Pas encore" END_SUB rem ============================================================================ SUB Melanger_Rubik() message "Pas encore" END_SUB rem ============================================================================ SUB Resoudre_Rubik() message "Pas encore" END_SUB rem ============================================================================ SUB Tester_Melange() message "Pas encore" END_SUB rem ============================================================================ ' U R2 F B R B2 R U2 L B2 R U' D' R2 F R' L B2 U2 F2 SUB Super_Flip() dim_local algo$, inverse$ algo$ = " U R2 F B R B2 R U2 L B2 R U' D' R2 F R' L B2 U2 F2 " inverse$ = " U' R2 F' B' R' B2 R' U2 L' B2 R' U D R2 F' R L' B2 U2 F2 " inverse$ = " F2 U2 B2 L' R F' R2 D U R' B2 L' U2 R' B2 R' B' F' R2 U' "
caption 9961," Algorithme en cours d'exécution : " caption 9962,algo$ show 9962 Execut_Algo(algo$)
END_SUB rem ============================================================================ ' M2 E2 S2 SUB CheckerBoard() dim_local algo$,inverse$ algo$ = " M2 E2 S2 " caption 9961," Algorithme en cours d'exécution : " caption 9962,algo$ show 9962 Execut_Algo(algo$) inverse$ = " S2 E2 M2 " caption 9961," Algorithme terminé : " caption 9962,algo$ Reinit_Rubiks(inverse$)
END_SUB rem ============================================================================ ' M2 U2 M2 U2 SUB Hi() dim_local algo$,inverse$,i algo$ = " M2 U2 M2 U2 " caption 9961," Algorithme en cours d'exécution : " caption 9962,algo$ : show 9962 Execut_Algo(algo$) inverse$ = " U2 M2 U2 M2 " caption 9961," Algorithme terminé : " caption 9962,algo$
END_SUB rem ============================================================================ ' U2 R2 L2 U2 R2 L2 SUB Plus_Minus() dim_local algo$,inverse$,i algo$ = " U2 R2 L2 U2 R2 L2 " inverse$ = " L2 R2 U2 L2 R2 U2 " caption 9961," Algorithme en cours d'exécution : " caption 9962,algo$ : show 9962 Execut_Algo(algo$)
END_SUB rem ============================================================================ ' R2 D2 R2 U2 R2 F2 U2 D2 F2 U2 SUB Flower_with_stem() dim_local algo$,inverse$ algo$ = " R2 D2 R2 U2 R2 F2 U2 D2 F2 U2 " caption 9961," Algorithme en cours d'exécution : " caption 9962,algo$ : show 9962 Execut_Algo(algo$) inverse$ = " U2 F2 D2 U2 F2 R2 U2 R2 D2 R2 " caption 9961," Algorithme en cours d'exécution : " caption 9962,algo$ Reinit_Rubiks(inverse$) END_SUB rem ============================================================================ SUB Execut_Algo(algo$) dim_local r$,espace$,l,i algo$ = trim$(algo$) : ' retirer les espaces du debut de la fin algo$ = algo$ + " " : ' ajouter un espace à la fin l = len(algo$) espace$ = " " i = 1 : r$ = mid$(algo$,i,1) while i < l if mid$(algo$,i+1,1) = espace$ Execut(r$) : i = i+2 : r$ = mid$(algo$,i,1) else if mid$(algo$,i+1,1) = "2" execut(r$) : execut(r$) : i = i+3 : r$ = mid$(algo$,i,1) else if mid$(algo$,i+1,1) = "'" execut(r$ + "'") : i = i+3 : r$ = mid$(algo$,i,1) end_if end_if end_if end_while
END_SUB rem ============================================================================ SUB Execut(r$) ' ------------- Rotation autour de l'Axe Z --------------------------------- if r$ = "L" then rotation_couronne(90,"z",-2) : exit_sub if r$ = "M" then rotation_couronne(90,"z",0) : exit_sub if r$ = "R'" then rotation_couronne(90,"z",2) : exit_sub if r$ = "L'" then rotation_couronne(-90,"z",-2): exit_sub if r$ = "M'" then rotation_couronne(-90,"z",0) : exit_sub if r$ = "R" then rotation_couronne(-90,"z",2) : exit_sub ' -------------- Rotation autour de l'axe X -------------------------------- if r$ = "F" then rotation_couronne(-90,"x",-2): exit_sub if r$ = "S" then rotation_couronne(-90,"x",0) : exit_sub if r$ = "B'" then rotation_couronne(-90,"x",2) : exit_sub if r$ = "F'" then rotation_couronne(90,"x",-2) : exit_sub if r$ = "S'" then rotation_couronne(90,"x",0) : exit_sub if r$ = "B" then rotation_couronne(90,"x",2) : exit_sub ' -------------- Rotation autour de l'axe Y -------------------------------- if r$ = "U" then rotation_couronne(90,"y",2) : exit_sub if r$ = "E" then rotation_couronne(90,"y",0) : exit_sub if r$ = "D" then rotation_couronne(90,"y",-2) : exit_sub if r$ = "U'" then rotation_couronne(-90,"y",2) : exit_sub if r$ = "E'" then rotation_couronne(-90,"y",0) : exit_sub if r$ = "D'" then rotation_couronne(-90,"y",-2) ' -------------------------------------------------------------------------- END_SUB rem ============================================================================ SUB Reinit_Rubiks(inverse$) if message_confirmation_yes_no("Voulez-vous réinitialiser le rubik's cube ?") = 1 caption 9961," Algorithme en cours d'exécution : " caption 9962,inverse$ execut_algo(inverse$) caption 9961," Algorithme terminé : Le Rubik's cube est initialisé" end_if END_SUB rem ============================================================================ SUB Aide() message "pas encore" END_SUB rem ============================================================================ SUB Propos() message "pas encore" END_SUB rem ============================================================================
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 10 Oct 2022 - 13:06
Bonjour à tous Heureux de te lire Papidall peux tu me dire quelle version tu utilise?
Papydall a écrit:
dir_change dir_current$ + "\Images"
avec 0929i11 j'ai une erreur Merci d'avance
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
Sujet: Re: Projet d'un Rubik's cube en 3D Lun 10 Oct 2022 - 14:33
Bonjour mindstorm
J'utilise également la dernière version, la 0.9.29i11. D'ailleurs, peu importe la version. L'erreur que tu signales est dûe certainement à ce que tu n'as pas créé le sous-dossier Images Dans le dossier où se trouve le programme, crée un sous-dossier Images et transfère dans ce sous-dossier, les fichiers cube.3ds , cube.bmp ainsi que les autres images des flèches et tout ira bien.
Sinon, mets la ligne 96 en REM
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 10 Oct 2022 - 15:22
Merci Papydall Peux tu me dire ou sont les images des flèches? merci d'avance
PS je viens de lire ton programme, MERCI "du grand Art"
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
Sujet: Re: Projet d'un Rubik's cube en 3D Lun 10 Oct 2022 - 17:47
J'ai téléchargé le programme à partir de : rubikscube
Le dossier contient : cube.3ds cube.bmp FlecheXb.bmp etc.. RubiksCube.bas
C'est sur ce RubiksCube.bas que j'ai apporté mes modifications et ajouts. Personnelement, j'ai créé dans le dossier RUBIKS CUBE qui se trouve sur le bureau, un dossier Images et j'ai transféré dans ce sous-dossiers les fichiers suivants : cube.3ds cube.bmp FlecheXb.bmp FlecheXh.bmp FlecheYd.bmp FlecheYg.bmp FlecheZb.bmp FlecheZh.bmp
NB : Pour utiliser mon code, tu dois avoir : Un dossier contenant : le programme .bas et le sous-dossier Images
Mais si tu veux que tous les fichiers soient dans le même dossier RUBIKS CUBE, tu dois supprimer dans mon programme la ligne 96 dir_change dir_current$ + "\Images"
Voilà !
Bon après-midi
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 10 Oct 2022 - 17:57
Bonjour les amis !
Je vois que les cubes ça intéresse les Panoramiciens (Et peut être aussi les Panoramiciennes ?)
Ca avance de tous les cotés... En individuel, en groupe... Super les amis !!
J'ai vu que Marc a mis une procédure de déplacement du cube. Il va falloir l'intégrer dans le programme. Et concernant l'amélioration de Silverman aussi...
Je réfléchis à une nouvelle version des fléchés de déplacement...
Au fait... Est il possible de cliquer sur des tuiles 3D ou d'interagir dessus ??
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 Mer 12 Oct 2022 - 20:58
@Mindstorm Pour m'aider avec les rotations, je me suis fais un petit programme qui ajoute du texte (+X,-X,+Y,-Y,+Z,-Z et un numéro) sur la texture de marc. Ca m'a vraiment bien aidé pour l'orientation des cubes:
Code:
height 0,600 color 0,64,64,64 picture 10 height 10,512 width 10,512 ' dir_change "C:\Program Files\Panoramic Editor V 0.9.25\RUBIKS_CUBES_3D_MESH" ' image 2
file_load 10,"cubeMARC.bmp"
2d_target_is 10
print_target_is 10 :' Diriger la sortie de PRINT vers le PICTURE FONT_NAME 10,"arial black" font_size 10,40 :' Taille des caractères
2d_fill_off :' désaciver le background du texte(le rendre transparent) font_color 10,255,255,255 :' couleur du texte
dim d,e,txt$ d=128 for e=1 to 1 file_load 10,"cubeMARC.bmp" txt$=str$(e) print_locate 16+d,2 : print txt$ : print_locate 30+d,52 : print "+Y"
' if file_exists(txt$)=1 then file_delete txt$ : pause 500 : file_save 10,txt$ next e
J'espère que ca te sera aussi utile que ça l'a été pour moi.
@Minibug
minibug a écrit:
Au fait... Est il possible de cliquer sur des tuiles 3D ou d'interagir dessus ??
Ca n'a encore jamais été vu, alors je dirais peut-être. Je vais faire des tests pour voir. C'est pour faire quoi ?
J'ai revu et nettoyé entièrement le code, un gros bug a été corrigé. Pour en faire un jeu, J'y ai ajouté les procédures: ' rotation_invisible_couronne(Angle_rot%,axe$,face$) : les rotations ne sont pas visibles, le mélange des faces est plus rapide ' reset_cube() : RAZ du rubiks cube ' sauvegarder_datas_cube() : sauvegarde l'état du rubiks cube avant un RAZ par exemple, sans modifier l'affichage en cours ' affiche_cube(grd%) : affiche le rubiks cube sauvegardé ' restaurer_datas_cube() : restaure l'état du rubiks cube après un RAZ, sans modifier l'affichage en cours Le nouveau code:
' MAIN ' ============================================================================== ' ' rotation_couronne(Angle_rot%,axe$,face$) ' ' Angle_rot% = +-90 ou +-180 ou +-270 ' axe$ = "x" ou "y" ou "z" ' face$ = "-2" ou "0" ou "2" ' ' ==============================================================================
' ============================================================================== ' ' rotation_invisible_couronne(Angle_rot%,axe$,face$) ' ' Angle_rot% = +-90 ou +-180 ou +-270 ' axe$ = "x" ou "y" ou "z" ' face$ = "-2" ou "0" ou "2" ' ' ==============================================================================
' Rotations visible ' ' ' mélanger 3 fois for nombre_de_rotation% = 1 to 3 Angle_rot% = aleatoire%(1,3) * 90 * sgn(rnd(1)-0.5) ' ' pas 2 fois le même axe axe_old = axe_new repeat axe_new = aleatoire%(1,3) until axe_new <> axe_old select axe_new case 1: axe$="x" case 2: axe$="y" case 3: axe$="z" end_select ' select aleatoire%(1,3) case 1: face$="-2" case 2: face$="0" case 3: face$="2" end_select ' caption 0,"Test n°"+str$(nombre_de_rotation%)+" : Angle = "+str$(Angle_rot%)+"° / Axe = "+axe$+" / Couronne = "+face$ ' ' les rotations du rubiks cube sont visibles rotation_couronne(Angle_rot%,axe$,face$) ' next nombre_de_rotation%
' mémoriser l'état du rubiks cube caption 0,"Sauvegarde du rubiks cube" sauvegarder_datas_cube() ' 2d_image_copy 100,0,0,500,400 2d_image_paste 100,0,500 :' débogage message "Le rubiks cube est sauvegardé"
' RAZ caption 0,"Reset" reset_cube() message "Le rubiks cube à été remis à zéro"
' réafficher le rubiks cube caption 0,"Restaurer le rubiks cube cube" restaurer_datas_cube() affiche_cube(sauvegarde%) message "Le rubiks cube est restauré"
reset_cube() message " Les rotations ne sont plus visible"
' Rotations cachée ' ' ' mélanger 3 fois for nombre_de_rotation% = 1 to 3 Angle_rot% = aleatoire%(1,3) * 90 * sgn(rnd(1)-0.5) ' ' pas 2 fois le même axe axe_old = axe_new repeat axe_new = aleatoire%(1,3) until axe_new <> axe_old select axe_new case 1: axe$="x" case 2: axe$="y" case 3: axe$="z" end_select ' select aleatoire%(1,3) case 1: face$="-2" case 2: face$="0" case 3: face$="2" end_select ' caption 0,"Test n°"+str$(nombre_de_rotation%)+" : Angle = "+str$(Angle_rot%)+"° / Axe = "+axe$+" / Couronne = "+face$ ' ' les rotations du rubiks cube ne sont pas visible rotation_invisible_couronne(Angle_rot%,axe$,face$) ' next nombre_de_rotation% ' message "On va visualiser et sauvegarder le rubiks cube mélangé" caption 0,"Visualisation et sauvegarde" affiche_cube(original%) ' mémoriser l'état du rubiks cube sauvegarder_datas_cube() ' 2d_image_copy 100,0,0,500,400 2d_image_paste 100,0,500 :' débogage message "Le rubiks cube a été sauvegardé"
' RAZ caption 0,"Reset" reset_cube() message "Le rubiks cube à été remis à zéro"
' réafficher le rubiks cube caption 0,"Restaurer le rubiks cube cube" restaurer_datas_cube() affiche_cube(sauvegarde%) message "Le rubiks cube est restauré"
caption 0,"Terminé"
END ' ==============================================================================
' ============================================================================== sub creation_scene() ' données stockées dans un grid create_hide grid original% ' left original%,500 : width original%,800 : height original%,680 : ' débogage pour CREATE_HIDE en rem grid_row original%,27 : grid_row_fixed original%,0 grid_column original%,11 : grid_column_fixed original%,0 hide original%
grid sauvegarde% :' grid de sauvegarde ' left sauvegarde%,500 : width sauvegarde%,800 : height sauvegarde%,680 :' débogage pour CREATE_HIDE en rem grid_row sauvegarde%,27 : grid_row_fixed sauvegarde%,0 grid_column sauvegarde%,11 : grid_column_fixed sauvegarde%,0 hide sauvegarde% create_show
' creation scène degrees
SCENE3D 2:HEIGHT 2,400:WIDTH 2,500 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 light_position -10,6,6
' on crée 27 cubes texturés FOR obj%=1 TO 27 ' txt$=str$(obj%) : 3D_MESH obj%:3D_LOAD_OBJECT obj%,"CUBE.3DS":3D_LOAD_TEXTURE obj%,"CUBE"+txt$+".BMP" :' débogage ' 3D_MESH obj%:3D_LOAD_OBJECT obj%,"CUBE.3DS":3D_LOAD_TEXTURE obj%,"CUBEmarcC.BMP" :' débogage 3D_MESH obj%:3D_LOAD_OBJECT obj%,"CUBE.3DS":3D_LOAD_TEXTURE obj%,"CUBEmarc.BMP" NEXT obj%
' X axe rouge, sens de rotation anti-horaire ' Y axe vert, sens de rotation horaire ' Z axe bleu, sens de rotation horaire
' placement et données 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 original%,obj%,1,str$(obj%) grid_write original%,obj%,posX%,str$(x) grid_write original%,obj%,posY%,str$(y) grid_write original%,obj%,posZ%,str$(z) ' grid_write original%,obj%,Orientation_X%,"1" grid_write original%,obj%,Orientation_Y%,"2" grid_write original%,obj%,Orientation_Z%,"3" next z next y next x ' pointeur pour reset 3d_cube 28,0.0000001 end_sub
' ============================================================================== 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 ' Orientation_%=pos%+6 rot%=pos%-2 ' for Angle%=0 to Angle_rot% step sgn(Angle_rot%)*vitesse_rotation% if Angle%<>0 for obj%=1 to 27 if grid_read$(original%,obj%,pos%)=face$ ' ' positions objX=val(grid_read$(original%,obj%,posX%)) objY=val(grid_read$(original%,obj%,posY%)) objZ=val(grid_read$(original%,obj%,posZ%)) Matrice_Rotation(objX,objY,objZ,Angle%,rot%) 3d_position obj%,x,y,z ' ' sens de rotation tmp%=val(grid_read$(original%,obj%,Orientation_X%)) if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%) tmp%=1*sgn(tmp%) else tmp%=val(grid_read$(original%,obj%,Orientation_Y%)) if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%) tmp%=2*sgn(tmp%) else tmp%=val(grid_read$(original%,obj%,Orientation_Z%)) tmp%=3*sgn(tmp%) end_if end_if ' if Orientation_%=Orientation_X% and abs(tmp%)>1 then tmp%=0-tmp% if Orientation_%=Orientation_Y% and abs(tmp%)=1 then tmp%=0-tmp% if Orientation_%=Orientation_Z% and abs(tmp%)=1 then tmp%=0-tmp% ' select tmp% case -3: 3d_z_rotate obj%,o3d_z_rotate(obj%)-vitesse_rotation%*sgn(Angle_rot%) case -2: 3d_y_rotate obj%,o3d_y_rotate(obj%)-vitesse_rotation%*sgn(Angle_rot%) case -1: 3d_x_rotate obj%,o3d_x_rotate(obj%)-vitesse_rotation%*sgn(Angle_rot%) case 1 : 3d_x_rotate obj%,o3d_x_rotate(obj%)+vitesse_rotation%*sgn(Angle_rot%) case 2 : 3d_y_rotate obj%,o3d_y_rotate(obj%)+vitesse_rotation%*sgn(Angle_rot%) case 3 : 3d_z_rotate obj%,o3d_z_rotate(obj%)+vitesse_rotation%*sgn(Angle_rot%) end_select end_if next obj% display end_if next Angle%
' mise à jour des données for obj%=1 to 27 if grid_read$(original%,obj%,pos%)=face$ ' ' positions objX=val(grid_read$(original%,obj%,posX%)) objY=val(grid_read$(original%,obj%,posY%)) objZ=val(grid_read$(original%,obj%,posZ%)) Matrice_Rotation(objX,objY,objZ,Angle_rot%,rot%) grid_write original%,obj%,posX%,str$(x) grid_write original%,obj%,posY%,str$(y) grid_write original%,obj%,posZ%,str$(z) ' ' sens de rotation tmp%=val(grid_read$(original%,obj%,Orientation_X%)) if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%) tmp%=1*sgn(tmp%) else tmp%=val(grid_read$(original%,obj%,Orientation_Y%)) if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%) tmp%=2*sgn(tmp%) else tmp%=val(grid_read$(original%,obj%,Orientation_Z%)) tmp%=3*sgn(tmp%) end_if end_if ' if Orientation_%=Orientation_X% and abs(tmp%)>1 then tmp%=0-tmp% if Orientation_%=Orientation_Y% and abs(tmp%)=1 then tmp%=0-tmp% if Orientation_%=Orientation_Z% and abs(tmp%)=1 then tmp%=0-tmp% ' objX=val(grid_read$(original%,obj%,Orientation_X%)) objY=val(grid_read$(original%,obj%,Orientation_Y%)) objZ=val(grid_read$(original%,obj%,Orientation_Z%)) ' select tmp% case -3: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%) case -2: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%) case -1: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%) case 1 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%) case 2 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%) case 3 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%) end_select ' grid_write original%,obj%,Orientation_X%,str$(x) grid_write original%,obj%,Orientation_Y%,str$(y) grid_write original%,obj%,Orientation_Z%,str$(z) ' end_if next obj% end_sub
' ============================================================================== sub rotation_invisible_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 ' Orientation_%=pos%+6 rot%=pos%-2 ' ' mise à jour des données for obj%=1 to 27 if grid_read$(original%,obj%,pos%)=face$ ' ' positions objX=val(grid_read$(original%,obj%,posX%)) objY=val(grid_read$(original%,obj%,posY%)) objZ=val(grid_read$(original%,obj%,posZ%)) Matrice_Rotation(objX,objY,objZ,Angle_rot%,rot%) grid_write original%,obj%,posX%,str$(x) grid_write original%,obj%,posY%,str$(y) grid_write original%,obj%,posZ%,str$(z) ' ' sens de rotation tmp%=val(grid_read$(original%,obj%,Orientation_X%)) if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%) tmp%=1*sgn(tmp%) else tmp%=val(grid_read$(original%,obj%,Orientation_Y%)) if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%) tmp%=2*sgn(tmp%) else tmp%=val(grid_read$(original%,obj%,Orientation_Z%)) tmp%=3*sgn(tmp%) end_if end_if ' if Orientation_%=Orientation_X% and abs(tmp%)>1 then tmp%=0-tmp% if Orientation_%=Orientation_Y% and abs(tmp%)=1 then tmp%=0-tmp% if Orientation_%=Orientation_Z% and abs(tmp%)=1 then tmp%=0-tmp% ' objX=val(grid_read$(original%,obj%,Orientation_X%)) objY=val(grid_read$(original%,obj%,Orientation_Y%)) objZ=val(grid_read$(original%,obj%,Orientation_Z%)) ' select tmp% case -3: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%) case -2: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%) case -1: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%) case 1 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%) case 2 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%) case 3 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%) end_select ' grid_write original%,obj%,Orientation_X%,str$(x) grid_write original%,obj%,Orientation_Y%,str$(y) grid_write original%,obj%,Orientation_Z%,str$(z) ' end_if next obj% end_sub
' ============================================================================== sub reset_cube() 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 ' ' position et orientation mémorisées dans un grid 3d_position obj%,x,y,z ' 3d_rotate obj%,0,0,0 : troisD_point_position(obj%,0,0,0) : troisD_point_position(obj%,0,0,1) : ' RAZ cube ' ' positions et orientations initiales mémorisées dans un grid ' grid_write 1,obj%,1,str$(obj%) grid_write original%,obj%,posX%,str$(x) grid_write original%,obj%,posY%,str$(y) grid_write original%,obj%,posZ%,str$(z) ' grid_write original%,obj%,Orientation_X%,"1" grid_write original%,obj%,Orientation_Y%,"2" grid_write original%,obj%,Orientation_Z%,"3" next z next y next x display end_sub
' ============================================================================== sub sauvegarder_datas_cube() for obj%=1 to 27 for I%=1 to Orientation_Z% grid_write sauvegarde%,obj%,I%,grid_read$(original%,obj%,I%) next I% next obj% end_sub
' ============================================================================== sub restaurer_datas_cube() for obj%=1 to 27 for I%=1 to Orientation_Z% grid_write original%,obj%,I%,grid_read$(sauvegarde%,obj%,I%) next I% next obj% end_sub
' ============================================================================== sub orienter(obj%,x,z) select z case -1: 3d_y_rotate obj%,270 select x case 3 : 3d_z_rotate obj%,0 case 2 : 3d_z_rotate obj%,90 case -3: 3d_z_rotate obj%,180 case -2: 3d_z_rotate obj%,270 end_select case 1 : 3d_y_rotate obj%,90 select x case -3: 3d_z_rotate obj%,0 case 2 : 3d_z_rotate obj%,90 case 3 : 3d_z_rotate obj%,180 case -2: 3d_z_rotate obj%,270 end_select case -2: 3d_x_rotate obj%,270 select x case 1 : 3d_z_rotate obj%,0 case 3 : 3d_z_rotate obj%,90 case -1: 3d_z_rotate obj%,180 case -3: 3d_z_rotate obj%,270 end_select case 2 : 3d_x_rotate obj%,90 select x case 1 : 3d_z_rotate obj%,0 case -3: 3d_z_rotate obj%,90 case -1: 3d_z_rotate obj%,180 case 3 : 3d_z_rotate obj%,270 end_select case -3: 3d_x_rotate obj%,180 select x case 1 : 3d_z_rotate obj%,0 case -2: 3d_z_rotate obj%,90 case -1: 3d_z_rotate obj%,180 case 2 : 3d_z_rotate obj%,270 end_select case 3 : 3d_x_rotate obj%,0 select x case 1 : 3d_z_rotate obj%,0 case 2 : 3d_z_rotate obj%,90 case -1: 3d_z_rotate obj%,180 case -2: 3d_z_rotate obj%,270 end_select end_select 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 aleatoire%(aleatoire_mini,aleatoire_maxi) result int(rnd((aleatoire_maxi-aleatoire_mini)+0.999999999))+aleatoire_mini end_fnc
Dernière édition par silverman le Mer 12 Oct 2022 - 21:08, é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 Mer 12 Oct 2022 - 21:07
Bonsoir Silverman et bonsoir à tous,
Je suis le fil de la discussion de loin. Je n'ai pas repris le code depuis l'installation des flèches.
Silverman a écrit:
Ca n'a encore jamais été vu, alors je dirais peut-être. Je vais faire des tests pour voir. C'est pour faire quoi ?
En fait au lieu de mettre des Picture sur des Panel je pensais installer des tuiles orientés dans le sens des faces. Avec en habillage la flèche correspondante. Mais le soucis c'est comment cliquer sur la tuile ?
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 Jeu 13 Oct 2022 - 18:12
Merci silverman pour ces textures. Mon problème était tout autre et seulement du à mon manque de pratique... L'axe des Z est orienté vers l'écran, je le voyais sur mon trièdre mais l'information n'allait pas jusqu'à mon cerveau. Heureusement Marc m'a remis dans le droit chemin. Pour la suite, j'y travail lentement quand il me reste du temps. encore merci pour ton partage