Сообщение от Nex
Как делают волны на воде и их обрезание (уменьшение детализации меша) в зависимости от расстояния?
|
Делаешь квадратную равномерную сетку. Потом сжимаешь возле камеры ее так чтобы она слегка была шире поля обзора, а вдали нааоборот увеличиваешь расстояние между вершинами, тоже самое для рядов идущих перпендикулярно линии взгляда, те что возле камеры меньше расстояние, а те что вдали больше расстояние.
а потом анимировать можно как то так:

Function GrimMagicWater(meshid)
PointEntity light,camera
PositionEntity light,225*Sin(MilliSecs()/30),15,225*Cos(MilliSecs()/30)
PositionEntity watermesh,EntityX(camera,1),0,EntityZ(camera,1)
RotateEntity watermesh,0,EntityYaw(camera,1)-45,0
If EntityY(camera,1)<1 Then PositionEntity camera,EntityX(camera,1),1,EntityZ(camera,1),1
ScaleTexture watertex,1+Sin(MilliSecs()/100)/10,1+Cos(MilliSecs()/50)/10
waveheight#=8
horizwave#=6
Noiseamplitude#=0.2
wavelength#=10 ; меньшее значение означает большую длину
wavehorizlength#=35
speed#=1
time#=MilliSecs()*speed
mesh=meshid
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)
;теперь магия
For i=0 To qvert-1
x000#=plane#(i,0)
y000#=plane#(i,2)
z000#=0
TFormPoint x000,z000,y000,mesh,0
x00#=TFormedX()
y00#=TFormedZ()
z01#=waveheight*Cos(time/wavelength+x00*wavelength/3)+horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)+Noiseamplitude*Sin(noise#(i)+time/4)
x01#=x00-waveheight*Cos(time/wavelength+x00*wavelength/3)+Noiseamplitude*Cos(noise#(i)+time/4)
y01#=y00-horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)+Noiseamplitude*Sin(noise#(i)+time/4)
TFormPoint x01,z01,y01,0,mesh
VertexCoords meshsurf,i,TFormedX(),TFormedY(),TFormedZ()
VertexTexCoords meshsurf,i,x00/25,y00/25
Next
UpdateNormals mesh
End Function
x00=cubedata#(i-1,0)
y00=cubedata#(i-1,1)
тут сохранены позиции точек поверхности воды до деформации.