demo raytracing (mais j y comprend rien)

Généralités sur la programmation 3D
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

demo raytracing (mais j y comprend rien)

Message par tonton »

j ai porté un programme de qbasic sur purebasic, une demo de raytracing.

resultat sympa, mais bon !! vu que j y comprend rien, j aurai du mal a faire evoler ce truc. :?

Code : Tout sélectionner

objnum = 4

   x0.f
   y0.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
   tmin.f
   col.f
   col2.f
   cc.f
   tb.f
   rz.f
   a0.f
   b0.f
   c0.f
   nx.f
   ny.f
   nz.f
   d.f
   l.l
   
   
   

 InitSprite() 
   InitKeyboard() 
   InitMouse() 
  OpenScreen(1024,768,32, "") 
   addecr1 = DrawingBuffer() 
  
   StartDrawing(ScreenOutput()) 
  addecr1 = DrawingBuffer() 
   StopDrawing()
  FlipBuffers()
  StartDrawing(ScreenOutput()) 
     largecr=DrawingBufferPitch()

Dim OBJ(objnum)
Dim t(82000)
Dim t2(82000)
Dim A(objnum)
Dim B(objnum)
Dim C(objnum)
Dim R(objnum)


    D = 230
    l = 0
   
 ;   'four objects
    OBJ(0) = 0: A(0) = -50 + l: B(0) = 0: C(0) = -100: R(0) = -55 * 55
    OBJ(1) = 0: A(1) = 50 - l: B(1) = -25: C(1) = -120: R(1) = -55 * 55
    OBJ(2) = 0: A(2) = 50: B(2) = 80: C(2) = -110: R(2) = -150 * 50
    OBJ(3) = 1: A(3) = 60: B(3) = -35: C(3) = -30


    For l = 0 To 100;199

       
        A(0) = -50 + l
        A(1) = 50 - l
        posi = 400
        mmmm = -1
    ;    'calculamos uno de cada 4 pixels a buffer t()
        For Y = -40 To 139 Step 2
            For X = -80 To 79 Step 2
                X0 = X
                Y0 = Y
                Gosub raytrace
                t(posi) = COL
                posi = posi + 1
            Next
        Next
        posi = 482
        POS2 = 0
   
        For YQ =6 To 143
            For XQ = 2 To 77
            
                 If t2(posi) = t2(posi + 1) And t2(posi) = t2(posi + 80) And t2(posi) = t2(posi + 81) 
                    ipos = ((YQ *largecr+(XQ *4))*4)
                                        For YY = 0 To 3
                        For XX = 0 To 3
                        
                        
                        zzz=(YY * (t(posi + 80) * (4 - XX) + t(posi + 81) * XX) + (t(posi) * (4 - XX) + t(posi + 1) * XX) * (4 - YY)) / 15
                        zzz2=zzz*256
                     ;   zzz3=zzz*256*256
                        zzz4=zzz+zzz2+zzz3 
                      
                                     
                       PokeL(ipos+addecr1,zzz4)
                    
                        
                          ipos = ipos + 4
                        Next
                      ipos = ipos +    largecr-16
                    Next
           
                 Else
                    mmmm = 0
                    For yy1 = 0 To 3
                        For xx1 = 0 To 3
                       X0 = (-160 + XQ * 4 + xx1) / 2
                                Y0 = (-100 + YQ * 4 + yy1) / 2
                                Gosub raytrace
                                
                               sss=((YQ * 4 + yy1) * 1024+ XQ * 4 + xx1)*4
                               
                               col=Int(col)
                               
                               col22=col*256
                           ;    col33=col*256*256
                               col44=col+col22+col33
                                
                             PokeL (sss+addecr1, COL44)
                            
                
                            
                        Next
                   Next
                EndIf
                posi = posi + 1
            Next
            posi = posi + 4
        Next
      
      Next
     
End

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
    OBJMIN = objnum
    If mmmm < 0 
    t2(posi) = objnum
    EndIf
