Page 2 sur 2

Publié : mar. 18/déc./2007 13:50
par Anonyme
je doute qu'avec les pc actuels ont puisse faire tourner un jeu de se type , même avec une config musclée. les cartes actuelle n'ont pas a ma connaissance des fonctions cablées concernant le ray-tracing. ou alors il utilise une technique de codage qui m'échappe totalement.

Publié : mar. 18/déc./2007 13:57
par Anonyme
j'ai répondu à ma question , ils utilisent l'api OpenRT , fait pour le lancer de rayon.

Publié : mar. 18/déc./2007 14:50
par djes
Oui et non, puisque cette api, c'est eux qui l'ont faite :). La carte graphique ne sert qu'à l'affichage (2D!). Tout le boulot est fait par le processeur. Le RT a l'avantage d'utiliser à fond les configs à plusieurs processeurs, et les cartes graphiques pourraient être adaptées pour faire les calculs.

Voit ce très bon article : http://www.pcper.com/article.php?aid=33 ... pert&pid=1

C'est vraiment un domaine de pointe. Si je faisais des études d'info, ça me tenterait bien de faire comme le gars qui a lancé ça (et qui vient de se faire embaucher par intel). Faut quand même être calé en maths ;)

Publié : mar. 18/déc./2007 15:30
par Anonyme
c'est clair qu'il faut être calé.
le principe est quand même simple en théorie. (pas le code :D )
on lance un rayon sur tout les pixels de l'image à partir du point de vue , ensuite à partir de ce pixel on part vers les sources lumineuses , suivant le vecteur on calcul l'intensité de la lumière ( lambert ? ) , je vais me documenté :D , c'est très intéressant ^^

Publié : mar. 18/déc./2007 15:32
par Anonyme
Voici un article très intéressant :
http://www.massal.net/article/raytrace/page1.html

Publié : mar. 18/déc./2007 16:45
par djes
Héhé, j'étais sûr que ça t'intéresserait ;) Moi aussi, surtout depuis que je fais de la 3D avec lightwave (l'un des meilleurs moteurs de rendu!). Merci pour le lien; je crois qu'il y a dans codearchiv une conversion de cet exemple

Publié : mar. 18/déc./2007 17:57
par Backup
djes a écrit :Héhé, j'étais sûr que ça t'intéresserait ;) Moi aussi, surtout depuis que je fais de la 3D avec lightwave (l'un des meilleurs moteurs de rendu!).
mais avec une ergonomie a pleurer !! :D

j'avais la version 6 , et j'ai fuit !! l'inteface est imbuvable, meme en ayant un livre TUTORIEL !! :?

pas du tout pratique, a utiliser, je prefere nettement 3DsMax qui est beaucoup plus convivial , meme Maya, d'ailleurs qui pourtant est plus ardue que 3dsmax ... , enfin c'est une question de gout :)

joyeusement illuminé

Publié : mar. 18/déc./2007 19:11
par beauregard
intéressant ce code !
piste à suivre:
-> remplacer le plot par un sprite d'un seul pixel
-> 3 objets au lieu de 6, afin d'esperer gagner quelques images secondes
Voici une version en mode fenetré, mais le curseur n'est plus là ! ( d'où l'utilisation d'un sprite 3D)

Code : Tout sélectionner

; tonton présente sa convertion du raytracing sur PureBasic.
; beauregard a fabriqué une modeste fenêtre. 
If InitMouse ()=0 Or InitKeyboard ()=0 Or InitSprite ()=0  Or InitSprite3D ()=0 
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf
UsePNGImageDecoder() 

Enumeration
     #fleche     
     #fleche3D
EndEnumeration



nbreplot.l ; connaître le nombre de pixel affiché à l'écran par ce programme, bien complexe.
 
 objnum = 7
   x0.f
   y0.f 
   z0.f
   mv.f
   md.f
   ca.f 
   tn.f
   tb.f
   rz.f
   x1.f
   y1.f
   z1.f
   a2.f
   b2.f
   c2.f
   tb.f
   k.f
   tmin.f
   col.f
   coll.f
   colll.f
   col2.f
   cc.f
   tb.f
   rz.f
   a0.f
   b0.f
   c0.f
   nx.f
   ny.f
   nz.f
   p.f
   d.f
   l.f
   l1.f
   p.f

   Dim OBJ(objnum)
   Dim t(92000)
   Dim t2(92000)
   Dim A(objnum)
   Dim B(objnum)
   Dim C(objnum)
   Dim R(objnum)
   Dim coul_r(objnum)
   Dim coul_v(objnum)
   Dim coul_b(objnum)
   D =1530
   l =00
   OBJ(0) = 0: A(0) = -50 + l: B(0) = 0 + l1: C(0) = -120: R(0) = -10000:coul_r(0)=25:coul_v(0)=25:coul_b(0)=255
   OBJ(1) = 0: A(1) = -80 - l: B(1) = -5 + l1: C(1) = -60: R(1) = -1000:coul_r(1)=155:coul_v(1)=55:coul_b(1)=255
   OBJ(2) = 0: A(2) = 5: B(2) = -80: C(2) = -580: R(2) = -4000:coul_r(2)=255:coul_v(2)=255:coul_b(2)=255
   OBJ(3) = 0: A(3) = -350: B(3) = 10: C(3) = -580: R(3) = -62000:coul_r(3)=255:coul_v(3)=0:coul_b(3)=0
   OBJ(4) = 0: A(4) = -50 + l: B(4) = -50 + l1: C(4) = -100: R(4) = -2000:coul_r(4)=255:coul_v(4)=255:coul_b(4)=55
   OBJ(5) = 0: A(5) = -80 - l: B(5) = 85 + l1: C(5) = -60: R(5) = -1000:coul_r(5)=55:coul_v(5)=255:coul_b(5)=255
   OBJ(6) = 0: A(6) = 16+moux: B(6) = -35+mouy: C(6) = 250

