Показать сообщение отдельно
Старый 29.06.2011, 22:40   #83
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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.
(Offline)
 
Ответить с цитированием