Top:
        TMIN = 327680
        For n = 0 To 2
            If OBJ(n) = 0 And (OBJ(n) <> OBJMIN) 
                 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
            EndIf
        Next
        OBJMIN = OBJMIN2
        If TMIN < 327680 And (OBJ(OBJMIN) = 0) 
             If mmmm < 0 
             t2(posi) = t2(posi) * K * objnum * 3 + OBJMIN
             EndIf
             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(3) - X0
             B2 = B(3) - Y0
             C2 = C(3) - Z0
             MV = 1 / Sqr(A2 * A2 + B2 * B2 + C2 * C2)
             A2 = A2 * MV
             B2 = B2 * MV
             C2 = C2 * MV
             s = 0
             For n = 0 To 2
                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
                   If mmmm < 0 
                   t2(posi) = t2(posi) * 32
                   EndIf
               EndIf
             Next
             If s = 0 
    
               t2(posi) = t2(posi) + 1
                COL2 = X1 * A2 + Y1 * B2 + Z1 * C2
           
                If COL2 < 0 
                COL2 = 0
                EndIf
             
                cc = COL2 * COL2
                COL2 = cc * cc
                MV = Sqr(NX * NX + NY * NY + NZ * NZ)
                If COL2 < 0 
                COL2 = 0
                EndIf
                COL2 = COL2 + (NX * A2 + NY * B2 + NZ * C2) / MV
                If COL2 < 0 
                COL2 = 0
                EndIf
                COL = COL + COL2 / ((K + 1) * (K + 1) * 2)
                If COL > 1 
                COL = 1
                EndIf
            EndIf
        K = K + 1
        EndIf
    If TMIN < 327680 And K <= 2
    Goto Top
    EndIf
   If K = 0 
   COL = 150
   Else 
   COL = COL * 255
   If col>255
    col=255
    EndIf
   EndIf
 
   
Return
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

petite modif de forme

Code : Tout sélectionner

objnum = 4

   x0.f
   y0.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
   tmin.f
   col.f
   col2.f
   cc.f
   tb.f
   rz.f
   a0.f
   b0.f
   c0.f
   nx.f
   ny.f
   nz.f
   d.f
   l.f
   l1.f
   p.f
   
   
   

 InitSprite() 
   InitKeyboard() 
   InitMouse() 
  OpenScreen(1024,768,32, "") 
   addecr1 = DrawingBuffer() 
  
   StartDrawing(ScreenOutput()) 
  addecr1 = DrawingBuffer() 
   StopDrawing()
  FlipBuffers()
  StartDrawing(ScreenOutput()) 
     largecr=DrawingBufferPitch()

Dim OBJ(objnum)
Dim t(82000)
Dim t2(82000)
Dim A(objnum)
Dim B(objnum)
Dim C(objnum)
Dim R(objnum)


    D = 530
    l = 0
   
 ;   'four objects
    OBJ(0) = 0: A(0) = -50 + l: B(0) = 0 + l1: C(0) = -100: R(0) = -15 * 50
    OBJ(1) = 0: A(1) = -80 - l: B(1) = -5 + l1: C(1) = -60: R(1) = -15 * 55
    OBJ(2) = 0: A(2) = 5: B(2) = 80: C(2) = -110: R(2) = -150 * 50
    OBJ(3) = 1: A(3) = 60: B(3) = -135: C(3) = -30

polo:
     p = p+0.1
     If p>10
     End
     EndIf 
     l=(Sin(p)*40)
      l1=(Cos(p)*40)
       
        A(0) = -50 + l
        A(1) = 50 - l
         b(0) = -10 + l1
        b(1) = 10 - l1
        posi = 400
        mmmm = -1
    ;    'calculamos uno de cada 4 pixels a buffer t()
        For Y = -40 To 139 Step 2
            For X = -80 To 79 Step 2
                X0 = X
                Y0 = Y
                Gosub raytrace
                t(posi) = COL
                posi = posi + 1
            Next
        Next
        posi = 482
        POS2 = 0
   
        For YQ =6 To 143
            For XQ = 2 To 77
            
                 If t2(posi) = t2(posi + 1) And t2(posi) = t2(posi + 80) And t2(posi) = t2(posi + 81) 
                    ipos = ((YQ *largecr+(XQ *4))*4)
                                        For YY = 0 To 3
                        For XX = 0 To 3
                        
                        
                        zzz=(YY * (t(posi + 80) * (4 - XX) + t(posi + 81) * XX) + (t(posi) * (4 - XX) + t(posi + 1) * XX) * (4 - YY)) / 16
                        zzz2=zzz*256
                     ;   zzz3=zzz*256*256
                        zzz4=zzz+zzz2+zzz3 
                      
                                     
                       PokeL(ipos+addecr1,zzz4)
                    
                        
                          ipos = ipos + 4
                        Next
                      ipos = ipos +    largecr-16
                    Next
           
                 Else
                    mmmm = 0
                    For yy1 = 0 To 3
                        For xx1 = 0 To 3
                       X0 = (-160 + XQ * 4 + xx1) / 2
                                Y0 = (-100 + YQ * 4 + yy1) / 2
                                Gosub raytrace
                                
                               sss=((YQ * 4 + yy1) * (1024)+ XQ * 4 + xx1)*4
                               
                               col=Int(col)
                               
                               col22=col*256
                           ;    col33=col*256*256
                               col44=col+col22+col33
                                
                             PokeL (sss+addecr1, COL44)
                            
                
                            
                        Next
                   Next
                EndIf
                posi = posi + 1
            Next
            posi = posi + 4
        Next
      
   Goto polo
     
