Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Вот седня накатал...
Type Lightning
Field LStartObj%
Field LEndObj%
Field Segments%
Field LSeed%
Field LUpdateTime%
Field LLastUpdate%
Field LPivot%
Field RandomForce%
Field LMesh%
Field LSurface%[2]
Field LThickness%
End Type
Function CreateLightning(StartObj%,EndObj%,RandomForce%,Segments%,Thickness%,UpdateSpeed%=100)
L.Lightning = New Lightning
L\LStartObj% = StartObj%
L\LEndObj% = EndObj%
L\LPivot%=CreatePivot(L\LStartObj%)
L\Segments% = Segments%
If L\Segments%<5 Then L\Segments%=5
L\LThickness% = Thickness%
L\LSeed% = MilliSecs()
L\RandomForce% = RandomForce%
UpdateSpeed% = Abs(UpdateSpeed%)
If UpdateSpeed% < 10 Then UpdateSpeed% = 10
L\LUpdateTime% = UpdateSpeed%
L\LMesh=CreateMesh()
EntityFX(L\LMesh,1+2+32+16)
For k=0 To 2
*L\LSurface[K]=CreateSurface(L\LMesh)
Next
*
Local SX#=EntityX#(L\LStartObj%), SY#=EntityY#(L\LStartObj%), SZ#=EntityZ#(L\LStartObj%)
Local EX#=EntityX#(L\LEndObj%), EY#=EntityY#(L\LEndObj%), EZ#=EntityZ#(L\LEndObj%)
Local XS#=(EX#-SX#)/(L\Segments%-1), YS#=(EY#-SY#)/(L\Segments%-1), ZS#=(EZ#-SZ#)/(L\Segments%-1)
Local V%,T#
For k=0 To 2
*For I=0 To L\Segments%-1
* For J=-1 To 1 Step 1
* *V%=AddVertex(L\LSurface[K], SX#+I*XS#, SY#+I*YS#, SZ#+I*ZS#,Float(J+1)/Float(2),Float(I)/Float(L\Segments%-1))
* *If J Then T=0 Else T=1
* *VertexColor(L\LSurface[K], V%, ColorRed%()*Abs(K-1), ColorGreen%()*Abs(J-1)/2, ColorBlue%(),T)
* Next
*Next
*
*For I=0 To L\Segments%-2
* For J=0 To 1
* *AddTriangle (L\LSurface%[K],3*I+J, 3*I+J+1, J+1+3*(I+1))
* *AddTriangle (L\LSurface%[K],3*I+J, J+1+3*(I+1), J+3*(I+1))
* Next
*Next
Next
;FlipMesh(L\LMesh)
*UpdateNormals(L\LMesh)
*UpdateLightning(L.Lightning)
*
End Function
Function UpdateLightning(L.Lightning)
Local SX#=EntityX#(L\LStartObj%,1), SY#=EntityY#(L\LStartObj%,1), SZ#=EntityZ#(L\LStartObj%,1)
Local EX#=EntityX#(L\LEndObj%,1), EY#=EntityY#(L\LEndObj%,1), EZ#=EntityZ#(L\LEndObj%,1)
Local XS#=(EX#-SX#)/(L\Segments%-1), YS#=(EY#-SY#)/(L\Segments%-1), ZS#=(EZ#-SZ#)/(L\Segments%-1)
Local V%,DX#,DY#,DZ#
If (MilliSecs()-L\LLastUpdate%)>L\LUpdateTime% Then
*L\LLastUpdate%=MilliSecs()
*L\LSeed%=MilliSecs()
EndIf
For k=0 To 2
SeedRnd(L\LSeed%)
For I=0 To L\Segments%-1
*RotateEntity(L\LPivot, VectorPitch#(-XS#, -YS#, -ZS#),VectorYaw#(-XS#, -YS#, -ZS#),0,1)
*TurnEntity(L\LPivot,0,0,k*60)
*PositionEntity(L\LPivot,SX#,SY#,SZ#,1)
* If I=0 Or I=(L\Segments%-1) Then
* *DX#=0: DY#=0: DZ#=0
* Else
* *DX#=Rand(-L\RandomForce%,L\RandomForce%): DY#=Rand(-L\RandomForce%,L\RandomForce%): DZ#=Rand(-L\RandomForce%,L\RandomForce%)
* EndIf
*For J=0 To 2
* V% = I*3+J
* Select J
* *Case 0
* * MoveEntity(L\LPivot,0,L\LThickness%/2.0,0)
* *Default
* * MoveEntity(L\LPivot,0,-L\LThickness%/2.0,0)
* End Select
* VertexCoords(L\LSurface%[K], V%, SX#+I*XS#+EntityX#(L\LPivot)+DX#, SY#+I*YS#+EntityY#(L\LPivot)+DY#, SZ#+I*ZS#+EntityZ#(L\LPivot)+DZ#)
*Next
Next
Next
End Function
Graphics3D 1024,768,32
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Global Cam=CreateCamera()
PositionEntity Cam,0,50,-180
RotateEntity Cam,30,0,0
CameraClsColor Cam,5,20,30
SetFont (LoadFont ("Arial",20))
WorldLight=CreateLight()
RotateEntity WorldLight,20,40,0
For i=1 To 20
For j=1 To 20
*t=CreateCube()
PositionEntity t,i*10-100,-30,j*10-100
ScaleEntity t,3,1,3
Next
Next
Global Piv=CreatePivot()
Global S1%=CreateSphere(8,Piv)
ScaleEntity S1,2,2,2
PositionEntity S1,-50,20,60
EntityColor S1,10,250,20
Global S2%=CreateSphere(8,Piv)
ScaleEntity S2,2,2,2
PositionEntity S2,80,50,-30
EntityColor S2,10,250,20
Color 35,0,255
CreateLightning(S1,S2,3,30,5,50)
Color 255,0,255
CreateLightning(S1,S2,3,30,5,50)
Repeat
For L.Lightning=Each Lightning
UpdateLightning(L.Lightning)
Next
gradx=gradx+MouseXSpeed()*0.1
grady=grady+MouseYSpeed()*0.1
RotateEntity Cam,grady,-gradx,0,False
MoveEntity Cam,KeyDown(205)-KeyDown(203),0,KeyDown(200)-KeyDown(208)+MouseDown(1)-MouseDown(2)
MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
* If KeyHit(17) Then W=Not w
* WireFrame W
* TurnEntity(Piv,0,0.5,0)
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End
|