If OpenWindow ( 0 , 0, 0, 320+48, 200+48, "tonton illumine ton PC" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_ScreenCentered  ) ; on ouvre une fenetre
 OpenWindowedScreen ( WindowID ( 0 ), 23, 23, 320, 200, 0, 1, 1) ; fabrication d'un ecran graphique à l'intérieur de la fenêtre.
EndIf

; fleche ( remplaçant la mystérieuse disparition du curseur):
CreateSprite ( #fleche ,32,32, #PB_Sprite_Texture ) ; objet dirigé par le joueur.
 StartDrawing ( SpriteOutput ( #fleche ))
  BackColor ( RGB (0,0,0))
 

   LineXY (0,0, 16,0, RGB (250,250,250)) 
   LineXY (16,0, 0,16, RGB (250,250,250))
   LineXY (0,16, 0,0, RGB (250,250,250))

   LineXY (12,6, 16,10, RGB (250,250,250))
   LineXY (16,10, 10,16, RGB (250,250,250))
   LineXY (5,11, 10,16, RGB (250,250,250))
         
 StopDrawing ()
CreateSprite3D ( #fleche3D , #fleche)

; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************
 Event= WindowEvent ()
 ExamineKeyboard():ExamineMouse()
 FlipBuffers() 
 ClearScreen(RGB(0, 0, 0)) 

        StartDrawing(ScreenOutput())   
       
        p = p+0.1
        l=(Sin(p)*80)
        l1=(Cos(p)*180)
     
        
        moux=MouseX()
        mouy=MouseY()
   
        a(6)=moux*4-800
        b(6)=mouy*4-400
        A(0) = 50 + l
        A(1) = 90 - l
        b(0) = 80 + l
        b(1) = 50 - l1
        A(4) = 40 + l
        A(5) = 10 - l1
        b(4) = 51 + l1
        b(5) = 40 - l
     
        For YQ =0 To 199
         For XQ =0 To 319
          X0 = (-120 + XQ)
          Y0 = (-100 + YQ)
          Gosub raytrace
          Plot (xq,yq,RGB(col,coll,colll)): nbreplot+1 
         Next
        Next
        ;Plot (moux, mouy, RGB( 255, 255, 255))
        StopDrawing()





 Start3D() 
   DisplaySprite3D ( #fleche3D , MouseX (), MouseY (), 100); remplace le curseur mystérieusement disparu...
 Stop3D ()


 StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 FrontColor ( RGB (255,255,255))
    
     moux$= Str (moux)
     mouy$= Str (mouy)
     nbreplot$= Str (nbreplot)
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,80+1, "moux: " +moux$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,80, "moux: " +moux$)
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,100+1, "mouy: " +mouy$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,100, "mouy: " +mouy$)     
     FrontColor ( RGB (154,154,154)) :DrawText (1+1,120+1, "nbreplot: " +nbreplot$)
     FrontColor ( RGB (234,234,234)) :DrawText (1,120, "nbreplot: " +nbreplot$)

 StopDrawing ()
 
 nbreplot=0
        
 If KeyboardPushed ( #PB_Key_F ) And nbreis=0:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=1:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F ) And nbreis=2:nbreis+1:EndIf
 If KeyboardPushed ( #PB_Key_F )=0 And nbreis=3:nbreis=0:EndIf 
 
    Gosub fps ; nombre d'image par seconde.
   

 Delay(1)
 If Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ):End:EndIf
ForEver


        
        
        
raytrace:
        Z0 = 0
        MD = 1 / Sqr(X0 * X0 + Y0 * Y0 + d * d)
        X1 = X0 * MD
        Y1 = Y0 * MD
        Z1 = -(D + Z0) * MD
        K = 0
        COL = 0
        COLl = 0
        COLll = 0
        OBJMIN = objnum
Top:
        Gosub  test_inter
        OBJMIN = OBJMIN2
        If TMIN < 327680 And (OBJ(OBJMIN) = 0)
          Gosub  reflec
          Gosub  ombre   
          If s = 0
            MV = Sqr(NX * NX + NY * NY + NZ * NZ)
            COL2 = ((X1 * A2 + Y1 * B2 + Z1 * C2)*2+ (NX * A2 + NY * B2 + NZ * C2) / MV )
            If COL2 < 0
              COL2 = 0
            EndIf
            COL =((COL+COL2*((K+1)*(K+1))*coul_r(OBJMIN))/4)/255
            COLl =((coll+COL2*((K+1)*(K+1))*coul_v(OBJMIN))/4)/255
            COLll =((colll+cOL2*((K+1)*(K+1))*coul_b(OBJMIN))/4)/255
            If COL > 1
              COL = 1
            EndIf
            If COLl > 1
              COLl = 1
            EndIf
            If COLll > 1
              COLll = 1
            EndIf
          EndIf
          K = K + 0.1
        EndIf
        If TMIN < 327680 And K <= 1
          Goto Top
        EndIf
        If K = 0
          COL = 55
          COLl = 55
          COLll = 55
        Else
          COL = COL * 255
          COLl = COLl * 255
          COLll = COLll * 255
          If col>255
            col=255
          EndIf
          If coll>255
            coll=255
          EndIf
          If colll>255
            colll=255
          EndIf
        EndIf
Return

test_inter:       
        TMIN = 327680
        For n = 0 To 5
          A0 = A(n) - X0
          B0 = B(n) - Y0
          C0 = C(n) - Z0
          TB = A0 * X1 + B0 * Y1 + C0 * Z1
          RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
          If RZ >= R(n)
            TN = TB - Sqr(RZ - R(n))
            If TN < TMIN And TN > 0
              TMIN = TN:OBJMIN2 = n
            EndIf
          EndIf
        Next       
Return

reflec:
        X0 = X0 + X1 * TMIN
        Y0 = Y0 + Y1 * TMIN
        Z0 = Z0 + Z1 * TMIN
        NX = X0 - A(OBJMIN)
        NY = Y0 - B(OBJMIN)
        NZ = Z0 - C(OBJMIN)
        CA = 2*(NX * X1 + NY * Y1 + NZ * Z1) / ((NX * NX + NY * NY + NZ * NZ +1))
        X1 = X1 - NX * CA
        Y1 = Y1 - NY * CA
        Z1 = Z1 - NZ * CA
        A2 = A(6) - X0
        B2 = B(6) - Y0
        C2 = C(6) - Z0
        MV =  1/Sqr(A2 * A2 + B2 * B2 + C2 * C2)
        A2 = A2 * MV
        B2 = B2 * MV
        C2 = C2 * MV
Return

ombre:       
        s = 0
        For n = 0 To 5
          If OBJ(n) = 0 And s = 0
            A0 = X0 - A(n)
            B0 = Y0 - B(n)
            C0 = Z0 - C(n)
            TB = A2 * A0 + B2 * B0 + C2 * C0
            RZ = TB * TB - A0 * A0 - B0 * B0 - C0 * C0
            If RZ >= R(n) And TB < 0
              s = -1
            EndIf
          EndIf
        Next   
Return  
   
fps:
 If Val ( FormatDate ( "%ss" , Date ()))=sek ; regardez pas là, c'est trop compliqué. Arrêtez j'vous dis! Bon ben, je
     ; vous aurez prévenu...
    fps+1
 Else
    FPS$= Str (fps)
    fps=0
 EndIf
 sek= Val ( FormatDate ( "%ss" , Date ()))
 StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 FrontColor ( RGB (255,255,255))
 If nbreis=1 Or nbreis=2:DrawText (1,1, "FPS: " +FPS$):EndIf
 StopDrawing ()
Return         

Publié : mar. 18/déc./2007 21:07
par djes
Bah, c'est une question de goût et d'habitude. On a dans LW un contrôle très précis de tous les objets, ce qui est caché dans la plupart des autres logiciels. C'est justement ce que j'apprécie; je ne fais pas de la modélisation "intuitive", qui aboutit le plus souvent à des milliers de polygones disséminés un peu n'importe comment. C'est sûr que pour des surfaces organiques ou naturelles, c'est mieux, mais j'y arrive très bien aussi avec, alors...
J'ai essayé 3dmax et j'ai vomi plusieurs fois ;)
Dobro a écrit :
djes a écrit :Héhé, j'étais sûr que ça t'intéresserait ;) Moi aussi, surtout depuis que je fais de la 3D avec lightwave (l'un des meilleurs moteurs de rendu!).
mais avec une ergonomie a pleurer !! :D

j'avais la version 6 , et j'ai fuit !! l'inteface est imbuvable, meme en ayant un livre TUTORIEL !! :?

pas du tout pratique, a utiliser, je prefere nettement 3DsMax qui est beaucoup plus convivial , meme Maya, d'ailleurs qui pourtant est plus ardue que 3dsmax ... , enfin c'est une question de gout :)

Publié : mer. 19/déc./2007 10:09
par djes
Cpl.Bator a écrit :Voici un article très intéressant :
http://www.massal.net/article/raytrace/page1.html
Ce lien est vraiment excellent!!! :D

Publié : mer. 19/déc./2007 11:08
par Frenchy Pilou
Juste en passant un renderer très convivial (c'est rare) et gratoche ce qui ne gache rien :D
Kerkythea c'est Noël :)