End

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
    OBJMIN = objnum
    If mmmm < 0 
    t2(posi) = objnum
    EndIf
Top:
        TMIN = 327680
        For n = 0 To 2
            If OBJ(n) = 0 And (OBJ(n) <> OBJMIN) 
                 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
            EndIf
        Next
        OBJMIN = OBJMIN2
        If TMIN < 327680 And (OBJ(OBJMIN) = 0) 
             If mmmm < 0 
             t2(posi) = t2(posi) * K * objnum * 3 + OBJMIN
             EndIf
             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(3) - X0
             B2 = B(3) - Y0
             C2 = C(3) - Z0
             MV = 1 / Sqr(A2 * A2 + B2 * B2 + C2 * C2)
             A2 = A2 * MV
             B2 = B2 * MV
             C2 = C2 * MV
             s = 0
             For n = 0 To 2
                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
                   If mmmm < 0 
                   t2(posi) = t2(posi) * 32
                   EndIf
               EndIf
             Next
             If s = 0 
    
               t2(posi) = t2(posi) + 1
                COL2 = X1 * A2 + Y1 * B2 + Z1 * C2
           
                If COL2 < 0 
                COL2 = 0
                EndIf
             
                cc = COL2 * COL2
                COL2 = cc * cc
                MV = Sqr(NX * NX + NY * NY + NZ * NZ)
                If COL2 < 0 
                COL2 = 0
                EndIf
                COL2 = COL2 + (NX * A2 + NY * B2 + NZ * C2) / MV
                If COL2 < 0 
                COL2 = 0
                EndIf
                COL = COL + COL2 / ((K + 1) * (K + 1) * 2)
                If COL > 1 
                COL = 1
                EndIf
            EndIf
        K = K + 1
        EndIf
    If TMIN < 327680 And K <= 2
    Goto Top
    EndIf
   If K = 0 
   COL = 150
   Else 
   COL = COL * 255
   If col>255
    col=255
    EndIf
   EndIf
 
   
Return

Anonyme

Message par Anonyme »

C'est vrai que c'est pas facile à comprendre, mais cela donne envie de se pencher la dedans :D
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

comence a comprendre le truc

Code : Tout sélectionner

 objnum = 8
   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
   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
   InitSprite() 
   InitKeyboard() 
   InitMouse() 
   OpenScreen(320,200,32, "") 
   Dim OBJ(objnum)
   Dim t(92000)
   Dim t2(92000)
   Dim A(objnum)
   Dim B(objnum)
   Dim C(objnum)
   Dim R(objnum)
    D =1530
    l =00
    OBJ(0) = 0: A(0) = -50 + l: B(0) = 0 + l1: C(0) = -120: R(0) = -10000
    OBJ(1) = 0: A(1) = -80 - l: B(1) = -5 + l1: C(1) = -60: R(1) = -1000
    OBJ(2) = 0: A(2) = 5: B(2) = -80: C(2) = -50: R(2) = -300
    OBJ(3) = 0: A(3) = -150: B(3) = 10: C(3) = -180: R(3) = -12000
    OBJ(4) = 0: A(4) = -50 + l: B(4) = -50 + l1: C(4) = -100: R(4) = -2000
    OBJ(5) = 0: A(5) = -80 - l: B(5) = 85 + l1: C(5) = -60: R(5) = -1000
    OBJ(6) = 0: A(6) = 16+moux: B(6) = -35+mouy: C(6) = 250
    OBJ(7) = 0: A(7) = 1600+moux: B(7) = -35+mouy: C(7) = 250

