Généralités sur la programmation 3D
tonton
Messages : 315 Inscription : mar. 26/avr./2005 15:19
Message
par tonton » ven. 03/mars/2006 18:17
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 » ven. 03/mars/2006 19:42
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 » sam. 04/mars/2006 12:44
C'est vrai que c'est pas facile à comprendre, mais cela donne envie de se pencher la dedans
tonton
Messages : 315 Inscription : mar. 26/avr./2005 15:19
Message
par tonton » lun. 06/mars/2006 14:11
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 » mer. 08/mars/2006 19:47
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 » jeu. 09/mars/2006 12:57
exact!!!!
bon comme je suis de mauvaise foie, je vais dire que j ai une resolution de 321 sur 201.
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
djes
Messages : 4252 Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France
Message
par djes » ven. 14/déc./2007 16:55
Anonyme
Message
par Anonyme » sam. 15/déc./2007 13:16
T'es trop balèze le tonton , en 200 lignes tu fais un raytracer
Mais je pige que dalle a tes codes
wolfjeremy
Messages : 1202 Inscription : sam. 31/déc./2005 23:52
Message
par wolfjeremy » sam. 15/déc./2007 13:24
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 » sam. 15/déc./2007 13:39
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.
djes
Messages : 4252 Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France
Message
par djes » sam. 15/déc./2007 13:42
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
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 » sam. 15/déc./2007 14:29
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...
Ar-S
Messages : 9540 Inscription : dim. 09/oct./2005 16:51
Contact :
Message
par Ar-S » mar. 18/déc./2007 10:06
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
djes
Messages : 4252 Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France
Message
par djes » mar. 18/déc./2007 12:14
Quake 4 RT tourne déjà en temps réel, et c'est quand même plutôt complexe...