Код | procedure CreateLandscape(d_:IDirect3DDevice9; var g_:IDirect3DVertexBuffer9; c:TBitMap; h:single); var row,col,rows,cols:integer; begin rows:=c.Width; cols:=c.Height; SetLength(dxH , rows-1, cols-1); SetLength(dxH_, rows-1, cols-1); SetLength(dzH , rows-1, cols-1); SetLength(dzH_, rows-1, cols-1); with c.Canvas do for col:=0 to cols-2 do for row:=0 to rows-2 do begin dxH [row,col]:=Pixels[row, col ]/h; dxH_[row,col]:=Pixels[row+1, col ]/h; dzH [row,col]:=Pixels[row, col+1]/h; dzH_[row,col]:=Pixels[row+1, col+1]/h; end; if FAILED(d_.CreateVertexBuffer((rows*5-5)*SizeOf(TVertex),0, D3DFVF_, D3DPOOL_DEFAULT, g_, nil)) then ShowMessage('y'); end; |
Код | procedure DrawLandscape(d_:IDirect3DDevice9; g_:IDirect3DVertexBuffer9; rows, cols:integer; step:single; xCam, zCam:single; r:integer); var v: ^TVertex; row,col: integer; r1,r2,r3,r4: integer; r5,r6,c5,c6: single; x,z: single; x1: single; begin z:=0; x1:=r*step; r1:=rows-2; r2:=r1 div 2; if r > r2 then r:=r2; r3:=2*r; r4:=r1; for col:=0 to cols - 2 do begin c5:=col/cols; c6:=1/cols; if ((z > zCam - x1)and(z < zCam + x1))then begin for row:=0 to r1 do if row > (xCam - x1)/step then begin r4:=row; break; end; if r4 > r1 - r3 then r4:=r1 - r3; x:=r4 * step; g_.Lock(0, (r3*5-5) * SizeOf(TVertex), Pointer(v), 0); for row:=r4 to r4 + r3 do begin r5:=row/rows; r6:=1/rows;
v.x:=x; v.y:=dxH [row,col]; v.z:= z; v.nx :=0; v.ny :=1; v.nz :=0; v.c:=$FFFFFFFF; v.u:=r5; v.v:=c5; inc(v);
v.x:=x+step; v.y:=dxH_[row,col]; v.z:= z; v.nx :=0; v.ny :=1; v.nz :=0; v.c:=$FFFFFFFF; v.u:=r5+r6; v.v:=c5; inc(v);
v.x:=x; v.y:=dzH [row,col]; v.z:= z-step; v.nx :=0; v.ny :=1; v.nz :=0; v.c:=$FFFFFFFF; v.u:=r5; v.v:=c5+c6; inc(v);
v.x:=x+step; v.y:=dzH_[row,col]; v.z:= z-step; v.nx :=0; v.ny :=1; v.nz :=0; v.c:=$FFFFFFFF; v.u:=r5+r6; v.v:=c5+c6; inc(v);
v.x:=x+step; v.y:=dxH_[row,col]; v.z:= z; v.nx :=0; v.ny :=1; v.nz :=0; v.c:=$FFFFFFFF; v.u:=r5+r6; v.v:=c5;
inc(v); x:=x + step; end; g_.Unlock; d_.SetStreamSource(0, g_, 0, SizeOf(TVertex)); d_.SetFVF(D3DFVF_); d_.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, (r3-2)*5-3); end; z:=z - step; end; end; |
Код | hBitMap:=TBitMap.Create; s:=Sim_path + '\Models\HEIGHT.BMP'; if FileExists(s) then hBitMap.LoadFromfile(s)else Application.Terminate; rows:=hBitMap.Width; cols:=hBitMap.Height; step:=10; view:=32; delH:=80000; CreateLandscape(g_pd3dDevice, gLand, hBitMap, delH); ******** DrawLandscape(g_pd3dDevice, gLand, rows, cols, step, xCam, zCam, view); |
Нашел исходник построение массива по картинке и построение ландашафта по этому массиву, есть вопросы, буду рад если кто то объяснит:
SetLength(dzH_, rows-1, cols-1); //на единицу меньше так как массив начинается с 0 for col:=0 to cols-2 do //а вот тут не понятно почему на 2 уменьшаем for row:=0 to rows-2 do //а вот тут не понятно почему на 2 уменьшаем
собственно это вопрос только по переводу в массив (да и зачем их 4)... может быть у кого-нибудь есть нормальный пример, буду очень рад |