polo:
        ExamineKeyboard() 
        If KeyboardPushed(#PB_Key_Escape) 
        End 
        EndIf 
        StartDrawing(ScreenOutput())    
       
        p = p+0.1
        l=(Sin(p)*80)
        l1=(Cos(p)*180)
      
        ExamineMouse()
        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 200
        For XQ =0 To 320
        X0 = (-120 + XQ)
        Y0 = (-100 + YQ)
        Gosub raytrace
        
        Plot (xq,yq,RGB(col,col,col)) 
        Next
        Next
        StopDrawing()
        FlipBuffers()
        Goto polo

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
        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)*0.55)
        If COL > 1 
        COL = 1
        EndIf
        EndIf
        K = K + 0.1
        EndIf
        If TMIN < 327680 And K <= 1
        Goto Top
        EndIf
        If K = 0 
        COL = 55
        Else 
        COL = COL * 255
        If col>255
        col=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         
DaVain
Messages : 1
Inscription : mer. 08/mars/2006 16:36

Message par DaVain »

tonton :
s'il vous plaît, mon france excuse ! Tu as effectué un
travail très propre ! Toutefois, une petite erreur est là !

Code : Tout sélectionner

        For YQ =0 To 200
        For XQ =0 To 320

modifie des lignes suivant simplement :

        For YQ =0 To 200 -1   ; 0 - 199 = 200 
        For XQ =0 To 320 -1  ; 0 - 319 = 320 ;-)
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

exact!!!! :oops:
bon comme je suis de mauvaise foie, je vais dire que j ai une resolution de 321 sur 201. :lol:

un peu de couleur pour me faire pardoner.

Code : Tout sélectionner

 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 
   InitSprite() 
   InitKeyboard() 
   InitMouse() 
   OpenScreen(320,200,32, "") 
   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

polo: 
        ExamineKeyboard() 
        If KeyboardPushed(#PB_Key_Escape) 
        End 
        EndIf 
        StartDrawing(ScreenOutput())    
        
        p = p+0.1 
        l=(Sin(p)*80) 
        l1=(Cos(p)*180) 
      
        ExamineMouse() 
        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)) 
        Next 
        Next 
        StopDrawing() 
        FlipBuffers() 
        Goto polo 
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         
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Anonyme

Message par Anonyme »

T'es trop balèze le tonton , en 200 lignes tu fais un raytracer 8O
Mais je pige que dalle a tes codes :D
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

J'ai jamais capté en quoi le RT était mieu que la méthode d'affichage actuelle... a part qu'elle pompe beaucoup plus pour un résultat moins bon...
Anonyme

Message par Anonyme »

pk moins bon ? car cela pompe trop de ressources... , la méthode actuelle polygonale sera révolu d'ici quelque temps , avec une méthode de raytracing , tu obtiens un meilleurs réalisme.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

:?: Le lancé de rayon a un rendu bien meilleur; il essaye de reproduire les phénomènes physiques de la réalité, au contraire du modèle actuel qui est une sorte de bricolage visant à simuler le même effet mais en se basant sur des entités plus à même d'être affichées rapidement par une carte graphique. Avec la montée en puissance des calculateurs, le gain apporté comparativement à la complexité fait que l'avantage est clairement du côté du raytracing. Le meilleur exemple vient des ombres, mais on peut aussi avancer l'avantage pour les surfaces courbes, les reflexions, les transparences, etc etc etc
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tres bon PDF sur le Raytracing ici : (pour Bon Matheux)

http://ph.ris.free.fr/these/Ph.RIS-Chp2Illumination.pdf
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 »

Le RayTracing, c'est certainement l'avenir, meme sur le plan hardware, y-a pas mieux
niveau réalisme. Les puissance grandissantes de nos machines et la volontés de certains
constructeurs de carte video pourrait nous permettre de voir du temps réél sur des scenes
complexes d'ici à 5 ans environ.

Et la, un nouveau cap niveau 3D sera franchis... ;)
Force et sagesse...
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Je suis d'accord avec vous, le raytracing c'est vraiment chouette.

Si on affiche la fenetre du code avec une haute resolution genre 1280x1024 c'est vraiment chouette :P
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Quake 4 RT tourne déjà en temps réel, et c'est quand même plutôt complexe...
Répondre