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


Написал первый эскиз бесконечного террэйна
Include "xors3d.bb" 
Global pivot,camera,mxs#,mys#,Light,watertex,watermesh,terrain
Dim waterplane#(0,0)
Dim TerrainData#(0,0)
Dim heightmap#(0,0)
xGraphics3D(600,400, 32,0, 0)


 watermesh=CreateTrianMesh(20,50,0.35)
preparations()
watertex=xLoadTexture("maps/water.jpg")
xEntityTexture (watermesh,watertex)


terrain=CreateTrianMesh(50,50,0.15)
 terraintex=xLoadTexture("maps/Rockwall_Diffuse.jpg")
xEntityTexture (terrain,terraintex)
prepareterraindata()


While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))

EndlessTerrain(10)
GrimMagicWater(watermesh,3,6,10,Rnd(0.05,0.08),1)

xUpdateWorld
xRenderWorld()
Control(3.2,1)
xText 200,300,terraindata#(Rand(0,200),0)
        xFlip() 
Wend

End

Function endlessterrain(gridsize#)
xPositionEntity (terrain,xEntityX(camera,1),0,xEntityZ(camera,1))
xRotateEntity (terrain,0,xEntityYaw(camera,1)-45,0 )

surf=xGetSurface(terrain,0)
qvert=xCountVertices(surf)
For i=0 To qvert-1
x00#=terraindata(i,0)
y00#=terraindata(i,2)
xTFormPoint x00,0,y00,terrain,0
x01#=xTFormedX()
y01#=xTFormedZ()
;так  имею
v0=Int(x01/gridsize#)
v1=v0+1
u0=Int(y01/gridsize#)
u1=u0+1
If (v0>=0 And u0>=0) And (v1<=255 And u1<=255) Then
v01#=heightmap#(v0,u0)
v11#=heightmap#(v1,u0)
v21#=heightmap#(v0,u1)
v31#=heightmap#(v1,u1)
dx#=x01/gridsize-v0
dy#=y01/gridsize-u0
dx1#=-(V01-V11)*dx
dx2#=-(V21-V31)*dx
virtvert1#=v01+dx1
virtvert2#=v21+dx2
z01#=virtvert1+(virtvert2-virtvert1)*dy
Else 
z01#=0
EndIf
xVertexCoords surf,i,x00,z01,y00
xVertexTexCoords surf,i,x01/15,y01/15

Next
xUpdateNormals terrain
End Function



Function  GrimMagicWater(meshid,waveheight#,horizwave#,wavelength#,Noiseamplitude#,speed#)
xPointEntity light,camera
xPositionEntity (light,225*Sin(xMillisecs()/30),145,225*Cos(xMillisecs()/30))
xPositionEntity (watermesh,xEntityX(camera,1),0,xEntityZ(camera,1))
xRotateEntity (watermesh,0,xEntityYaw(camera,1)-45,0 )
If xEntityY(camera,1)<1 Then xPositionEntity camera,xEntityX(camera,1),1,xEntityZ(camera,1),1
xScaleTexture watertex,1+Sin(xMillisecs()/100)/10,1+Cos(xMillisecs()/50)/10
;wavelength#=10 ; меньшее значение означает большую длину
wavehorizlength#=35
time#=xMillisecs()*speed
mesh=meshid
meshsurf=xGetSurface(mesh,0)
qvert=xCountVertices(meshsurf)
For i=0 To qvert-1
x000#=waterplane#(i,0)
y000#=waterplane#(i,2)
z000#=0
xTFormPoint (x000,z000,y000,mesh,0)
x00#=xTFormedX()
y00#=xTFormedZ()

z01#=waveheight*Cos(time/wavelength+x00*wavelength/3)+horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)
x01#=x00-waveheight*Cos(time/wavelength+x00*wavelength/3)
y01#=y00-horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)
xTFormPoint (x01,z01,y01,0,mesh)
xVertexCoords meshsurf,i,xTFormedX(),xTFormedY(),xTFormedZ()
xVertexTexCoords meshsurf,i,x00/25,y00/25
Next
xUpdateNormals mesh
End Function

Function preparations()
pivot=xCreatePivot()
camera = xCreateCamera(pivot)
light = xCreateLight()

mesh=watermesh
surf=xGetSurface(mesh,0)
qvert=xCountVertices(surf)
Dim waterplane#(qvert,3)
For i=0 To qvert-1
waterplane#(i,0)=xVertexX(surf,i) ;x
waterplane#(i,1)=xVertexY(surf,i) ;x
waterplane#(i,2)=xVertexZ(surf,i) ;x
Next

Return watermesh
End Function

Function CreateTrianMesh(maxd,maxi,zqual#)
supermesh=xCreateMesh()
surf=xCreateSurface(supermesh)
For i=5 To maxi+5
y#=zqual#*i*i
x0#=-y
dx#=2*y/maxd
For d=0 To maxd
xAddVertex(surf,y,0,x0+dx*d,i,d)
Next 
Next
qvert=xCountVertices(surf)
For i=0 To maxi-1
For d=0 To maxd-1
v0=i*(maxd+1)+d
v1=v0+1
v2=i*(maxd+1)+maxd+1+d
v3=v2+1
If v3<qvert Then 
xAddTriangle (surf,v0,v1,v2)
xAddTriangle (surf,v1,v3,v2)
EndIf
Next
Next
xRotateMesh supermesh,0,135,0 

Return supermesh
End Function


Function prepareterraindata()
mesh=terrain
surf=xGetSurface(mesh,0)
qvert=xCountVertices(surf)
Dim TerrainData#(qvert,3)
For i=0 To qvert-1
TerrainData#(i,0)=xVertexX(surf,i) ;x
TerrainData#(i,1)=xVertexY(surf,i) ;x
TerrainData#(i,2)=xVertexZ(surf,i) ;x
Next

;делаю карту высот
Dim heightmap#(256,256)
For x=0 To 255
For y=0 To 255
heightmap#(x,y)=15*Sin(24*x)+14*Cos(9*y); (x,y);Rnd(-3.3,0.3); высота террэйна будет колебаться в этих пределах
Next 
Next 
End Function

Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
        xText(10, 10, "FPS: " + xGetFPS()) 	
 		xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(208) xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEntityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
maxturbo (01.07.2011), NitE (01.07.2011), Program23 (01.07.2011), Reks888 (01.07.2011)