Page 2 sur 2

Publié : mer. 09/juin/2004 12:36
par cederavic
comtois a écrit :
Crystal Noir a écrit : A partir de là, si je prend mon point A(-7000,7000) si je retranscrit ce que je viens de dire à l'écran il aura les coordonnées 0,0

Voila , sauf que A c'est (-7000,-7000) donc coordonnées 0,480 ( 479 pour être plus juste )

ben maintenant on attend le programme qui trace les segments à l'écran :)
voir x3D :)

Publié : mer. 09/juin/2004 13:01
par comtois
on ne peut pas voir ,il n'y a pas les sources :)

Et puis toi tu es en 3D , ici c'est de la 2D :wink:

Publié : mer. 09/juin/2004 13:14
par Le Soldat Inconnu
ben non, justement, c'est un émulateur 3D 100% software, le truc de Cederavic

Publié : mer. 09/juin/2004 13:22
par cederavic
oui, c'est un moteur software... pas de directx, pas d'opengl, pas d'ogree, rien de tout ça... on utilise meme pas linexy ou plot :p

Publié : mer. 09/juin/2004 13:25
par Crystal Noir
Bon voilà le code mais j'ai un soucis :

Code : Tout sélectionner

;Initialisation des composants
InitSprite()
InitKeyboard()


;Initialisation des constantes
  ;Variables Globales
  Global MaFenetre    ;Fenêtre principale

  ;Constantes
  #Main_Window = 1
  #ScreenW = 640
  #ScreenH = 480

  ;variables
  ax.w = -7000
  ay.w = -7000
  bx.w = 7000
  by.w = -7000
  cw.w = 7000
  cy.w = 7000
  
