Besoin d'une petite explication de code

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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 :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ben non, justement, c'est un émulateur 3D 100% software, le truc de Cederavic
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

oui j'ai louper ton message comtois, dsl :oops:
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 
Dernière modification par comtois le mer. 09/juin/2004 17:19, modifié 2 fois.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

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