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 |
---|
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 Jeu 13 Oct 2022 - 18:36 | |
| Après qq tests, c'est possible de cliquer sur un objet 3D: - Code:
-
' ' Création de 2 sphères, une proche de l'écran et l'autre loin de celui-ci ' Les sphères sont déplacées suivant les mouvements de la souris. Elles sont dessous le pointeur de la souris ' Les spheres représentent les extrémités d'un rayon qui va traverser les objets à tester. ' Un test de collision est effectué sur un clic droit et l'objet testé change de couleur s'il est "cliqué" ' ' Par tatonnement : ' h_FOV = 90 ° et r = 1440.0 / 2270.0 (r = aspect ratio) ' v_FOV = 2.0 * atn( tan(h_FOV/2.0) * r) ' v_FOV = 64.778916 °
' ' Dans cet exemple, le déplacement et l'orientation de la caméra ne sont pas pris en compte '
width 0,800 : height 0,600 full_space 0 degrees
dim v_fov,half_v_fov dim half_sh,half_sw dim lenght
dim SceneTD dim oldClic,newClic dim d_sphere_rouge,d_sphere_bleu
oldClic=0 newClic=0-1
caption 0,"Barre espace pour quitter"
' dlist 2 ' scene3d 1 color 1,192,192,192 width 1,800 : height 1,600 ' full_space 1
' cam_position 0,0,0 ' point_position 0,0.5,1 light_position 0,0,0
' Par défaut height(1) = 480 : valeur de référence pour calcul ' Calcul de la valeur de l'angle de l'étendue verticale en fonction de la hauteur du scene3D, pour height(1)=480(valeur par défaut); Cela donne le v_fov : ' v_fov=2.0*atn(1.0*(height(1)*3.0/2270.0)) : clipboard_string_copy str$(v_fov/2) : end
' FOV=64.778916 degrés (par expérimentation en panoramic car cette donnée n'est pas dans la doc) v_fov=64.778916 half_v_fov=v_fov/2.0 ' ' FOV half_sh=height_client(1)/2.0 half_sw=width_client(1)/2.0 ' ' Distance de la caméra à l'écran (focale) ' 480, parceque par défaut height(1) = 480(valeur de référence) ! ' lenght=(half_sh/tan(half_v_fov))*(480/height_client(1)) lenght=(480.0/2.0)/tan(half_v_fov) :' hauteur fixe
' Sphère rouge 3d_sphere 11,10 3d_color 11,255,0,0 d_sphere_rouge=1000 3d_position 11,0-half_sw,0,d_sphere_rouge
' Sphère bleu 3d_sphere 12,3 3d_color 12,0,0,255 d_sphere_bleu=100 3d_position 12,0,0-half_sh,d_sphere_bleu 3d_transparent 12,128
' Plans 3d_box 50,100,100,0.1 3d_color 50,0,255,0 3d_position 50,150,50,450 3d_collision_as_cube 50
3d_box 51,100,100,0.1 3d_color 51,0,255,0 3d_position 51,-150,50,450 3d_collision_as_cube 51
3d_box 52,600,50,0.1 3d_color 52,0,255,0 3d_position 52,0,50,500 3d_collision_as_cube 52
' Rayon très fin pour tests de collisions : placé entre les 2 sphères 3d_box 100,0.01,0.01,(d_sphere_rouge-d_sphere_bleu) 3d_position 100,100,10,(d_sphere_rouge+d_sphere_bleu)/2 3d_collision_as_cube 100
' L'oeil est placé en 0,0,0 et regarde vers 0,0,lenght SceneTD = 1
repeat ' Placer le rayon selon les mouvements de la souris deplacer_rayon_a_la_souris() ' ' Colorer un objet si on clique dessus select Mouse_Clicked(SceneTD) ' Clic gauche enfoncé case 1: if Check_Object_Click(50)=1 : 3d_color 50,255,255,0 : else : 3d_color 50,0,255,0 : end_if if Check_Object_Click(51)=1 : 3d_color 51,255,255,0 : else : 3d_color 51,0,255,0 : end_if if Check_Object_Click(52)=1 : 3d_color 52,255,255,0 : else : 3d_color 52,0,255,0 : end_if ' Clic gauche relaché case 0: 3d_color 50,0,255,0 3d_color 51,0,255,0 3d_color 52,0,255,0 end_select until scancode=32 terminate
END fnc Check_Object_Click(obj%) result o3d_collision(100,obj%) end_fnc
sub deplacer_rayon_a_la_souris() dim_local dist,Factor_red,Factor_blue,Factor ' ' Sphère rouge (éloignée) : placement selon les mouvements de la souris dist=d_sphere_rouge :' distance Factor_red=dist/lenght 3d_position 11,(half_sw-mouse_x_position(1))*Factor_red,(half_sh-mouse_y_position(1))*Factor_red,lenght*Factor_red
' Sphère bleu (proche) : placement selon les mouvements de la souris dist=d_sphere_bleu :' distance Factor_blue=dist/lenght 3d_position 12,(half_sw-mouse_x_position(1))*Factor_blue,(half_sh-mouse_y_position(1))*Factor_blue,lenght*Factor_blue ' Placement du rayon entre les 2 sphères ' d=(o3d_z_position(11)+o3d_z_position(12))/2 :' distance centrale entre les 2 extrémités (représenté par les sphères) dist=(lenght*(Factor_red+Factor_blue))/2 :' distance centrale entre les 2 extrémités (représenté par les sphères) Factor=dist/lenght 3d_position 100,(half_sw-mouse_x_position(1))*Factor,(half_sh-mouse_y_position(1))*Factor,(lenght)*Factor ' Pointer le rayon vers la sphère rouge 3d_point_object 100,11 ' end_sub
fnc Mouse_Clicked(Mouse_Clicked_SceneTD) dim_local Mouse_Clicked_typ$ ' Mouse_Clicked_typ$="standard" Mouse_Clicked_typ$="avancé" ' ' Renvoi : ' -1 = no click ' 0 = click up ' 1 = click down ' oldClic=0 if Mouse_Clicked_typ$="avancé" ' renvoi 1 tant que bouton souris reste enfoncé, puis 0 puis -1 if mouse_left_down(Mouse_Clicked_SceneTD)=1 newClic=1 else if mouse_left_up(Mouse_Clicked_SceneTD)=1 : oldClic=1 : newClic = 0-1 : end_if end_if else ' renvoi 1 puis 0 puis -1 if mouse_left_up(Mouse_Clicked_SceneTD)=1 and newClic=0-1 newClic=1 else if newClic=0 then newClic=0-1 if newClic=1 then newClic=0 end_if end_if result oldClic+newClic end_fnc
La camera est placée en 0,0,0. Dès que sa position change, ça complique la donne. Je n'ai pas été si loin encore car c'est plus complexe en calcul à mon avis, et qu'il s'agit juste de montrer que le clic sur un objet 3D est détectable. EDIT du 17/10 : Fait des modifications dans le code et ajout de commentaires
Dernière édition par silverman le Lun 17 Oct 2022 - 15:01, édité 4 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 13 Oct 2022 - 22:59 | |
| Silverman,tu ne dois pas avoir de problème si tu tourne la camera. La preuve, d’abord la face tourne, les chiffres de control changent ensuite, quand tu actionne la rotation camera (flèche droite gauche haut et bas) les chiffres de rotation de l'objet 3D ne change pas "c'est la camera qui tourne". A minima il suffit d'avoir une sphère par face et une commande hide pour jouer à cache cache. Je crois même que tu devrais jumeler les mouvements des six sphères (une seul commande pour le tout) A toi de voir - Code:
-
label quitter,ActionRotationCameraxyp,ActionRotationCameraxym,ActionRotationCamerazp,ActionRotationCamerazm
scene3d 1:full_space 1 :color 1,240,234,199 form 2:Left 2,600:height 2,800:top 2,0:width 2,140 print_target_is 2 dim i%,j%,x,y,z,d,c,r,cub,mesh,rot(3,3,3),pos(3,3,3),B(2,2),A(2,2),camxy,camz,camp,xc,yc,zc ,y1% dim butxy,butz
camxy=45 camz=54.735 cam_position 10,10,10 triedre() CommandesManuel() CommandesRotationCamera() constructionmesh() constructioncube() positionmesh() chainage() wait 200 x=0:y=0:z=0 d=10 r=1 rotationprogressive() on_click 513,ActionRotationCameraxym on_click 514,ActionRotationCameraxyp on_click 515,ActionRotationCamerazp on_click 516,ActionRotationCamerazm end quitter: terminate return
ActionRotationCameraxyp: butxy=45 RotationCamera() butxy=0 return ActionRotationCameraxym: butxy=-45 RotationCamera() butxy=0 return ActionRotationCamerazp: butz=-45 RotationCamera() butz=0 return ActionRotationCamerazm: butz=45 RotationCamera() butz=0 return '___________________________________________________________________________ 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 CommandesManuel() button 501:top 501,50 :left 501,75:width 501,25 :height 501,25 :caption 501,"Front <" button 502:top 502,50 :left 502,100:width 502,25 :height 502,25 :caption 502,"Front >" button 503:top 503,50 :left 503,25:width 503,25 :height 503,25 :caption 503,"Lef <" button 504:top 504,50 :left 504,50:width 504,25 :height 504,25 :caption 504,"Lef >" button 505:top 505,50 :left 505,125:width 505,25 :height 505,25 :caption 505,"Right <" button 506:top 506,50 :left 506,150:width 506,25 :height 506,25 :caption 506,"Right >" button 507:top 507,25 :left 507,75:width 507,25 :height 507,25 :caption 507,"Up <" button 508:top 508,25 :left 508,100:width 508,25 :height 508,25 :caption 508,"Up >" button 509:top 509,75 :left 509,75:width 509,25 :height 509,25 :caption 509,"Down <" button 510:top 510,75 :left 510,100:width 510,25 :height 510,25 :caption 510,"Down >" button 511:top 511,100 :left 511,75:width 511,25 :height 511,25 :caption 511,"Back <" button 512:top 512,100 :left 512,100:width 512,25 :height 512,25 :caption 512,"Back >" end_sub
'__________________________________________________________________________ sub CommandesRotationCamera() button 513:top 513,200 :left 513,80:width 513,40 :height 513,40 :caption 513,"<left" button 514:top 514,200 :left 514,460:width 514,40 :height 514,40 :caption 514,"right>" button 515:top 515,10 :left 515,280:width 515,40 :height 515,40 :caption 515,"up >" button 516:top 516,400 :left 516,280:width 516,40 :height 516,40 :caption 516,"down >" end_sub '___________________________________________________________________________ sub control() cub=15 A(0,0)=0 A(0,1)=0 A(0,2)=0
A(1,0)=o3d_x_rotate (cub) A(1,1)=o3d_y_rotate (cub) A(1,2)=o3d_z_rotate (cub) print o3d_x_rotate (cub) print o3d_y_rotate (cub) print o3d_z_rotate (cub)
A(2,0)=sin (degree_to_radian (A(1,0))) A(2,1)=sin (degree_to_radian (A(1,1))) A(2,2)=sin (degree_to_radian(A(1,2))) print "cub 15 rotation" print " X A | "+ str$(A(0,0))+ " B | "+ str$(A(1,0))+ " C | "+ str$(A(2,0)) print " Y A | "+ str$(A(0,1))+ " B | "+ str$(A(1,1))+ " C | "+ str$(A(2,1)) print " Z A | "+ str$(A(0,2))+ " B | "+ str$(A(1,2))+ " C | "+ str$(A(2,2)) end_sub
'_________________________________________________________________________
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% control() end_sub
'_________________________________________________________________________
sub RotationZ() dim_local i,j,k print "rotaxeZ for k=1 to 90 camxy= 0+k camz= 90 camp=17 xc=camp*(sin(degree_to_radian (camz))*cos(degree_to_radian (camxy))) yc=camp*(sin(degree_to_radian (camz))*sin(degree_to_radian (camxy))) zc=camp* (cos(degree_to_radian (camz))) cam_position xc,yc,zc next k end_sub
sub RotationY() dim_local i,j,k print "rotaxeY for j=1 to 90 camxy=0 camz=0+j camp=17 xc=camp*(sin(degree_to_radian (camz))*cos(degree_to_radian (camxy))) yc=camp*(sin(degree_to_radian (camz))*sin(degree_to_radian (camxy))) zc=camp* (cos(degree_to_radian (camz))) cam_position xc,yc,zc next j end_sub
sub RotationX() dim_local i,j,k print "rotaxeX for i=1 to 90 camxy=270 camz= 0+i camp=17 xc=camp*(sin(degree_to_radian (camz))*cos(degree_to_radian (camxy))) yc=camp*(sin(degree_to_radian (camz))*sin(degree_to_radian (camxy))) zc=camp* (cos(degree_to_radian (camz))) cam_position xc,yc,zc next i end_sub
sub RotationCamera() print "rotaxe cub camxy= camxy+butxy camz= camz+butz camp=17.32 xc=camp*(cos(degree_to_radian (camz))*cos(degree_to_radian (camxy))) zc=camp*(cos(degree_to_radian (camz))*sin(degree_to_radian (camxy))) yc=camp* (sin(degree_to_radian (camz))) cam_position xc,yc,zc ' orientation de la caméra par MARC. y1% = wrap_value(camz) if (y1% >= 0 and y1% < 90) or (y1% > 270 and y1% < 360) cam_roll 0 else cam_roll 180 end_if control() 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 Ven 14 Oct 2022 - 10:45 | |
| @mindstorm Non non, je ne parle pas de la camera du rubiks cube, mais de celle du code que j'ai posté ci-dessus. Il s'agit d'un programme qui permet de détecter le clic sur un objet 3D. Comme la caméra est fixe et positionnée en 0,0,0, le rayon qui détecte les collisions est bien positionné. C'est un code que j'ai fait vite fait, mais si la caméra bouge, il faut recalculer la position du rayon. Je n'ai encore inclu cette possibilité car ça me semble à première vue un peu plus compliqué, mais pas infaisable. | |
| | | 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 Ven 14 Oct 2022 - 12:25 | |
| Bonjour à tous !
@Silverman : Merci d'avoir pris le temps de cette réflexion. houlà c'est déjà bien compliqué pour moi ! donc je vais éliminer cette solution même si elle semble réalisable ! | |
| | | 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 15 Oct 2022 - 11:39 | |
| - silverman a écrit:
- mais si la caméra bouge, il faut recalculer la position du rayon.
As tu essayé de lancer la sphère sur la tuile? J'avais codé assez facilement un robot autonome qui devait éviter des murs. Le code est dans mon webmail | |
| | | 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 17 Oct 2022 - 15:11 | |
| J'ai une vague idée de comment faire sans lancer la sphère sur la tuile. Obtenir le vecteur d'orientation de la caméra ne semble pas bien compliqué, alors je vais voir ça. J'étudierai ton code à l'occasion, mais je ne vois pas lequel est-ce dans ton webdav. | |
| | | 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 17 Oct 2022 - 23:12 | |
| @silvermann Passe voir le mini pelle @Papydall Après avoir digéré les coordonnées sphérique (j'espère avoir fait le tour ce soir) Peux tu me fournir tes équations pour obtenir Artang et Arcos ? merci d'avance | |
| | | 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 Mar 18 Oct 2022 - 1:24 | |
| Bonsoir Mindstorm,
J’ai voulu aller voir ton programme « mini pelle ». Je ne l’ai pas trouvé dans ton WebDAV. Quoi qu’il en soit, cela m’a permis de découvrir avec plaisir ton programme 3D Architekt et ta palette de couleurs. Ce sont de belles réalisations fonctionnelles et efficaces.
Autrement, si tu cherches les fonctions arc tangente et arc cosinus, elles existent sous Panoramic : ATN(V) et ACOS(V).
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 Mar 18 Oct 2022 - 18:10 | |
| Bonsoir Marc merci pour les opérateurs mathématique. Je viens de remettre la minipelle en ligne. Avec toutes me excuses
PS quelqu'un connait il l'alternative à la fonction atan2(x,y)? | |
| | | 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 19 Oct 2022 - 10:56 | |
| - Mindstorm a écrit:
- PS quelqu'un connait il l'alternative à la fonction atan2(x,y)?
Voici la fonction atan2(y,x). Le résultat est en radians. Si tu souhaites des degrés, multiplie le résultat par 180/PI. - Code:
-
dim x,y y=1 x=0 print atan2(y,x) end ' ------------------------------------------------------------------------------ fnc atan2(y,x) if x=0 and y=0 message "Indéfini" exit_fnc end_if if x>0 result atn(y/x) else if x<0 and y >=0 result atn(y/x)+PI else if x<0 and y<0 result atn(y/x)-PI else if x=0 and y>0 result PI/2 else if x=0 and y<0 result PI/2*(-1) end_if end_if end_if end_if end_if end_fnc Le lien Wikipédia qui m'a permis de créer la fonction atan2(y,x) : https://en.wikipedia.org/wiki/Atan2 | |
| | | 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 Mer 19 Oct 2022 - 13:28 | |
| Une très mauvaise nouvelle pour moi. Depuis deux jours j'étais victime d'un vilain ransomware. Tous mes fichiers (photos, documents, programmes, etc..) ont étés cryptés par ce virus avec comme extension .tury
Des centaines de programmes en Panoramic, en Free Basic, en Python, etc ont été perdus. Et il est presqu'impossible de décrypter : il faut payer 980 $. Je préfère formater mon PC et tout perdre afin de recommencer à partir de zéro, que de payer le moidre centime à ces types de "salaupards"! Je m'excuse pour ce hors-sujet et je réponds à mindstorm - Code:
-
rem ============================================================================ rem Fonction Atn2(y,x) rem Arc tangente de Y/X : retourne les valeurs dans les 4 quadrants en radians rem ============================================================================ dim x,y width 0,700 caption 0,"La fonction ATN2(y,x) retourne les valeurs de l'Arc Tangente de y / x dans les 4 quadrants" memo 10 : top 10,20 : left 10,20 : width 10,300 : height 10,400 memo 20 : top 20,20 : left 20,350 : width 20,300 : height 20,400 item_add 10," Valeurs en Radians par défaut" : item_add 10,"" item_add 20," Valeurs converties en degrés" : item_add 20,"" for x = -2 to 2 for y = -2 to 2 item_add 10, " x = " +str$(x) + " y = " + str$(y) + " atn2(y,x) = "+ str$(atn2(y,x)) item_add 20, " x = " +str$(x) + " y = " + str$(y) + " atn2(y,x) = "+ str$(radian_to_degree(atn2(y,x))) next y next x end rem ============================================================================ ' Atn2(y,x) : Arc tangente de Y/X ' arc tangente de Y/X --> retourne les valeurs dans les 4 quadrants FNC Atn2(y,x) If x = 0 result Sgn(y) * pi/2 Else If x > 0 result Atn(y / x) Else if x < 0 and y = 0 result atn(y / x) - sgn(x) * pi else result Atn(y / x) + Sgn(y) * pi end_if End_If end_if END_FNC rem ============================================================================
Ps : Je n'ai pas vu la réponse de Marc avant de publier mon message. Bon, c'est une autre façon de coder la dite fonction Atn2(y,x) NB : pour x = 0 et y = 0 la plus part de langage donnent 0 comme résultat.EDITCode édité selon l'anomalie relévée par Marc
Dernière édition par papydall le Mer 19 Oct 2022 - 17:07, é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 Mer 19 Oct 2022 - 14:36 | |
| Bonjour Papydall ! Je suis désolé pour cette histoire de virus. Après avoir modifié ton source pour afficher côte à côte ta fonction atn2() et ma fonction atan2(), j'ai remarqué que les résultats ne sont pas identiques. L’anomalie est située dans ton source, lignes 14 et 15. Les paramètres y et x sont inversés : | |
| | | 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 Mer 19 Oct 2022 - 17:10 | |
| Merci Marc. J'ai édité mon code ci-dessus. Je suis vraiment navré d'avoir perdu tout! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Projet d'un Rubik's cube en 3D Mer 19 Oct 2022 - 17:32 | |
| Désolé papydall pour ce qui t'est arrivé... Évidemment tu as eu raison de ne pas céder, mais quand même, ça fait froid dans le dos. Perso je fais régulièrement des sauvegardes sur un disque externe, mais malgré ça, on perd forcément beaucoup de choses. | |
| | | 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 19 Oct 2022 - 18:27 | |
| @papydall Je suis de tout cœur avec toi, c'est toujours une catastrophe ces choses là. Pour ma part, j'ai acquis une méfiance légitime pour l'informatique lorsque je me suis assis (au sens propre) en 1990 sur un PSION et par là même j'ai perdu 1000 clients. C'est encore autre chose, j'imagine, de se faire pirater et nous ne sommes jamais totalement à l'abri.
Merci à Marc et toi pour le code, je vais pouvoir les comparer avec le mien (fini entre midi et deux) | |
| | | 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 19 Oct 2022 - 19:17 | |
| Je suis désolé pour toi Papydall. Encore les programmes c'est pas le plus grave, mais les photos c'est plus triste, et les documents ça c'est le plus importants ! C'est vrai qu'on ne pense pas assez à faire des copies mais on devrait pourtant faire plusieurs sauvegardes et stocker à différents endroits. Ma maison a brulée il y a une 15 d'années et j'avais à l'époque tout perdu comme toi avec pourtant des copies sur disque dur externe. mais il a aussi disparu dans l'incendie ! C'est vrai que ces virus, ransomwares et autres sont une plaie pour l'informatique ! Vraiment très peiné de ce qui t'arrive et pas de problème pour le hors sujet. | |
| | | 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 19 Oct 2022 - 20:48 | |
| Merci, je viens de trouver mon erreur grâce à vos encouragements. Mon plaisir est de ne pas copier, malheureusement cela ne donne pas un code aussi lisible que les vôtres et bien sur Quand ce n'est pas lisible..... bref un % qui avait disparu! - Code:
-
rem " Programme RUBICKS CUBE par Mindstorm rem" Mais avec l'aide de pas mal de monde! Rem" dans l'ordre alphabetique rem" Jack marc minibub papydall silverman
label quitter,ActionRotationCameraxyp,ActionRotationCameraxym,ActionRotationCamerazp,ActionRotationCamerazm
scene3d 1:full_space 1 :color 1,240,234,199 form 2:Left 2,600:height 2,800:top 2,0:width 2,140 print_target_is 2 dim i%,j%,x,y,z,d,c,r,cub,mesh,rot(3,3,3),pos(3,3,3),B(2,2),A(2,2),camxy,camz,camp ,y1% dim butxy,butz,xc%,yc%,zc% ,xcux%,ycux%,zcux% ,xcuy%,ycuy%,zcuy%,xcuz%,ycuz%,zcuz% dim anglconstrxy,anglconstrz dim calp,calxy,calz,xcal%,ycal%,zcal% ,correctifatan% ,correccal%
camxy=45 camz=54.735 cam_position 10,10,10
triedre() CommandesManuel() CommandesRotationCamera() constructionmesh() constructioncube() positionmesh() chainage() controlCam() rem "zone programme en cours" wait 200 x=0:y=0:z=0 d=10 r=1 rotationprogressive() rem "fin de zone" on_click 513,ActionRotationCameraxym on_click 514,ActionRotationCameraxyp on_click 515,ActionRotationCamerazp on_click 516,ActionRotationCamerazm
end quitter: terminate return '________________________________________________________________________ ActionRotationCameraxyp: butxy=45 RotationCamera() butxy=0 return ActionRotationCameraxym: butxy=-45 RotationCamera() butxy=0 return ActionRotationCamerazp: butz=-45 RotationCamera() butz=0 return ActionRotationCamerazm: butz=45 RotationCamera() butz=0 return '___________________________________________________________________________ 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+6,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 CommandesManuel() button 501:top 501,50 :left 501,75:width 501,25 :height 501,25 :caption 501,"Front <" button 502:top 502,50 :left 502,100:width 502,25 :height 502,25 :caption 502,"Front >" button 503:top 503,50 :left 503,25:width 503,25 :height 503,25 :caption 503,"Lef <" button 504:top 504,50 :left 504,50:width 504,25 :height 504,25 :caption 504,"Lef >" button 505:top 505,50 :left 505,125:width 505,25 :height 505,25 :caption 505,"Right <" button 506:top 506,50 :left 506,150:width 506,25 :height 506,25 :caption 506,"Right >" button 507:top 507,25 :left 507,75:width 507,25 :height 507,25 :caption 507,"Up <" button 508:top 508,25 :left 508,100:width 508,25 :height 508,25 :caption 508,"Up >" button 509:top 509,75 :left 509,75:width 509,25 :height 509,25 :caption 509,"Down <" button 510:top 510,75 :left 510,100:width 510,25 :height 510,25 :caption 510,"Down >" button 511:top 511,100 :left 511,75:width 511,25 :height 511,25 :caption 511,"Back <" button 512:top 512,100 :left 512,100:width 512,25 :height 512,25 :caption 512,"Back >" end_sub
'__________________________________________________________________________ sub CommandesRotationCamera() button 513:top 513,200 :left 513,80:width 513,40 :height 513,40 :caption 513,"<left" button 514:top 514,200 :left 514,460:width 514,40 :height 514,40 :caption 514,"right>" button 515:top 515,10 :left 515,280:width 515,40 :height 515,40 :caption 515,"up >" button 516:top 516,400 :left 516,280:width 516,40 :height 516,40 :caption 516,"down >" end_sub '___________________________________________________________________________ sub control() cub=15 anglconstrxy=45 :anglconstrz=54.735
A(0,0)=2.01 A(0,1)=2.01 A(0,2)=2.01 A(1,0)=o3d_x_rotate (cub) A(1,1)=o3d_y_rotate (cub) A(1,2)=o3d_z_rotate (cub)
print " cub" + str$ (cub) + " rotation" print " rcX | "+ str$(A(1,0)) print " rcY | "+ str$(A(1,1)) print " rcZ | "+ str$(A(1,2))
RotationCalcul()
end_sub
'_________________________________________________________________________
sub controlCam()
print_y_locate 0 print " " print " position Cam " print " Xcam |"+str$(xc%)+" " print " YCam |"+str$(yc%)+" " print " ZCam |"+str$(zc%)+" " print " "
end_sub
'________________________________________________________________________
sub RotationCamera() camxy= camxy+butxy camz= camz+butz camp=17.32 xc%=camp*(cos(degree_to_radian (camz))*cos(degree_to_radian (camxy))) zc%=camp*(cos(degree_to_radian (camz))*sin(degree_to_radian (camxy))) yc%=camp* (sin(degree_to_radian (camz))) cam_position xc%,yc%,zc% ' orientation de la caméra par MARC. y1% = wrap_value(camz) if (y1% >= 0 and y1% < 90) or (y1% > 270 and y1% < 360) cam_roll 0 else cam_roll 180 end_if controlCam() end_sub
'__________________________________________________________________________
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% control() end_sub
'_________________________________________________________________________
sub RotationCalcul() dim cal2xy, cal2z, cal2p
rem "zonne de programme en cours rem a suivre A(1,0) A(1,1) rem "fin de zone calxy= A(1,2)+anglconstrxy calz=anglconstrz calp=1.732 xcal%=calp*(sin(degree_to_radian (calz))*cos(degree_to_radian (calxy))) ycal%=calp*(sin(degree_to_radian (calz))*sin(degree_to_radian (calxy))) zcal%=calp* (cos(degree_to_radian (calz))) cal2p=sqr((xcal% *xcal%)+(ycal% *ycal%)+(zcal% * zcal%)) if (xcal%>0) cal2xy=atn(ycal%/xcal%) else if xcal% <0 and ycal% >=0 cal2xy=atn(ycal% /xcal%)+pi else if xcal% <0 and ycal% <0 cal2xy=atn(ycal% /xcal%)-pi else if xcal% =0 and ycal% >0 cal2xy=pi/2 else cal2xy% =-pi/2 end_if end_if end_if end_if cal2z=acos (zcal% /cal2p ) A(2,0)=(xcal% *A(0,0)) A(2,1)=(ycal% *A(0,1)) A(2,2)=(zcal% *A(0,2)) print_y_locate 160 print " résultat calcul " print " " print " mesh repère orthonormé " print " Xcal |"+str$(xcal%)+" " print " YCal |"+str$(ycal%)+" " print " ZCal |"+str$(zcal%)+" " print " " print " mesh repère spherique " print " Pcal2 |"+str$(cal2p)+" " print " Calxy2 |"+str$(radian_to_degree(cal2xy))+" " print " calz2 |"+str$(radian_to_degree(cal2z))+" " print " " print " mesh nouvelle position " print " X2 | "+ str$(A(2,0))+" " print " Y2 | "+ str$(A(2,1))+" " print " Z2 | "+ str$(A(2,2))+" "
end_sub
Il reste encore pas mal de choses à faire mais il n'y a plus de bug! la prochaine fois j'utiliserai fnc et result merci encore
Dernière édition par mindstorm le Mer 19 Oct 2022 - 22:56, édité 2 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 Mer 19 Oct 2022 - 22:30 | |
| Bonsoir à tous, Voici une idée de présentation pour réaliser le jeu du Rubik’s Cube. Le principe : Les icônes de rotation permettent de faire tourner la face souhaitée de 90° à chaque clic. La couleur de l’icône correspond à la couleur centrale de la face à faire tourner. Le "moteur" de rotation des faces, créé par Silverman, n’est malheureusement pas totalement compatible avec ce mode de commande. Peux-tu, s’il te plait Silverman, jeter un œil dessus ? Est-ce adaptable ? Sous les icônes de rotation, les deux suivantes permettront de mélanger et de restaurer le cube. Pour finir, les deux dernières icônes serviront à afficher le Mode d’emploi et à quitter le jeu. Le jeu possède un menu contextuel accessible depuis un clic droit. Les commandes peuvent être placées à gauche ou à droite du Rubik’s Cube, suivant si vous êtes droitier ou gaucher. Le clic gauche sur le cube permet d’orienter celui-ci par un cliquer-déplacer. L’action est possible uniquement si les faces ne sont pas en mouvement. Je vais travailler sur le Mode d’emploi et l’A propos. Le plus compliqué est d’adapter le "moteur" de rotation à ce principe de commande. J’espère que Silverman aura un peu de temps pour jeter un œil. Lien de téléchargement de cette version : https://e-nautia.com/yoda/disk?p=10364482Bonne programmation à tous ! | |
| | | 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 20 Oct 2022 - 0:02 | |
| @ Marc Merci pour ce code. J'ai téléchargé et j'ai testé
Dans le S/P melanger: select int(rnd(2)+1) donne un entier compris entre 1 (inclu) et 3 (exclu) Or tu distingues 3 trois cas 1, 2 et 3 Pour obtenir un aléatoire entier 1 , 2 ou 3 remplacer par : int(rnd(3)+1)
Autre minibug (salut Laurant !) : Le s/p reinitialiser ne fait pas son boulot correctement !
Bonne continuation!
(Avec ce maudit virus que j'ai attrappé j'éprouve beaucoup de diffucultés pour naviguer. Pas moins de 10 minutes pour pouvoir envoyer ce misérable 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 Jeu 20 Oct 2022 - 0:57 | |
| Merci Papydall pour ton intervention.
Effectivement, les sous-programmes melanger et reinitialiser entre-autres, ne sont pas codés. C’est juste un brouillon. Ils dépendront de l’algorithme de rotation des faces du cube quand celui-ci sera adapté au principe de fonctionnement du programme…
Pour l’instant ce n’est qu’une idée de présentation du jeu, une maquette.
Bon courage à toi pour remettre en état ta partie informatique.
| |
| | | 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 20 Oct 2022 - 7:28 | |
| Bonjour à tous ! @mindstorm : Je viens de tester ton dernier code. Certes il est incomplet, mais l'approche me semble sympa. Pour les déplacements il faudra voir une fois l'ensemble fonctionnel. @Marc : Bravo pour la partie graphique. Comme toujours tu te surpasse ! Par contre au niveau de la gestion des déplacements cela ne semble pas très pratique. du moins pour le moment. Je sais bien que ton code est en cours de développement, donc attendons de voir la suite. @Papydall : Merci pour le clin d'œil et bon courage à toi pour la suite... Très heureux de voir que vous être toujours intéressés par le sujet du Rubiks cube. Il faut dire que c'est un régal pour les programmeurs. Merci à tous pour vos interventions ! | |
| | | 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 Jeu 20 Oct 2022 - 14:22 | |
| @marc Bien sur que c'est adaptable, et même déjà fait . J'avais déjà identifié le problème, et normalement il a été corrigé ici, dans la dernière version du moteur . En plus dans celle-ci, la vitesse de rotation des couronnes a été accéléré (c'est paramétrable) ce qui est bien plus agréable. Je compte neuf "tranches" : en X sur -2, 0 et 2, pareil pour Y et Z. Soit 3 couronnes par axe, multiplié par 3 axes = 9 "tranches". Ton interface ne propose que 6 possibilité vers la droite ou la gauche, donc il doit y avoir des couronnes qui ne sont pas actionnées, celles du centre apparement. c'est bien ça ? @papydall Dans l'exemple de l'aide de la fonction rnd(), jack à écrit que rnd(3) donne un résultat compris entre 0 et 3. Donc cela sous-entend que 3 est inclu, alors que toi tu dis que c'est exclu. Tu es sûr de ton coup ? @minibug - minibug a écrit:
- Très heureux de voir que vous être toujours intéressés par le sujet du Rubiks cube.
Très bonne idée à la base! C'est d'autant plus plaisant que ce projet est codé en groupe. | |
| | | 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 20 Oct 2022 - 15:01 | |
| @Silverman Merci pour ta prompte réponse. Je n’avais pas vu ta version corrigée du moteur. Je vais essayer de l’intégrer dans ma dernière idée de présentation. Quant aux couronnes centrales, effectivement, dans un souci de simplification et de clarté, j’ai préféré faire l’impasse dessus.
| |
| | | 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 20 Oct 2022 - 15:37 | |
| - silverman a écrit:
@papydall Dans l'exemple de l'aide de la fonction rnd(), jack à écrit que rnd(3) donne un résultat compris entre 0 et 3. Donc cela sous-entend que 3 est inclu, alors que toi tu dis que c'est exclu. Tu es sûr de ton coup ? Suspect
Absolument sûr! C'est la définition même de la fonction RND() qui fourni une valeur flottante dans l'intervalle semi-fermé (ou semi-ouvert, si tu veux), ouvert à droite , fermé à gauche [0,1[ Et par conséquent RND(n) fourni un flottant entre 0 (inclu) et n (exclu) Voici un code qui confirme ce que j'affirme - Code:
-
dim r,zero,un,deux,trois,i
for i = 1 to 5000 r = int(rnd(3)) select r case 0 : zero = zero + 1 case 1 : un = un + 1 case 2 : deux = deux + 1 case 3 : trois = trois + 1 end_select next i print " La valeur 0 est apparue " + str$(zero) + " fois" print " La valeur 1 est apparue " + str$(un) + " fois" print " La valeur 2 est apparue " + str$(deux) + " fois" print " La valeur 3 est apparue " + str$(trois) + " fois"
| |
| | | 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 Jeu 20 Oct 2022 - 17:36 | |
| C'est juste papydall, et ça m'arrange ! Le fichier d'aide m'a induit en erreur . Merci à toi | |
| | | 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
| |
| |
| |