Показать сообщение отдельно
Старый 27.06.2011, 00:15   #4
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Тю, по опыту сдесь код выходящий за рамки кода в справке не анализирут :D
Но вот:
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
Dither 0
Dim plane#(0,0)
Dim noise#(0)
Global pivot,camera,mxs#,mys#,Light,timer3

Const gravitation#=9.8

pivot=CreatePivot()
PositionEntity pivot,0,3,-10
camera=CreateCamera(pivot)
CameraClsColor camera,0,75,151
light=CreateLight()
MeshLight=CreateSphere(6,light)
;ScaleMesh meshlight,0.3,0.3,0.3
EntityFX meshlight,1
AmbientLight 15,15,15

mesh=CreateWaterPlane(36,36,3,3)
PrepareWaterData(mesh)

While Not ((KeyDown(56) And KeyHit(62)) Or (KeyHit(56) And KeyDown(62)) Or KeyHit(1))
timer3=MilliSecs()
PointEntity light,mesh
PositionEntity light,25*Sin(MilliSecs()/30),25,25*Cos(MilliSecs()/30)
UpdateWaterPlane(0.5,0.2,0.7,mesh)
UpdateWorld
RenderWorld
control(0.5,1.4)
Text 200,200,noise#(Rand(0,200))
Flip 0
Wend
End


Function UpdateWaterPlane(windx#,windy#,windz#,meshhandle)
mesh=meshhandle
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)
For i=0 To qvert-1
x00#=plane#(i,0)
y00#=plane#(i,1)

z01#=8*Cos(MilliSecs()/10+x00*3)+6*Sin(MilliSecs()/35+y00*1.5)+0.5*Sin(noise#(i)+MilliSecs()/4)
x01#=x00-8*Cos(MilliSecs()/10+x00*3)+0.5*Cos(noise#(i)+MilliSecs()/
y01#=y00-6*Sin(MilliSecs()/25+y00*2)+0.5*Sin(noise#(i)+MilliSecs()/4)
VertexCoords meshsurf,i,x01,z01,y01
Next
UpdateNormals mesh
End Function

Function PrepareWaterData(meshid)
mesh=meshid
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)
Dim plane#(qvert,3)
For i=0 To qvert-1
plane#(i,0)=VertexX(meshsurf,i)
plane#(i,1)=VertexZ(meshsurf,i)

Next
End Function

Function CreateWaterPlane(width,depth,gridx#,gridy#)
mesh=CreateMesh()
meshsurf=CreateSurface(mesh)
b=width
d=depth
For y=-d To d
For x=-b To b

v0=AddVertex(meshSurf,x*gridx,0,y*gridy)
VertexNormal (meshsurf,v0,0,1,0)
Next
Next

qvert=CountVertices(meshSurf)

For i=0 To qvert-1
v0=i
x0#=VertexX(meshSurf,V0)
y0#=VertexZ(meshSurf,V0)

bize=i+3*b
If bize>qvert-1 Then bize=qvert-1

For z=i To bize
If (VertexX#(meshSurf,z)-gridx=x0#) And (VertexZ#(meshSurf,z)=y0#) Then v1=z
If (VertexX#(meshSurf,z)=x0#) And (VertexZ#(meshSurf,z)-gridy=y0#) Then v2=z
If (VertexX#(meshSurf,z)-gridx=x0#) And (VertexZ#(meshSurf,z)-gridy=y0#) Then v3=z
Next

If v0<>v1 And v2<>v3 Then AddTriangle(meshsurf,v1,v0,v2) : AddTriangle(meshsurf,v3,v1,v2) :v1=v2=v3=0
Next

For i=0 To qvert-1
x00#=VertexX(meshsurf,i)
y00#=VertexZ(meshsurf,i)
u00#=x00/(width*gridx)
v00#=y00/(depth*gridy)
VertexTexCoords meshsurf,i,u00,v00

Next

Dim noise#(qvert)
For i=0 To qvert-1
noise#(i)=Rnd(0,359.99)
Next

testtex=CreateTexture(256,256,256)
SetBuffer TextureBuffer(testtex)
Color 127,127,127
Rect 0,0,128,128
Rect 128,128,128,128
Color 235,240,235
Rect 0,128,128,128
Rect 128,0,128,128
SetBuffer BackBuffer()
EntityTexture mesh,testtex,0,0
ScaleTexture testtex,.1,.1


Return mesh
End Function

Function control(speed#,mousesensitivity#)
If KeyDown(2) WireFrame True Else WireFrame False
mxs#=mxs#+(MouseXSpeed()/5.0)
mys#=mys#+(MouseYSpeed()/5.0)
RotateEntity camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
If KeyDown(17) Or KeyDown(200) MoveEntity camera,0,0,speed#
If KeyDown(31) Or KeyDown(20 MoveEntity camera,0,0,-speed#
If KeyDown(30) Or KeyDown(203) MoveEntity camera,-speed#,0,0
If KeyDown(32) Or KeyDown(205) MoveEntity camera,speed#,0,0
PositionEntity pivot,EntityX#(camera,1),EntityY#(camera,1),Entity Z#(camera,1)
PositionEntity camera,0,0,0


Text 100,10,"polygons in view "+TrisRendered()
If (MilliSecs()-timer3)<>0 Text 100,40,"Frames per second is: "+1000/(MilliSecs()-timer3)
End Function

Пока просто лениво считать нормали к точкам, без апдейта это в 5-6 раз резче, плюс можнозамутить перерисовку меша по типу террэйна. Только зачем мне это в пародии на МОО :D
Это эскиз вообще без оптимизации.
1-wireframe

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Amatsu (27.06.2011), Arton (17.02.2017), FREE MAN (27.06.2011), NitE (27.06.2011), St_AnGer (27.06.2011)