;Création de la fenêtre principale 
SetRefreshRate(60)
MaFenetre = OpenWindow(#Main_Window, 0, 0, 640, 480, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test") 
OpenWindowedScreen(MaFenetre,0,0, #ScreenW, #ScreenH,0, 0, 0)
;MaFenetre = OpenScreen(800,600,32,"Test")
If MaFenetre  = 0 
  MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf


;Tracé du repère XY
StartDrawing(ScreenOutput())
  LineXY(320,0,320,479,RGB(255,255,255))
  LineXY(0,240,639,240,RGB(255,255,255))
StopDrawing()

;Liaison du point A(-7000,-7000) au point B(7000,-7000) soit à l'écran A(0,0) et B(639,479)
StartDrawing(ScreenOutput())
  LineXY(0,479,639,479,RGB(255,0,0))
StopDrawing()
 
;Liaison du point B(7000,-7000) au point C(7000,7000) soit à l'écran B(639,0) et C(639,0)
StartDrawing(ScreenOutput())
  LineXY(639,479,639,0,RGB(255,0,0))
StopDrawing()

;Liaison du point C(7000,7000) au point A(-7000,7000) soit à l'écran C(639,0) et A(0,0)
StartDrawing(ScreenOutput())
  LineXY(639,0,0,479,RGB(255,0,0))
StopDrawing()


Repeat
  FlipBuffers()
  EID = WindowEvent()
Until EID = #PB_Event_CloseWindow
Voilà ce que ca donne. Alors c'est simple j'ai compris à quoi correspondaient les valeurs du coup facile de définir que -7000 c'est 0 sur les x par ex.

Mon pb c'est que moi j'aurais aimé utiliser les variables que j'ai définie c'est à dire ay, ay etc...car finalement là c simple mais si j'ai d'autres valeur je vais avoir besoin d'une formule. Et j'ai beau me triturer la tête dans tous les sens pas moyen de trouver la correspondance :(

Car là pour au moins montrer que j'ai pigé j'ai fait les LineXY directement avec les valeurs correspondantes, mais j'aurais voulu le faire avec ax, ay et cie ct un peu le but de l'exo...j'arrive pas à trouver cette formule grrrr.

Publié : mer. 09/juin/2004 13:29
par comtois
Le Soldat Inconnu a écrit :ben non, justement, c'est un émulateur 3D 100% software, le truc de Cederavic

Je parlais de l'exercice de Crystal noir :)

Publié : mer. 09/juin/2004 13:37
par cederavic
oui j'ai louper ton message comtois, dsl :oops:

Publié : mer. 09/juin/2004 13:38
par Crystal Noir
grrrrr toujours pas trouvé la formule lol en plus le pire c que je connais les correspondances, alors je devrais la trouver lol mais pas moyen, incroyable

Publié : mer. 09/juin/2004 14:34
par comtois
Remarque , je n'ai pas encore réfléchi au problème , là je vais profiter du soleil , et éventuellement j'y jetterai un oeil ce soir.

Publié : mer. 09/juin/2004 16:54
par comtois
J'ai changé les valeurs de A,B,C , on était aux limites de l'écran et je ne gère pas le clipping ,pour ça il faut s'adresser à Cederavic :)

Code : Tout sélectionner

;Initialisation des composants 
InitSprite() 
InitKeyboard() 

;Initialisation des constantes 
  ;Variables Globales 
Global MaFenetre    ;Fenêtre principale 

  ;Constantes 
#Main_Window = 1 
#ScreenW = 640 
#ScreenH = 480 
;C'est pas vraiment utile c'est juste pour repérer plus facilement les 3 points 
Enumeration
#PointA
#PointB
#PointC
EndEnumeration

  ;variables 
Dim Pts.POINT(2)
;Point A
Pts(#PointA)\x = -6000
Pts(#PointA)\y = -6000
;Point B
Pts(#PointB)\x =  6000
Pts(#PointB)\y = -6000
;Point C
Pts(#PointC)\x =  6000
Pts(#PointC)\y =  6000

;Projection 
;Pour le point aux coordonnées 0,0 , il sera à l'écran en 320,240  soit #ScreenW/2,#ScreenH/2
;ce qui donne pour Y => 0 * X + K = #ScreenH/2 => Soit K = #ScreenH/2
;Pour le point aux coordonnées 7000,-7000 ( Le point B ) tu auras :
; -7000 * X + K = #ScreenH
; Et tu déduis X = (#ScreenH-K)/-7000 , après simplification ça donne => X =(#ScreenH/2)/-7000
;c'est ce que tu retrouves dans la procedure ProjY() => CoefY.f=-#ScreenH/7000*2
;Et le principe est le même pour l'axe des X.
;Bien sûr c'est simplifié , si tu veux tenir compte de la profondeur Z, et jouer sur la focale 
;tu devras reprendre les exemples déjà maintes fois cités :)
Procedure ProjX(x.l)
  CoefX.f=#ScreenW/(7000*2) 
  Xp = CoefX * x + #ScreenW/2
  ProcedureReturn Xp 
EndProcedure
  
Procedure ProjY(y.l)
  CoefY.f=#ScreenH/(-7000*2) 
  Yp = CoefY * y + #ScreenH/2
  ProcedureReturn Yp 
EndProcedure  

;Création de la fenêtre principale 
SetRefreshRate(60) 
MaFenetre = OpenWindow(#Main_Window, 0, 0, 640, 480, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test") 
OpenWindowedScreen(MaFenetre,0,0, #ScreenW, #ScreenH,0, 0, 0) 
;MaFenetre = OpenScreen(800,600,32,"Test") 
If MaFenetre  = 0 
  MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok) 
EndIf 

;Tracé du repère XY 
StartDrawing(ScreenOutput()) 
  LineXY(320,0,320,479,RGB(255,255,255)) 
  LineXY(0,240,639,240,RGB(255,255,255)) 
  ;Liaison du point A(-7000,-7000) au point B(7000,-7000) soit à l'écran A(0,0) et B(639,479) 
  LineXY(ProjX(Pts(#PointA)\x),ProjY(Pts(#PointA)\y),ProjX(Pts(#PointB)\x),ProjY(Pts(#PointB)\y),RGB(255,0,0)) 
  ;Liaison du point B(7000,-7000) au point C(7000,7000) soit à l'écran B(639,0) et C(639,0) 
  LineXY(ProjX(Pts(#PointB)\x),ProjY(Pts(#PointB)\y),ProjX(Pts(#PointC)\x),ProjY(Pts(#PointC)\y),RGB(255,0,0))
  ;Liaison du point C(7000,7000) au point A(-7000,7000) soit à l'écran C(639,0) et A(0,0) 
  LineXY(ProjX(Pts(#PointC)\x),ProjY(Pts(#PointC)\y),ProjX(Pts(#PointA)\x),ProjY(Pts(#PointA)\y),RGB(255,0,0))
StopDrawing() 

Repeat 
  FlipBuffers() 
  EID = WindowEvent() 
Until EID = #PB_Event_CloseWindow 

Publié : mer. 09/juin/2004 16:54
par Crystal Noir
en fait si on connais l'échelle du plan imaginaire c facile (merci cédéravic).

on calcule un facteur et hop on l'utilise pour retranscrire. ca fait donc un décalage.

Maintenant pour la 3d j'ai l'impression que c un peu plus complexe, c le calcul du facteur qui me pose pb.

Ma question serait, comment calculer ses facteurs sous purebasic ? car la formule de la projection je l'ai :p meme si j'ai vu la formule avec tan je pense pas que ce soit ca qu'il faut utiliser.