The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Un inutilitaire... Qui pourrait bien devenir utile Ven 21 Aoû 2015 - 23:49 | |
| Bonjour a tous, Voici ce que je suis en train de dévellopper (la 3D explose chez moi ;P)... Un petit outil permettant d'éditer facilement une carte 3D avec enregistrement des attributs des objets dans un fichier excel. A terme, le but est de pouvoir créer facilement tout les objets 3D supporté par PANORAMIC en ayant un aperçu rapide du rendu final. A la fin, un sysème traduira la MAP créée en PANORAMIC directement. Ca permettra de créer de jolies cartes 3D Rapidement. Voici une ébauche de cet outil qui demande Excel et ne gère pour le moment que les cubes: - Code:
-
' Merci Silverman pour ton code sur la position de la souris
' ======= Chargement des librairies ============ dll_on "user32"
' ======= On allume Excel des le début ========= hide 0 message "Veuillez patienter le temps que Excel s'ouvre" excel_start
' form 100 ' border_hide 100 ' top 100, screen_y/2-100 ' left 100, screen_x/2-200 ' height 100,200 ' width 100,400
' picture 101 ' parent 101,100 ' full_space 101 ' file_load 101,"Chargement.bmp"
' ======= Déclaration des label ======= ' Positionnnement de la souris label Scene_3d,Activation_scene3d,Quitter,Creation_cube,Activation_creer_cube,Nouveau_projet,Activation_modifier, Orientation_modification, Modification_cube
' ======= Déclaration des variables =======
' Activation de la scene_3d dim scene_active
' Paramètres de l'affichage dim demi_ecran_x% dim demi_ecran_y%
' Comportement de la souris dim souris_mouv_x dim souris_mouv_y dim init_pos_souris dim position_souris
' Repère sphérique et cartésiens pour le pointage caméra dim sph_point_teta dim sph_point_phi dim sph_point_R
dim cart_point_x dim cart_point_y dim cart_point_z
' Repère cartesien pour la position de la caméra dim cam_pos_x dim cam_pos_y dim cam_pos_z dim cam_ampli dim cam_osci dim cam_freq
' Position du pointeur 3d (autour duquel la caméra tourne) dim pos_pointeur_x dim pos_pointeur_y dim pos_pointeur_z dim vit_mouv_camera
' Repère sphérique + variables nécéssaire a la rotation de la caméra pendant le chargement dim cam_pos_phi
' Sensibilité de la souris dim sensi
' Paramètre du zoom caméra dim vitesse_zoom
' Variable de création d'objets dim num_premier_objet dim num_dernier_objet dim num_courant_objet dim type_courant_objet$
' Variables pour la lecture du fichier de sauvegarde dim a$ dim fichier_courant_bas$ dim fichier_courant_xls$ dim ligne$
' Compteurs pour boucle utilisés de multiples fois ' Compteur utilisés dans les timers dim i dim j ' Compteur hors timer dim f
' ======= Initialisation des variables =======
' Activité de la scene_3d scene_active = 0
' Position/sensibilité du pointeur sph_point_R = 3 sph_point_teta=0 sph_point_phi=0 sensi=0.5 vit_mouv_camera = 0.1
' Position du pointeur 3d (autour duquel la caméra tourne) pos_pointeur_x = 0 pos_pointeur_y = 0 pos_pointeur_z = 0
' Position de la caméra cam_pos_x = 0 cam_pos_y = 0 cam_pos_phi = 0
' Paramètres de la fenetre demi_ecran_x% = screen_x/2 demi_ecran_y% = screen_y/2
' Paramètre du zoom caméra vitesse_zoom = 0.1
' Initialisation des variables de création d'objet num_premier_objet = 1 num_dernier_objet = 1 num_courant_objet = 1
' ======= Initialisation de l'affichage =======
' Création de la fenetre caption 0,"Créateur de map" ' width 0,screen_x ' height 0,screen_y full_space 0 on_close 0,Quitter
' Création de la barre de menus main_menu 1
sub_menu 2 parent 2,1 caption 2,"Fichier" sub_menu 3 parent 3,2 caption 3,"Nouveau" on_click 3,Nouveau_projet sub_menu 4 parent 4,2 caption 4,"Quitter" on_click 4,Quitter
sub_menu 5 parent 5,1 caption 5,"Créer" inactive 5
sub_menu 6 parent 6,5 caption 6,"Cube" On_click 6,Activation_creer_cube
sub_menu 60 parent 60,1 caption 60,"Modifier" on_click 60,Activation_modifier inactive 60
' Création des objets de création ' --> Paramètre de position alpha 7 caption 7,"Position objet:" top 7,3 left 7,screen_x - 190
alpha 8 top 8,28 left 8,screen_x - 190 caption 8,"X:"
edit 9 top 9,25 height 9,20 left 9,screen_x-180 width 9,30
alpha 10 top 10,28 left 10,screen_x - 145 caption 10,"Y:"
edit 11 top 11,25 height 11,20 left 11,screen_x-135 width 11,30
alpha 12 top 12,28 left 12,screen_x - 95 caption 12,"Z:"
edit 13 top 13,25 height 13,20 left 13,screen_x-85 width 13,30
' --> Couleur alpha 14 caption 14,"Couleur" top 14,48 left 14,screen_x - 190
alpha 15 top 15,68 left 15,screen_x - 190 caption 15,"R:"
edit 16 top 16,65 height 16,20 left 16,screen_x-180 width 16,30
alpha 17 top 17,68 left 17,screen_x - 145 caption 17,"V:"
edit 18 top 18,65 height 18,20 left 18,screen_x-135 width 18,30
alpha 19 top 19,68 left 19,screen_x - 95 caption 19,"B:"
edit 20 top 20,65 height 20,20 left 20,screen_x-85 width 20,30
' --> Rotation du cube
alpha 21 caption 21,"Rotation objet:" top 21,88 left 21,screen_x - 190
alpha 22 top 22,108 left 22,screen_x - 190 caption 22,"X:"
edit 23 top 23,105 height 23,20 left 23,screen_x-180 width 23,30
alpha 24 top 24,108 left 24,screen_x - 145 caption 24,"Y:"
edit 25 top 25,105 height 25,20 left 25,screen_x-135 width 25,30
alpha 26 top 26,108 left 26,screen_x - 95 caption 26,"Z:"
edit 27 top 27,105 height 27,20 left 27,screen_x-85 width 27,30
' --> Transparence alpha 28 caption 28,"Transparence:" top 28,140 left 28,screen_x - 190
edit 29 top 29,137 height 29,20 left 29,screen_x-120 width 29,30
' --> Paramètre spécifiques au cube
alpha 30 caption 30,"Taille arete:" top 30,163 left 30,screen_x - 190
edit 31 top 31,160 height 31,20 left 31,screen_x-130 width 31,30
' --> Boutton de création d'un cube button 32 caption 32,"Valider le cube" top 32,screen_y - 150 left 32, screen_x - 160 height 32,30 width 32,100 on_click 32,Creation_cube
' --> List pour la sélection d'objet sur la map alpha 33 top 33,10 left 33,screen_x-190 caption 33,"Sélection objet:"
list 34 top 34,30 left 34,screen_x-190
Button 35 caption 35,"Selectionner" Top 35,150 left 35,screen_x-150 on_click 35,Orientation_modification
' --> On cache les objets relatifs a la création d'objets 3D for f=7 to 35 hide f next f
' Création de la scene 3d scene3d 50 color 50,0,0,0 axes_show height 50,screen_y - 120 width 50,screen_x-200 on_click 50,Activation_scene3d hide 50
' On affiche la fenetre principale wait 500 ' hide 100 show 0
' Pointeur 3d 3d_sphere 1,0.1 3d_color 1,0,255,0 3d_transparent 1,150
' Création des TIMER
timer 51 timer_interval 51,5 on_timer 51,Scene_3d timer_off 51
' Création de la fenetre de sauvegarde save_dialog 52 filter 52,"Fichier panoramic|*.bas"
end
' ======= Ecriture des sous-programmes =======
' === Scene_3d (mouvement caméra) ===
Scene_3d:
' Actualisation des informaion de position print_locate 10,screen_y - 115 print "Vue active" + " X=" + str$(pos_pointeur_x) + " Y=" + str$(pos_pointeur_y) + " Z=" + str$(pos_pointeur_z) + " ==> Echap pour quitter <=="
' Détection des mouvements de souris if init_pos_souris=1 init_pos_souris=0 souris_mouv_x=mouse_x_position(50) souris_mouv_y=mouse_y_position(50) end_if
' Réinitialisation de la position curseur et calcul de son déplacement position_souris= dll_call2("SetCursorPos",demi_ecran_x%,demi_ecran_y%) sph_point_phi = sph_point_phi-(mouse_x_position(50)-souris_mouv_x)*sensi sph_point_teta=sph_point_teta+(mouse_y_position(50)-souris_mouv_y)*sensi
' Vérrouillage de l'axe vertical if sph_point_teta > 85 sph_point_teta=85 end_if if sph_point_teta < -85 sph_point_teta=-85 end_if
' Detection des cmandes clavier ' --> Quitter if scancode = 27 scene_active = 0 timer_off 51 ' On écrit la position du pointeur 3d wait 100 print_locate 10,screen_y - 115 print "Vue inactive" + " X=" + str$(pos_pointeur_x) + " Y=" + str$(pos_pointeur_y) + " Z=" + str$(pos_pointeur_z) + " ==> Cliquez pour entrer <==" cursor_default 50 end_if ' --> Zoom avant if scancode=107 and sph_point_R > 1 sph_point_R = sph_point_R - vitesse_zoom end_if if scancode=109 and sph_point_R < 10 sph_point_R = sph_point_R + vitesse_zoom end_if ' --> Déplacement de la caméra if scancode=38 pos_pointeur_x = pos_pointeur_x + vit_mouv_camera end_if if scancode=40 pos_pointeur_x = pos_pointeur_x - vit_mouv_camera end_if if scancode=39 pos_pointeur_z = pos_pointeur_z + vit_mouv_camera end_if if scancode=37 pos_pointeur_z = pos_pointeur_z - vit_mouv_camera end_if
' Calcul des coordonnées de la caméra 3D cart_point_x = sph_point_R*cos(sph_point_teta*(3.141592654/180))*cos(sph_point_phi*(3.141592654/180))+ pos_pointeur_x cart_point_z = sph_point_R*cos(sph_point_teta*(3.141592654/180))*sin(sph_point_phi*(3.141592654/180))+ pos_pointeur_z cart_point_y = sph_point_R*sin(sph_point_teta*(3.141592654/180)) + 0.3*cam_ampli*sin(cam_osci*(3.141592654/180)) + pos_pointeur_y
' Actualisation affichage cam_position cart_point_x,cart_point_y,cart_point_z light_position cart_point_x+1,cart_point_y+1,cart_point_z+1 point_position pos_pointeur_x,pos_pointeur_y,pos_pointeur_z 3d_position 1,pos_pointeur_x,pos_pointeur_y,pos_pointeur_z
return
Activation_scene3d: ' Sous-programme qui permet de se déplacer de façon facile dans la scene 3d ' Test pour voir si l'utilisation n'a pas déja activé la scene 3d if scene_active=0 ' On cache le curseur cursor_hide 50 ' On écrit la position du pointeur 3d print_locate 10,screen_y - 115 print "Vue active" + " X=" + str$(pos_pointeur_x) + " Y=" + str$(pos_pointeur_y) + " Z=" + str$(pos_pointeur_z) + " ==> Echap pour quitter <=="
' Initialisation position souris init_pos_souris = 1 position_souris = dll_call2("SetCursorPos",demi_ecran_x%,demi_ecran_y%)
' Activation du timer de programme principal scene_active = 1 timer_on 51 end_if
return
Quitter: timer_off_all excel_stop terminate return
Activation_creer_cube: ' Programme qui active le module de création de cube ' On cache les commandes de modification for f=33 to 35 hide f next f
' Affichage des commandes de création for f=7 to 32 show f next f ' Création d'un nouveau numéro de cube num_dernier_objet = num_dernier_objet + 1 num_courant_objet = num_dernier_objet ' On demande a l'utilisateur de nommer l'objet ligne$ = str$(num_courant_objet) excel_write "A"+ligne$,message_input$("Nom de l'objet","Donnez un nom au cube","Nouveau_cube"+ligne$) return
Creation_cube: ' Programme qui permet la création de cube
' On vérifie la présence préalable du cube et on le supprime si OUI if o3d_object_exists(num_courant_objet)=1 3d_delete num_courant_objet end_if
' Création de l'objet pour l'aperçu 3d_cube num_courant_objet, val(text$(31)) 3d_position num_courant_objet,val(text$(9)),val(text$(11)),val(text$(13)) 3d_color num_courant_objet,val(text$(16)),val(text$(18)),val(text$(20)) 3d_rotate num_courant_objet,val(text$(23)),val(text$(25)),val(text$(27)) 3d_transparent num_courant_objet,val(text$(29))
' Enregistrement dans le fichier excel ligne$ = str$(num_courant_objet) excel_write "B"+ligne$,"Cube" excel_write "C"+ligne$,val(text$(9)) excel_write "D"+ligne$,val(text$(11)) excel_write "E"+ligne$,val(text$(13)) excel_write "F"+ligne$,val(text$(16)) excel_write "G"+ligne$,val(text$(18)) excel_write "H"+ligne$,val(text$(20)) excel_write "I"+ligne$,val(text$(23)) excel_write "J"+ligne$,val(text$(25)) excel_write "K"+ligne$,val(text$(27)) excel_write "L"+ligne$,val(text$(29)) excel_write "M"+ligne$,val(text$(31))
' Centrage de la caméra sur le nouvel objet pos_pointeur_x = val(text$(9)) pos_pointeur_y = val(text$(11)) pos_pointeur_z = val(text$(13))
' Calcul des coordonnées de la caméra 3D cart_point_x = sph_point_R*cos(sph_point_teta*(3.141592654/180))*cos(sph_point_phi*(3.141592654/180))+ pos_pointeur_x cart_point_z = sph_point_R*cos(sph_point_teta*(3.141592654/180))*sin(sph_point_phi*(3.141592654/180))+ pos_pointeur_z cart_point_y = sph_point_R*sin(sph_point_teta*(3.141592654/180)) + 0.3*cam_ampli*sin(cam_osci*(3.141592654/180)) + pos_pointeur_y
' Actualisation affichage cam_position cart_point_x,cart_point_y,cart_point_z light_position cart_point_x+1,cart_point_y+1,cart_point_z+1 point_position pos_pointeur_x,pos_pointeur_y,pos_pointeur_z 3d_position 1,pos_pointeur_x,pos_pointeur_y,pos_pointeur_z
' On cache les des commandes de création for f=7 to 35 hide f next f
return
Nouveau_projet: ' Programme qui crée un nouveau projet
' On demande a l'utilisateur de désigner l'emplacement du nouveau fichier a$ = file_name$(52) fichier_courant_bas$ = a$ + ".bas" fichier_courant_xls$ = a$ + ".xls"
' On crée les nouveaux fichiers file_open_write 1,fichier_courant_bas$ excel_file_new 2 ' On crée les nom des colonnes du fichier Excel excel_write "A1","Nom" excel_write "B1","Type" excel_write "C1","Pos X" excel_write "D1","Pos Y" excel_write "E1","Pos Z" excel_write "F1","Coul R" excel_write "G1","Coul V" excel_write "H1","Coul B" excel_write "I1","Rot X" excel_write "J1","Rot Y" excel_write "K1","Rot Z" excel_write "L1","Transp" excel_write "M1","Arr-Ray (cube,sphere)"
' On renome la fenetre avec le nom du fichier en cours d'édition caption 0,fichier_courant_bas$ ' Activation des commandes d'édition de l'environnemnt 3d active 5 active 60 inactive 3 ' Affichage de la scene3d de travail show 50
' Ecriture de la date de création file_writeln 1,"' Date de création: " + date$ + " - " + time$
' Fermeture du fichier file_close 1
return
Activation_modifier: ' Apparition des commandes permettant de choisir le type d'objet a modifier
' On cache les commandes de modification for f=7 to 32 hide f next f
' ' Affichage des commandes de sélection for i=33 to 35 show i next i
' On vide la liste des items déja_présents clear 34
' Création d'une liste des objets présents for i=2 to num_dernier_objet item_add 34,excel_read$("A"+str$(i)) next i
return
Orientation_modification:
' On désigne l'objet courant à modifier num_courant_objet = item_index(34)+1 type_courant_objet$ = excel_read$("B"+str$(num_courant_objet))
' On oriente l'utilisateur vers une série de commande d'édition en fonction de la nature de l'objet if type_courant_objet$ = "Cube" gosub Modification_cube end_if
return
Modification_cube: ' Programme permettant d'éditer un cube ' On cache les commandes de modification for f=33 to 35 hide f next f
' Affichage des commandes de création for f=7 to 32 show f next f
' Chargement des propriétés de l'objet dans les édits ligne$ = str$(num_courant_objet) text 9,excel_read$("C"+ligne$) text 11,excel_read$("D"+ligne$) text 13,excel_read$("E"+ligne$) text 16,excel_read$("F"+ligne$) text 18,excel_read$("G"+ligne$) text 20,excel_read$("H"+ligne$) text 23,excel_read$("I"+ligne$) text 25,excel_read$("J"+ligne$) text 27,excel_read$("K"+ligne$) text 29,excel_read$("L"+ligne$) text 31,excel_read$("M"+ligne$)
' Centrage de la caméra sur l'objet a modifier pos_pointeur_x = val(text$(9)) pos_pointeur_y = val(text$(11)) pos_pointeur_z = val(text$(13))
' Calcul des coordonnées de la caméra 3D cart_point_x = sph_point_R*cos(sph_point_teta*(3.141592654/180))*cos(sph_point_phi*(3.141592654/180))+ pos_pointeur_x cart_point_z = sph_point_R*cos(sph_point_teta*(3.141592654/180))*sin(sph_point_phi*(3.141592654/180))+ pos_pointeur_z cart_point_y = sph_point_R*sin(sph_point_teta*(3.141592654/180)) + 0.3*cam_ampli*sin(cam_osci*(3.141592654/180)) + pos_pointeur_y
' Actualisation affichage cam_position cart_point_x,cart_point_y,cart_point_z light_position cart_point_x+1,cart_point_y+1,cart_point_z+1 point_position pos_pointeur_x,pos_pointeur_y,pos_pointeur_z 3d_position 1,pos_pointeur_x,pos_pointeur_y,pos_pointeur_z
return Quelques éléments pour utiliser le programme: cliquer dans le scene_3d pour allumer la rotation de la caméra et les comandes ci-dessous • + : Zoom avant • - : Zoom arrière • Fleches du clavier : déplacement sur les axes X et Z Echap : permet de quitter le déplacement dans le scene_3d pour accéder aux commandes de la fenetre Menu Créer: permet de créer un cube Menu modifier : Permet de modifier un cube existant Il y a encore beaucoup de bug, le programme n'est pas encore performant et stable: --> Le fichier texte créé n'est pas encore vraiment exploité, il recevra le code traduit en panoramic ds le futur --> Les numéro des objets manquent de structuration... --> Pas de chexking du remplissage des EDIT (proporiétés objets) ce qui peut amener a des pb si vous dépassez les limites (ex: 400 dans la case "R") --> Vous rencontrez d'autres bug majeurs ? | |
|