Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Сегодня я многому научился 
Таки узнал, что команда Tform в блитце работает очень быстро, по сути это почти как умножение на одно число 
Таки сделал ручной расчет нормалей, с усреднением нормали полигонов примыкающих к вершине. Это работает слегка медленней, чем updatenormals. Я чувствую себя таааакиииим умным  , хотя вроде затенение выглядит сильно контрастней.  Но страшней

Graphics3D 640,480,0,2
SetBuffer BackBuffer()
Dither 0
Dim plane#(0,0)
Dim CubeData#(0,0)
Dim quadsys#(0,0)
Global pivot,camera,mxs#,mys#,Light,timer3,debugcam,watermesh,watertex,dsd
;Include "bin/antifrizedcrab.bb"
watermesh=preparations()
While Not ((KeyDown(56) And KeyHit(62)) Or (KeyHit(56) And KeyDown(62)) Or KeyHit(1))
timer3=MilliSecs()
PositionTexture watertex,u#,v#
u#=Sin(MilliSecs()/500)
GrimMagicWater(watermesh,3,6,10,1)
UpdateWorld
RenderWorld
control(0.5,1.4)
Flip 0
Wend
End
Function GrimMagicWater(meshid,waveheight#,horizwave#,wavelength#,speed#)
PointEntity light,camera
PositionEntity light,225*Sin(MilliSecs()/30),65,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
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)
x01#=x00-waveheight*Cos(time/wavelength+x00*wavelength/3)
y01#=y00-horizwave*Sin(time/wavehorizlength#+y00*wavelength/5)
TFormPoint x01,z01,y01,0,mesh
VertexCoords meshsurf,i,TFormedX(),TFormedY(),TFormedZ()
plane#(i,3)=TFormedX() ;x
plane#(i,4)=TFormedY() ;y
plane#(i,5)=TFormedZ() ;z
VertexTexCoords meshsurf,i,x00/25,y00/25
plane#(i,6)=0
plane#(i,7)=0
plane#(i,8)=0
Next
qtrian=CountTriangles(meshsurf)
For i=0 To qtrian-1
v0=TriangleVertex (meshsurf,i,0)
v1=TriangleVertex(meshsurf,i,1)
v2=TriangleVertex (meshsurf,i,2)
x0#=plane#(v0,3) : y0#=plane#(v0,4): z0#=plane#(v0,5)
x1#=plane#(v1,3)-x0 : y1#=plane#(v1,4)-y0 : z1#=plane#(v1,5)-z0
x2#=plane#(v2,3)-x0 : y2#=plane#(v2,4) -y0: z2#=plane#(v2,5)-z0
;теперь найду уравнение по трем точкам
;для х это y1*z2-y2*z2
a#=(y1*z2-y2*z2)
b#=-(x1*z2-x2*z3)
c#=(x1*y2-x2*y1)
TFormVector a,b,c,mesh,mesh
xv#=TFormedX()
yv#=TFormedY()
zv#=TFormedZ()
plane#(v0,6)=plane#(v0,6)+xv/plane#(v0,9)
plane#(v1,6)=plane#(v1,6)+xv/plane#(v1,9)
plane#(v2,6)=plane#(v2,6)+xv/plane#(v2,9)
plane#(v0,7)=plane#(v0,7)+yv/plane#(v0,9)
plane#(v1,7)=plane#(v1,7)+yv/plane#(v1,9)
plane#(v2,7)=plane#(v2,7)+yv/plane#(v2,9)
plane#(v0,8)=plane#(v0,8)+zv/plane#(v0,9)
plane#(v1,8)=plane#(v1,8)+zv/plane#(v1,9)
plane#(v2,8)=plane#(v2,8)+zv/plane#(v2,9)
Next
For i=0 To qvert-1
VertexNormal meshsurf,i,plane#(i,6),plane#(i,7),plane#(i,8)
Next
End Function
Function preparations()
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 127,127,127
watermesh=LoadMesh("mesh/water.b3d")
sky=loadskybox()
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()
watertex=LoadTexture("maps/water.jpg")
SetCubeMode watertex,1
EntityTexture watermesh,watertex,0,1
EntityAlpha watermesh,0.95
mesh=watermesh
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)
Dim plane#(qvert,10)
For i=0 To qvert-1
plane#(i,0)=VertexX(meshsurf,i) ;x
plane#(i,1)=VertexY(meshsurf,i) ;x
plane#(i,2)=VertexZ(meshsurf,i) ;x
Next
qtrian=CountTriangles(meshsurf)
For i=0 To qtrian-1
v0=TriangleVertex (meshsurf,i,0)
v1=TriangleVertex(meshsurf,i,1)
v2=TriangleVertex (meshsurf,i,2)
plane#(v0,9)=plane#(v0,9)+1
plane#(v1,9)=plane#(v1,9)+1
plane#(v2,9)=plane#(v2,9)+1
Next
Return watermesh
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(208) 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),EntityZ#(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
Function LoadSkyBox( )
m=CreateMesh()
;front face
b=LoadBrush( "maps\sky2_FR.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3:
FreeBrush b
;right face
b=LoadBrush( "maps\sky2_LF.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;back face
b=LoadBrush( "maps\sky2_BK.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;left face
b=LoadBrush( "maps\sky2_RT.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;top face
b=LoadBrush( "maps\sky2_UP.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;bottom face
b=LoadBrush( "maps\sky2_DN.jpg",49 )
If b=0 b=CreateBrush (0,30,50)
s=CreateSurface( m,b )
AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
ScaleMesh m,500,500,500
FlipMesh m
EntityFX m,1+8
EntityOrder m,999
Return m
End Function
Последний раз редактировалось SBJoker, 29.06.2011 в 23:52.
|