Page 1 sur 1

Horloge 3D avec Dreamotion3D

Publié : sam. 11/nov./2006 17:40
par Backup
voici ma petite horloge toute simple

on se déplace comme dans CS
les touches fleché + souris

la souris c'est le regards
les touche haut/bas = avance recule
les touche droite/gauche = pas lateral droite et gauche


@ Tmyke ya quand même un problème avec les pivots !!

car cela déplace bel et bien l'objet , hors en principe ça ne devrai pas !!

voir la ligne 65 qui décale le pivo vers la base des aiguilles de 5 (mais décale aussi l'objet)

sans le rattrapage que je fait ligne 71 mes aiguilles ne serai pas centré sur la sphère central !!
ce qui prouve le décalage des objets !! :?
tout mes objet sont en principe centré sur la coordonée x,y,z (100,4,100)
donc ce ratrapage ne devrai pas avoir lieu !!

n'oubliez pas de corriger le chemin des includes sur votre ordi
voici le code de mon horloge :D


; Init different modules
; Fichiers Include
; voir le dreamotion3d.pbi pour le details des commandes reconnu
IncludePath "D:\PureBasic\dobro\Exemple Perso\3Dreammotion\Samples\include\" ; mettre le bon chemin
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"

Enumeration
EndEnumeration
Global timer

Declare.f RotationX(x, angle.f, dist)
Declare.f RotationY(Y, angle.f, dist)


If InitSprite () = 0 Or InitKeyboard () = 0 Or InitMouse () = 0
     End
EndIf
SetCurrentDirectory ( "D:\PureBasic\dobro\Exemple Perso\3Dreammotion\Samples\media\" ) ; mettre le bon chemin
Handle=DM_Graphics3D(1024,768, 32, #False , #False ) ; Initialize graphic windows
*Camera = DM_CreateCamera( #Null ) ; on cree une camera
; **************** bouger la camera ********************
;- bouger camera
posx.f=100 ; droite gauche
posy.f=2 ;monte/descends
poz.f=50 ; avance/recule
DM_MoveEntity(*Camera, posx,posy,poz) ; on recule la camera
Rouge=0
Vert=0
Bleu=0
DM_CameraClsColor(*Camera, Rouge, Vert, Bleu) ; on choisi une couleur de fond
; **************************************************


; on peut creer des objets

; **********************************
; ******** Text 3d ******************
;-creer du text3D
*text=DM_CreateText3D.l( "Comic Sans MS" , "by DOBRO" , 12, #Null ) ; on peut creer du text
posxe.f=96.5 ;
posye.f=-3.5 ;
posze.f=100 ;
DM_PositionEntity(*text, posxe.f, posye.f, posze.f)
scalex.f=2: scaley.f=2: scalez.f=2
DM_ScaleEntity(*text, scalex.f, scaley.f, scalez.f) ; on change l'echelle du cone
; **********************************

; ****** Cone *******************
;-creer un cone
*aiguille_seconde=DM_CreateCone.l(8, #Null ) ; on peut creer un cylindre avec 8 cotés
*aiguille_minute=DM_CreateCone.l(8, #Null ) ; on peut creer un cylindre avec 8 cotés
*aiguille_heure=DM_CreateCone.l(8, #Null ) ; on peut creer un cylindre avec 8 cotés

scalex.f=1: scaley.f=0.5: scalez.f=1
DM_ScaleEntity(*aiguille_seconde, scalex.f, scaley.f, scalez.f) ; on change l'echelle du cone

scalex.f=0.7: scaley.f=0.5: scalez.f=0.7
DM_ScaleEntity(*aiguille_minute, scalex.f, scaley.f, scalez.f) ; on change l'echelle du cone

scalex.f=0.5: scaley.f=0.5: scalez.f=0.5
DM_ScaleEntity(*aiguille_heure, scalex.f, scaley.f, scalez.f) ; on change l'echelle du cone

; ******************** tmyke a voir ça !! *******************************
DM_PivotEntity(*aiguille_seconde, 0, 0, -5) ; cela créé un decalage de l'objet complet !!
DM_PivotEntity(*aiguille_minute, 0, 0, -5)
DM_PivotEntity(*aiguille_heure, 0, 0, -5)

posxe.f=100
posye.f=4
posze.f=105 ; ratrappe le décalage de Pivo entity !!!!! <---------- RUSTINE var mes objets sont toous en 100,4,100
DM_PositionEntity(*aiguille_seconde, posxe.f, posye.f, posze.f)
DM_PositionEntity(*aiguille_minute, posxe.f, posye.f, posze.f)
DM_PositionEntity(*aiguille_heure, posxe.f, posye.f, posze.f)


DM_TurnEntity(*aiguille_seconde,0,90,0) ; on va tourner l'objet pour le mettre debout
DM_TurnEntity(*aiguille_minute,0,90,0) ; on va tourner l'objet pour le mettre debout
DM_TurnEntity(*aiguille_heure,0,90,0) ; on va tourner l'objet pour le mettre debout


; ****** Sphere *******************
;-Creer le centre
*sphere=DM_CreateSphere.l(32, #Null ) ; on peut creer une sphere avec 32 segments
posxe.f=100
posye.f=4
posze.f=100
DM_PositionEntity(*sphere, posxe.f, posye.f, posze.f)

Dim *sphere(60)
For i=1 To 60
    compt=compt+1
    *sphere(i)=DM_CreateSphere.l(32, #Null ) ; on peut creer une sphere avec 32 segments
    posxe.f=100
    posye.f=4
    posze.f=100
    degres =degres+6 : If degres=360:degres=0: EndIf :
    xc.f=RotationX(posxe.f, degres, 10)
    Yc.f=RotationY(posye.f, degres, 10)
    DM_PositionEntity(*sphere(i), xc, Yc, posze.f)
    
     If compt=5
        compt=0
        scalex.f=0.7: scaley.f=0.7: scalez.f=0.7
        DM_ScaleEntity(*sphere(i), scalex.f, scaley.f, scalez.f) ; on change l'echelle du cone
     Else
        scalex.f=0.5: scaley.f=0.5: scalez.f=0.5
        DM_ScaleEntity(*sphere(i), scalex.f, scaley.f, scalez.f) ; on change l'echelle du cone
     EndIf
Next i




; *********************************
; ****** Tore *******************
;-creer un tore
InnerRadius.f =1 ; taille interieur
OuterRadius.f=11 ; taille exterieur
Sides.l=8 ; nombre de segment pour le "pneu"
Rings.l=360 ; nombre de segment pour la "roue"
*tore=DM_CreateTorus.l(InnerRadius.f, OuterRadius.f, Sides.l, Rings.l, #Null ) ; on peut creer un Tore
rotx=0:roty=0:rotz=0
DM_TurnEntity(*tore,rotx,roty,rotz) ; on va tourner l'objet
posxe.f=100
posye.f=4
posze.f=100
DM_PositionEntity(*tore, posxe.f, posye.f, posze.f)
; *********************************

 

; ****** Lumiere *****************
  ; cree une petite lumière, type POINT
;-creer une lumiere
light = DM_CreateLight(1, Null)
Red.w=255
Green.w=10
Blue.w=100
Alpha.w=2
DM_LightColor(light, Red.w, Green.w, Blue.w, Alpha.w) ; change la couleur de la lumiere
; *********************************
date = Date ()
Heure= Hour (date)
Minute = Minute (date)
Seconde= Second (date)
angle_seconde.f=Seconde*6-90
angle_minute.f= Minute *6-90
angle_heure.f=Heure*30-90
DM_TurnEntity(*aiguille_seconde,angle_seconde,0,0) ; on va faire tourner l'objet
DM_TurnEntity(*aiguille_minute, angle_minute,0,0) ; on va fairel'objet
DM_TurnEntity(*aiguille_heure,angle_heure,0,0) ; on va faire l'objet
memseconde= Seconde
Memminute= Minute
memheure= Heure

Repeat
    date = Date ()
    Heure= Hour (date)
     Minute = Minute (date)
    Seconde= Second (date)
    
     If memseconde<> Seconde
        angle_seconde.f=6
        DM_TurnEntity(*aiguille_seconde,angle_seconde,0,0) ; on va faire tourner l'objet
        memseconde= Seconde
     EndIf
    
     If Memminute<>Minute
        angle_minute.f=6
        DM_TurnEntity(*aiguille_minute, angle_minute,0,0) ; on va fairel'objet
        Memminute= Minute
     EndIf
    
     If memheure<>Heure
        angle_heure.f=30
        DM_TurnEntity(*aiguille_heure,angle_heure,0,0) ; on va faire l'objet
        memheure= Heure
     EndIf
    
     ExamineKeyboard ()
     ExamineMouse ()
     ShowCursor_ (1)
     If KeyboardReleased ( #PB_Key_Escape ) Or WindowEvent ()= #PB_Event_CloseWindow
        Quit=1
     ElseIf KeyboardPushed ( #PB_Key_Up )
        poz=1
        DM_MoveEntity(*Camera, 0,0,0.1) ; on recule/avance la camera
     ElseIf KeyboardPushed ( #PB_Key_Down )
        poz=-1
        DM_MoveEntity(*Camera, 0,0,-0.1) ; on recule/avance la camera
     ElseIf KeyboardPushed ( #PB_Key_Left )
        DM_MoveEntity(*Camera, -0.1,0,0) ; on recule/avance la camera
        
     ElseIf KeyboardPushed ( #PB_Key_Right )
        DM_MoveEntity(*Camera, 0.1,0,0) ; on recule/avance la camera
     EndIf
    
    
     ; If MouseButton(#PB_MouseButton_Left)
    DM_TurnEntity(*Camera, MouseDeltaY ()/8, MouseDeltaX ()/8,0)
     ; EndIf
    
    
    
     ; Render c'es ce qui permet de voir le resultat !
    DM_BeginScene()
    DM_RenderWorld()
    DM_EndScene()
     ; *************************************
Until Quit=1
DM_ClearGraphics()

End

Procedure.f RotationX(x, angle.f, dist)
     ProcedureReturn x + Cos (angle.f* #PI /180)*dist
EndProcedure
  
  
Procedure.f RotationY(Y, angle.f, dist)
     ProcedureReturn Y + Sin (angle.f* #PI /180)*dist
EndProcedure




Publié : sam. 11/nov./2006 18:20
par tmyke
Felicitation, c'est vraiment superbe.
Image

Tu as raison, il y a bien un bug au niveau des pivots, d'ailleurs pas facile a
regler. C'est du a la façon dont j'emploi les Quaternions.
Mais je me pencherais sur le problème pour regler la chose.
J'ajoute cela a la liste des bugs a regler...

Publié : sam. 11/nov./2006 18:32
par Backup
Ok Merci :D

Publié : sam. 11/nov./2006 18:35
par comtois
Dobro c'est l'horloger du forum PureBasic fr :)

Très belle horloge.

Maintenant tu reprends ton horloge 2D, tu l'appliques à une texture et tu colles la texture sur un cube, ça répétera l'horloge sur les 6 faces, ça fera un genre :)

Publié : sam. 11/nov./2006 18:56
par lionel_om
Tu peux pas poster un exe DoBro ? :D

Publié : sam. 11/nov./2006 19:17
par Backup

Publié : sam. 11/nov./2006 19:19
par Backup
comtois a écrit :Dobro c'est l'horloger du forum PureBasic fr :)

Très belle horloge.

Maintenant tu reprends ton horloge 2D, tu l'appliques à une texture et tu colles la texture sur un cube, ça répétera l'horloge sur les 6 faces, ça fera un genre :)
Je ne sais pas texturer encore ! :oops:
je suis une croquette pour chat en matière de 3D :lol: