Autor |
Beitrag |
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 11.10.06 20:09
jo, schau mal hier, da gibts schon recht schicke sachen:
graphics.stanford.edu/~fedkiw/
sowas braucht man halt heutzutage in der film/animationsindustrie
aber mein code stimmt immmer noch net, da ist irgendwas faul, nur weiß ich net was, ich bin da schon ewig dran am wursteln, bald bin ich soweit, den ganzen source nochmal zu übersetzen *grml*
mfg
|
|
alias5000
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Do 12.10.06 15:45
[Edit] hab's rausgelöscht, weil falscher Thread...[/Edit]
_________________ Programmers never die, they just GOSUB without RETURN
|
|
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 13.10.06 12:52
naja ich werd wohl morgen früh aufstehen und mich dann dran machen den source nochmal zu übersetzen und dann so lange zu probieren bis das klappt und wenn das abend wird
edit: so weit schonmal:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195:
| unit fluid_solver;
interface
type TSingleArray = array of Single; TFluidSimulation = class private fN, fsize: integer; procedure SetN(const Value: integer); function IX(i, j: integer): integer; procedure SWAP(var x0, x: TSingleArray); procedure add_source(var x: TSingleArray; s: TSingleArray; dt: single); procedure set_bnd(b: integer; var x: TSingleArray); procedure lin_solve(b: integer; var x: TSingleArray; x0: TSingleArray; a, c: single); procedure diffuse(b: integer; var x: TSingleArray; x0: TSingleArray; diff, dt: single); procedure advect(b: integer; var d: TSingleArray; d0, u, v: TSingleArray; dt: single); procedure project(var u, v, p, d: TSingleArray); public procedure dens_step(var x, x0: TSingleArray; u, v: TSingleArray; diff, dt: single); procedure vel_step(var u, v, u0, v0: TSingleArray; visc, dt: single); property N: integer read fN write SetN; end;
implementation
procedure TFluidSimulation.SetN(const Value: integer); begin fN := value; fsize := (fN + 2) * (fN + 2) end;
function TFluidSimulation.IX(i, j: integer): integer; begin result := i + (fN + 2) * j; end;
procedure TFluidSimulation.SWAP(var x0, x: TSingleArray); var tmp: TSingleArray; i: integer; begin setlength(tmp, length(x0)); for i := low(x0) to high(x0) do tmp[i] := x0[i]; setlength(x0, length(x)); for i := low(x) to high(x) do x0[i] := x[i]; setlength(x, length(tmp)); for i := low(tmp) to high(tmp) do x[i] := tmp[i]; end;
procedure TFluidSimulation.add_source(var x: TSingleArray; s: TSingleArray; dt: single); var i: integer; begin for i := 0 to fsize - 1 do x[i] := x[i] + dt * s[i]; end;
procedure TFluidSimulation.set_bnd(b: integer; var x: TSingleArray); var i: integer; begin for i := 1 to fN - 1 do begin if b = 1 then begin x[IX(0 , i)] := -x[IX(1 , i)]; x[IX(fN + 1, i)] := -x[IX(fN, i)]; end else begin x[IX(0 , i)] := x[IX(1 , i)]; x[IX(fN + 1, i)] := x[IX(fN, i)]; end; if b = 2 then begin x[IX(i, 0 )] := -x[IX(i, 1 )]; x[IX(i, fN + 1)] := -x[IX(i, fN)]; end else begin x[IX(i, 0 )] := x[IX(i, 1 )]; x[IX(i, fN + 1)] := x[IX(i, fN)]; end; end; x[IX(0 , 0 )] := 0.5 * (x[IX(1 , 0 )] + x[IX(0 , 1 )]); x[IX(0 , fN + 1)] := 0.5 * (x[IX(1 , fN + 1)] + x[IX(0 , fN)]); x[IX(fN + 1, 0 )] := 0.5 * (x[IX(fN, 0 )] + x[IX(fN + 1, 1 )]); x[IX(fN + 1, fN + 1)] := 0.5 * (x[IX(fN, fN + 1)] + x[IX(fN + 1, fN)]); end;
procedure TFluidSimulation.lin_solve(b: integer; var x: TSingleArray; x0: TSingleArray; a, c: single); var i, j, k: integer; begin for k := 0 to 19 do begin for i := 1 to fN do for j := 1 to fN do x[IX(i, j)] := (x0[IX(i, j)] + a * (x[IX(i - 1, j)] + x[IX(i + 1, j)] + x[IX(i, j - 1)] + x[IX(i, j + 1)])) / c; set_bnd(b, x); end; end;
procedure TFluidSimulation.diffuse(b: integer; var x: TSingleArray; x0: TSingleArray; diff, dt: single); var a: single; begin a := dt * diff * fN * fN; lin_solve(b, x, x0, a, 1 + 4 * a); end;
procedure TFluidSimulation.advect(b: integer; var d: TSingleArray; d0, u, v: TSingleArray; dt: single); var i, j, i0, j0, i1, j1: integer; x, y, s0, t0, s1, t1, dt0: single; begin dt0 := dt * fN; for i := 1 to fN do for j := 1 to fN do begin x := i - dt0 * u[IX(i, j)]; y := j - dt0 * v[IX(i, j)]; if (x < 0.5) then x := 0.5; if (x > fN + 0.5) then x := fN + 0.5; i0 := round(x); i1 := i0 + 1; if (y < 0.5) then y := 0.5; if (y > fN + 0.5) then y := fN + 0.5; j0 := round(y); j1 := j0 + 1; s1 := x - i0; s0 := 1 - s1; t1 := y - j0; t0 := 1 - t1; d[IX(i, j)] := s0 * (t0 * d0[IX(i0, j0)] + t1 * d0[IX(i0, j1)]) + s1 * (t0 * d0[IX(i1, j0)] + t1 * d0[IX(i1, j1)]); end; set_bnd(b, d); end;
procedure TFluidSimulation.project(var u, v, p, d: TSingleArray); var i, j: integer; begin for i := 1 to N do for j := 1 to N do begin d[IX(i, j)] := -0.5 * (u[IX(i + 1, j)] - u[IX(i - 1, j)] + v[IX(i, j + 1)] - v[IX(i, j - 1)]) / N; p[IX(i, j)] := 0; end; set_bnd(0, d); set_bnd(0, p); lin_solve(0, p, d, 1, 4); for i := 1 to fN do for j := 1 to fN do begin u[IX(i,j)] := u[IX(i,j)] - (0.5 * N * (p[IX(i + 1, j)] - p[IX(i - 1, j)])); v[IX(i,j)] := v[IX(i,j)] - (0.5 * N * (p[IX(i, j + 1)] - p[IX(i, j - 1)])); end; set_bnd(1, u); set_bnd(2, v); end;
procedure TFluidSimulation.dens_step(var x, x0: TSingleArray; u, v: TSingleArray; diff, dt: single); begin add_source(x, x0, dt); SWAP(x0, x); diffuse(0, x, x0, diff, dt); SWAP(x0, x); advect(0, x, x0, u, v, dt); end;
procedure TFluidSimulation.vel_step(var u, v, u0, v0: TSingleArray; visc, dt: single); begin add_source(u, u0, dt); add_source(v, v0, dt); SWAP(u0, u); diffuse(1, u, u0, visc, dt); SWAP(v0, v); diffuse(2, v, v0, visc, dt); project(u, v, u0, v0); SWAP(u0, u); SWAP(v0, v); advect(1, u, u0, u0, v0, dt); advect(2, v, v0, u0, v0, dt); project(u, v, u0, v0); end;
end. |
jetzt wird die klasse noch brauchbar gemacht und die zeichen prozeduren etc hinzugefügt
mfg
|
|
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Sa 14.10.06 16:52
so, aus der neuen übersetzung ist jetzt diese klasse hier geworden, die erstmal alle features der demo beinhaltet:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296:
| unit fluid_solver;
interface
uses dglOpengl;
type TSingleArray = array of Single; TFluidSimulation = class private fN, fsize: integer; fu, fv, fu_prev, fv_prev, fdens, fdens_prev: TSingleArray; fdiff, fvisc: single; procedure SetN(const Value: integer); function IX(i, j: integer): integer; procedure SWAP(var x0, x: TSingleArray); procedure add_source(var x: TSingleArray; s: TSingleArray; dt: single); procedure set_bnd(b: integer; var x: TSingleArray); procedure lin_solve(b: integer; var x: TSingleArray; x0: TSingleArray; a, c: single); procedure diffuse(b: integer; var x: TSingleArray; x0: TSingleArray; diff, dt: single); procedure advect(b: integer; var d: TSingleArray; d0, u, v: TSingleArray; dt: single); procedure project(var u, v, p, d: TSingleArray); procedure dens_step(var x, x0: TSingleArray; u, v: TSingleArray; diff, dt: single); procedure vel_step(var u, v, u0, v0: TSingleArray; visc, dt: single); public procedure Initialize(pN: integer; pvisc, pdiff: single); procedure Reset; procedure NextStep(pTimestep: single); procedure AddForce(px, py: integer; pForceX, pForceY: single); procedure AddSource(px, py: integer; pSource: single); procedure Draw_Velocity; procedure Draw_Density; end;
implementation
procedure TFluidSimulation.Initialize(pN: integer; pvisc, pdiff: single); begin SetN(pN); setlength(fu, fsize); setlength(fv, fsize); setlength(fu_prev, fsize); setlength(fv_prev, fsize); setlength(fdens, fsize); setlength(fdens_prev, fsize); fvisc := pvisc; fdiff := pdiff; end;
procedure TFluidSimulation.SetN(const Value: integer); begin fN := value; fsize := (fN + 2) * (fN + 2); end;
function TFluidSimulation.IX(i, j: integer): integer; begin result := i + (fN + 2) * j; end;
procedure TFluidSimulation.SWAP(var x0, x: TSingleArray); var tmp: TSingleArray; begin tmp := x0; x0 := x; x := tmp; end;
procedure TFluidSimulation.add_source(var x: TSingleArray; s: TSingleArray; dt: single); var i: integer; begin for i := 0 to fsize - 1 do x[i] := x[i] + dt * s[i]; end;
procedure TFluidSimulation.set_bnd(b: integer; var x: TSingleArray); var i: integer; begin for i := 1 to fN - 1 do begin if b = 1 then begin x[IX(0 , i)] := -x[IX(1 , i)]; x[IX(fN + 1, i)] := -x[IX(fN, i)]; end else begin x[IX(0 , i)] := x[IX(1 , i)]; x[IX(fN + 1, i)] := x[IX(fN, i)]; end; if b = 2 then begin x[IX(i, 0 )] := -x[IX(i, 1 )]; x[IX(i, fN + 1)] := -x[IX(i, fN)]; end else begin x[IX(i, 0 )] := x[IX(i, 1 )]; x[IX(i, fN + 1)] := x[IX(i, fN)]; end; end; x[IX(0 , 0 )] := 0.5 * (x[IX(1 , 0 )] + x[IX(0 , 1 )]); x[IX(0 , fN + 1)] := 0.5 * (x[IX(1 , fN + 1)] + x[IX(0 , fN)]); x[IX(fN + 1, 0 )] := 0.5 * (x[IX(fN, 0 )] + x[IX(fN + 1, 1 )]); x[IX(fN + 1, fN + 1)] := 0.5 * (x[IX(fN, fN + 1)] + x[IX(fN + 1, fN)]); end;
procedure TFluidSimulation.lin_solve(b: integer; var x: TSingleArray; x0: TSingleArray; a, c: single); var i, j, k: integer; begin for k := 0 to 19 do begin for i := 1 to fN do for j := 1 to fN do x[IX(i, j)] := (x0[IX(i, j)] + a * (x[IX(i - 1, j)] + x[IX(i + 1, j)] + x[IX(i, j - 1)] + x[IX(i, j + 1)])) / c; set_bnd(b, x); end; end;
procedure TFluidSimulation.diffuse(b: integer; var x: TSingleArray; x0: TSingleArray; diff, dt: single); var a: single; begin a := dt * diff * fN * fN; lin_solve(b, x, x0, a, 1 + 4 * a); end;
procedure TFluidSimulation.advect(b: integer; var d: TSingleArray; d0, u, v: TSingleArray; dt: single); var i, j, i0, j0, i1, j1: integer; x, y, s0, t0, s1, t1, dt0: single; begin dt0 := dt * fN; for i := 1 to fN do for j := 1 to fN do begin x := i - dt0 * u[IX(i, j)]; y := j - dt0 * v[IX(i, j)]; if (x < 0.5) then x := 0.5; if (x > fN + 0.5) then x := fN + 0.5; i0 := round(x); i1 := i0 + 1; if (y < 0.5) then y := 0.5; if (y > fN + 0.5) then y := fN + 0.5; j0 := round(y); j1 := j0 + 1; s1 := x - i0; s0 := 1 - s1; t1 := y - j0; t0 := 1 - t1; d[IX(i, j)] := s0 * (t0 * d0[IX(i0, j0)] + t1 * d0[IX(i0, j1)]) + s1 * (t0 * d0[IX(i1, j0)] + t1 * d0[IX(i1, j1)]); end; set_bnd(b, d); end;
procedure TFluidSimulation.project(var u, v, p, d: TSingleArray); var i, j: integer; begin for i := 1 to fN do for j := 1 to fN do begin d[IX(i, j)] := -0.5 * (u[IX(i + 1, j)] - u[IX(i - 1, j)] + v[IX(i, j + 1)] - v[IX(i, j - 1)]) / fN; p[IX(i, j)] := 0; end; set_bnd(0, d); set_bnd(0, p); lin_solve(0, p, d, 1, 4); for i := 1 to fN do for j := 1 to fN do begin u[IX(i,j)] := u[IX(i,j)] - (0.5 * fN * (p[IX(i + 1, j)] - p[IX(i - 1, j)])); v[IX(i,j)] := v[IX(i,j)] - (0.5 * fN * (p[IX(i, j + 1)] - p[IX(i, j - 1)])); end; set_bnd(1, u); set_bnd(2, v); end;
procedure TFluidSimulation.dens_step(var x, x0: TSingleArray; u, v: TSingleArray; diff, dt: single); begin add_source(x, x0, dt); SWAP(x0, x); diffuse(0, x, x0, diff, dt); SWAP(x0, x); advect(0, x, x0, u, v, dt); end;
procedure TFluidSimulation.vel_step(var u, v, u0, v0: TSingleArray; visc, dt: single); begin add_source(u, u0, dt); add_source(v, v0, dt); SWAP(u0, u); diffuse(1, u, u0, visc, dt); SWAP(v0, v); diffuse(2, v, v0, visc, dt); project(u, v, u0, v0); SWAP(u0, u); SWAP(v0, v); advect(1, u, u0, u0, v0, dt); advect(2, v, v0, u0, v0, dt); project(u, v, u0, v0); end;
procedure TFluidSimulation.NextStep(pTimestep: single); begin vel_step(fu, fv, fu_prev, fv_prev, fvisc, pTimestep); dens_step(fdens, fdens_prev, fu, fv, fdiff, pTimestep); end;
procedure TFluidSimulation.Reset; var i: integer; begin for i := 0 to fsize - 1 do begin fu[i] := 0; fv[i] := 0; fu_prev[i] := 0; fv_prev[i] := 0; fdens[i] := 0; fdens_prev[i] := 0; end; end;
procedure TFluidSimulation.AddForce(px, py: integer; pForceX, pForceY: single); begin fu_prev[IX(px, py)] := pForceX; fv_prev[IX(px, py)] := pForceY; end;
procedure TFluidSimulation.AddSource(px, py: integer; pSource: single); begin fdens_prev[IX(px, py)] := pSource; end;
procedure TFluidSimulation.Draw_Velocity; var i, j: integer; x, y, h: single; begin h := 1 / fN;
glColor3f(1, 1, 1); glLineWidth(1);
glBegin(GL_LINES); for i := 1 to fN do begin x := (i - 0.5) * h; for j := 1 to fN do begin y := (j - 0.5) * h; glColor3f(1, 1, 1); glVertex2f(x, y); glVertex2f(x + fu[IX(i, j)], y + fv[IX(i, j)]); end end; glEnd; end;
procedure TFluidSimulation.Draw_Density; var i, j: integer; x, y, h, d00, d01, d10, d11: single; begin h := 1 / fN; glBegin(GL_QUADS); for i := 0 to fN do begin x := (i - 0.5) * h; for j := 0 to fN do begin y := (j - 0.5) * h; d00 := fdens[IX(i , j )]; d01 := fdens[IX(i , j + 1)]; d10 := fdens[IX(i + 1, j )]; d11 := fdens[IX(i + 1, j + 1)]; glColor3f(d00, 0, 0); glVertex2f(x , y ); glColor3f(d10, 0, 0); glVertex2f(x + h, y ); glColor3f(d11, 0, 0); glVertex2f(x + h, y + h); glColor3f(d01, 0, 0); glVertex2f(x , y + h); end; end; glEnd; end;
end. |
jedoch klappt es leider immer noch nicht. nach einiger zeit spielt das velocity gitter verrückt und beim zeichnen der density bilden sich streifen Oo
und ich glaube nicht, dass ich beim zweiten übersetzen den gleichen fehler gemacht haben könnte, also muss die ursache woanders zu suchen sein, nur wo ?
mfg
|
|
|