
Dreamotion3D
voici mon petit code de testtmyke a écrit :au moins cela permet d'une certaine façon de valider la commande, merci Dobro

Code : Tout sélectionner
; Init different modules
; Fichiers Include
IncludePath "D:\PureBasic4\Dreamotion3D\SamplesDM3D\include"
;IncludeFile "D:\PureBasic4\Dreamotion3D\SamplesDM3D\include\d3dx9.pbi"
IncludeFile "D:\PureBasic4\Dreamotion3D\SamplesDM3D\include\dreamotion3d.pbi"
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
; Initialize graphic windows
DM_Graphics3D(600,600, 32, #False, #False)
; a little camera
*camera.l = DM_CreateCamera()
DM_TurnEntity(*camera, 25, 0, 0, glob.b=#False) ; baisse la tete de 25°
DM_TranslateEntity(*camera,0,250,-500); monte de 250, et recule de 50
; une lumiere
*light=DM_CreateLight( #D3DLIGHT_POINT )
DM_TranslateEntity(*light,-100,250,0) ; la lumiere 1 est a 250 d'altitude, plus haut que les 2 cubes au dessus du cube 1
*light2=DM_CreateLight( #D3DLIGHT_POINT )
DM_TranslateEntity(*light2,100,250,0); la lumiere 2 est a 250 d'altitude, plus haut que les 2 cubes au dessus du cube 2
DM_LightRange(*light,1500.0)
; 2 cubes
*cube=DM_CreateCube.l( ) ;on creer le cube 1 ROUGE
DM_TranslateEntity(*cube,-100,0,0); on le deplace a gauche a 50 d'altitude
DM_ScaleMesh( *cube, 100,100, 100) ; on fait un gros cube
DM_EntityColor(*cube, 255, 0, 0, 0)
*cube2=DM_CreateCube.l( ) ; on creer le cube 2 BLEU
DM_TranslateEntity(*cube2,200,0,0); on le deplace a droite de l'autre a 0 d'altitude, mais il fait 100 de haut !!
DM_ScaleMesh( *cube2, 100,100, 100) ; on fait un gros cube
DM_EntityColor(*cube2, 0,0,255, Alpha.b)
DM_AddMesh(*cube, *cube2, copy.b=#True) ; d'apres Doc on copie le rouge sur le bleu (copie de cube dans cube2)
DM_FreeEntity(*cube2) ; on efface le cube 2 , reste le cube 1 (sur la gauche de la camera)
;DM_FreeEntity(*cube1) ; on efface le cube 1 , reste le cube 2 (sur la droite de la camera)
Repeat
ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
; *****************************************************************************
;-3D Control Camera pendant dessin
If KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Left)
Quit=1
ElseIf KeyboardPushed(#PB_Key_Up )
poz=1
DM_MoveEntity(*camera, 0,0,0.08); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Down )
poz=-1
DM_MoveEntity(*camera, 0,0,-0.08); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Left )
DM_MoveEntity(*camera, -0.08,0,0); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Right )
DM_MoveEntity(*camera, 0.08,0,0); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_PageUp)
DM_MoveEntity(*Camera, 0,0.08,0); eleve la camera
ElseIf KeyboardPushed(#PB_Key_PageDown )
DM_MoveEntity(*Camera, 0,-0.08,0); baisse la camera
EndIf
DM_TurnEntity(*Camera, MouseDeltaY()/8, MouseDeltaX()/8,0)
; *****************************************************************************
; *****************************************************************************
; Render
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
Until Quit=1
DM_ClearGraphics()
End
-
- Messages : 1554
- Inscription : lun. 24/juil./2006 6:44
- Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E
Salut. Ok, bon j'ai repris un peu ton code pour mieux symboliser la chose.
En fait, quand tu copie un mesh dans un autre, tu les fait au niveau des coordonnées
de Vertices. Dans ton cas, tu déplace tes entity par les instructions générales, qui n'on un effet
que sur le rendu de sortie, mais qui ne change pas les coordonnées physiques des éléments,
q'ou le soucis que tu as parfois je pense sur le résultat.
(d'ailleurs je vais voir pour changer cela)
Voici le meme code, mais en jouant sur les coordonnée physique des mesh
(DM_TranslateMesh au lieu de DM_TranslateEntity par exemple)
Dans l'ancien code tu ajoutais deux cubes de meme dimension avec les meme coordonnées
d'ou l'impression que la copy ne se faisait pas, vue que tu n'en vois qu'un, l'autre étant maqué par le premier...
Par contre, il semble que j'ai un bug sur la fonction DM_TranslateMEsh, qui ne semble ne pas fonctoinner
si on la place avant DM_ScaleMesh()... je verais ça ce soir.
En fait, quand tu copie un mesh dans un autre, tu les fait au niveau des coordonnées
de Vertices. Dans ton cas, tu déplace tes entity par les instructions générales, qui n'on un effet
que sur le rendu de sortie, mais qui ne change pas les coordonnées physiques des éléments,
q'ou le soucis que tu as parfois je pense sur le résultat.
(d'ailleurs je vais voir pour changer cela)
Voici le meme code, mais en jouant sur les coordonnée physique des mesh
(DM_TranslateMesh au lieu de DM_TranslateEntity par exemple)
Dans l'ancien code tu ajoutais deux cubes de meme dimension avec les meme coordonnées
d'ou l'impression que la copy ne se faisait pas, vue que tu n'en vois qu'un, l'autre étant maqué par le premier...
Par contre, il semble que j'ai un bug sur la fonction DM_TranslateMEsh, qui ne semble ne pas fonctoinner
si on la place avant DM_ScaleMesh()... je verais ça ce soir.
Code : Tout sélectionner
; Include files
IncludePath "Include\" : IncludeFile "dreamotion3d.pbi"
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
; Initialize graphic windows
DM_Graphics3D(800,600, 32, 0,1)
; a little camera
*camera.l = DM_CreateCamera()
DM_TurnEntity(*camera, 25, 0, 0, glob.b=#False) ; baisse la tete de 25°
DM_TranslateEntity(*camera,0,250,-500); monte de 250, et recule de 50
; une lumiere
*light=DM_CreateLight(3 )
; 2 cubes
*cube=DM_CreateCube.l( ) ;on creer le cube 1 ROUGE
DM_ScaleMesh( *cube, 100,100, 100) ; on fait un gros cube
DM_TranslateMesh(*cube,-100,0,0); on le deplace a gauche a 50 d'altitude
DM_EntityColor(*cube, 255, 0, 0, 255)
*cube2=DM_CreateCube() ; on creer le cube 2 BLEU
DM_ScaleMesh( *cube2, 100,100, 100) ; on fait un gros cube
DM_TranslateMesh(*cube2,150,0,0); on le deplace a droite de l'autre a 0 d'altitude, mais il fait 100 de haut !!
DM_EntityColor(*cube2, 0,0,255, 255)
DM_AddMesh(*cube, *cube2, #True) ; d'apres Doc on copie le rouge sur le bleu (copie de cube dans cube2)
DM_TranslateEntity(*cube2, 0,50,0)
DM_FreeEntity(*cube) ; on efface le cube 2 , reste le cube 1 (sur la gauche de la camera)
;DM_FreeEntity(*cube2) ; on efface le cube 1 , reste le cube 2 (sur la droite de la camera)
Repeat
ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
; *****************************************************************************
;-3D Control Camera pendant dessin
If KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Left)
Quit=1
ElseIf KeyboardPushed(#PB_Key_Up )
poz=1
DM_MoveEntity(*camera, 0,0,0.08); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Down )
poz=-1
DM_MoveEntity(*camera, 0,0,-0.08); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Left )
DM_MoveEntity(*camera, -0.08,0,0); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_Right )
DM_MoveEntity(*camera, 0.08,0,0); on recule/avance la camera
ElseIf KeyboardPushed(#PB_Key_PageUp)
DM_MoveEntity(*Camera, 0,0.08,0); eleve la camera
ElseIf KeyboardPushed(#PB_Key_PageDown )
DM_MoveEntity(*Camera, 0,-0.08,0); baisse la camera
EndIf
DM_TurnEntity(*Camera, MouseDeltaY()/8, MouseDeltaX()/8,0)
; *****************************************************************************
; *****************************************************************************
; Render
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
Until Quit=1
DM_ClearGraphics()
End
Force et sagesse...
a propos du gros plantage memoire, il semblerai bien que cel arrive a la creation d'objet , j'ai eu le probleme sur un "*ll = DM_CreateCube()"
"erreur memory acces" !
je crois que la liberation de la memoire, n'est pas correcte
pourtant j'utilise DM_ClearGraphics()
a 2 endroits !! un avant d'ouvrir l'ecran 3D (en fenetre chez moi)
et un a la fermeture de l'ecran
j'ai fini par en mettre 2 car ça déconne toujours
surtout sur les tres tres gros objet (je ne sait pas comment compter les meshs... ) , je vais chercher
n'oublie pas que cela reste dans le cadre : ouverture d'une fenetre avec Dreamotion dedans ()
et dessins,refermeture, et reouverture, ect ....
bref peut etre est-ce cette particularité qui met a mal les libérations de ressource system ... ??
"erreur memory acces" !
je crois que la liberation de la memoire, n'est pas correcte
pourtant j'utilise DM_ClearGraphics()
a 2 endroits !! un avant d'ouvrir l'ecran 3D (en fenetre chez moi)
et un a la fermeture de l'ecran
j'ai fini par en mettre 2 car ça déconne toujours
surtout sur les tres tres gros objet (je ne sait pas comment compter les meshs... ) , je vais chercher

n'oublie pas que cela reste dans le cadre : ouverture d'une fenetre avec Dreamotion dedans ()
Code : Tout sélectionner
DM_Graphics3DGadget(largeur_ecran, hauteur_ecran, WindowID, 1)
bref peut etre est-ce cette particularité qui met a mal les libérations de ressource system ... ??
haaaa !tmyke a écrit :Bon, effectivement, j'ai bien un soucis avec la libération de certaines ressources. Je n'ai pas pu régler ce soir le soucis, mais d'ici au WE prochain,
cela devrais etre possible.
Je m'absente quelques jours, je verais cela a mon retour ...


ouf !

faut dire que mon PureGolo, avec le nombre d'objets qu'il peut créer en un rien de temps, et les rotations, et tout l'cirque ça fait un bon prg de test

apres j'attaquerai les textures

ça va ? t'as pas trop mal aux cheveux ?

-
- Messages : 2194
- Inscription : jeu. 27/janv./2005 19:07
non ça n'est pas possible, mais tu me donne une idée , en tout casCpl.Bator a écrit :Dobro, ca serais sympa de pouvoir manipuler la caméra via tes scripts, a moi que cela soit déjà possible ?

tu pensais a quoi exactement ?
car pour l'instant le but suprême de PureGolo étant de faire effectuer des dessin a une "tortue"
toute les manipulations se font sur l'objet "*tortue3D"
il me suffirait de remplacer le pointeur actuel par une variable ,
contenant le pointeur choisi ...
et du coup lui passer "*camera" a la place pour voir tout les manipulations effectuées par la camera, rien de bien compliquer a mettre en oeuvre

erix14 a écrit :Si on peut "scripter" le déplacement de la camera, ça peut être intéressant de créer une vidéo du parcours. De plus, avec ce procédé, peut importe le temps du rendu de chaque image, la vidéo sera toujours nickel. Tu peux solliciter mon aide en MP, si tu en as besoin pour faire cela.

a savoir que Puregolo a deja une routine qui permet de creer des video
mem en Divx !! (Merci Nico)
mais pour l'instant je ne l'utilise qu'en 2D

marche deja depuis plusieurs version
sauve_avi "chemin\nom de l'image",type de compression
save_avi "chemin\nom de l'image",type de compression
Cette commande va transformer les images contenus dans le dossier animation en un fichier AVI compressé
cette commande ne peut fonctionner que si dans le meme listing
la commande sauve_image "xxxx.ani" a ete utilisée avant !!
car les images utilisées pour creer l'AVI sont mis dans un buffer par
la commande sauve_image "xxxx.ani"....
les types de compression peuvent etre : je vais ajouter un exemple de compression pour un fichier video
divx311 <-- meilleur taux de compression 30 k
divx4 <-- le divx 4.12 44 k
indeov5 <-- indeoV5 73 k
cinepak <-- cinepak 799 k
msvc <-- microsoft video 1 1480 k
il est noter que si le codec n'est pas present le fichier ne sera pas crée !!
Ex :
let taille=10
FPOS 1,580
pour [carre],taille
repete 4
AV taille
TD 90
fin_repete
fin_pour
repete 25
couleur 255,255,255
[carre],taille
sauve_image "test.ani"
couleur 0,0,0
[carre],taille
let taille={taille}+10
fin_repete
;on rejoue l'animation
repete 2
joue_image 1
joue_image 0
fin_repete
sauve_avi "carre.avi",divx311

