Horloge 3D avec Dreamotion3D

Généralités sur la programmation 3D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Horloge 3D avec Dreamotion3D

Message 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



tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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...
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Ok Merci :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Tu peux pas poster un exe DoBro ? :D
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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:
Répondre