forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Электрические разряды (http://forum.boolean.name/showthread.php?t=306)

SubZer0 08.11.2005 19:39

Вложений: 2
Я такого еще для блица нигде не видел, вот решил попробовать написать...

Маленькая либа функций для реализации визуализации электрических разрядов.
Либа пока еще неоптимизированная, это типа как Бета-версия...

вот вываливаю на всеобщий показ... :rolleyes: :rolleyes:

PS: уже ловлю летящие в меня камни ;)

jimon 08.11.2005 19:51

чтото ето геморно

и вообще такие еффекты делают спрайтами :)

SubZer0 08.11.2005 19:52

Цитата:

Originally posted by jimon@Nov 8 2005, 06:51 PM
чтото ето геморно

и вообще такие еффекты делают спрайтами :)

хотелось бы посмотреть на твой вариант ;) (со спрайтами)

impersonalis 08.11.2005 20:28

В принципе Джимон прав . Вопрос только : на сколько просто это будет сделать.

alcosholik 08.11.2005 22:37

По-моему, суть либы не в том, как лучше реализовать молнию, а в реализации этой молнии именно в 3Д.

Выглядит замечательно! Немного визуальных настроек и будет вообще шик! :super:

jimon 08.11.2005 22:37

у меня нету примера
просто когда я разгребал какойта древний двиг игры на opengl
то я обратил внимание на молнии

они реализовывались так:
1) там было гдето 15 картинок молнии
2) создавался пивот поворачивался,позицировался (ето емитер) он лежит точно на средине линии которая сойденяет две точки (через которые и происходит разряд)
3) создается спрайт, позицируетца в точку пивота и растягивается по одной оси (Y) так чтобы он полностю был длиной в ету линию
4) на спрайт наносятся рандомно текстуры

ps. пивот там надо было чтобы быстро расчитать положения если две (или одна) точки изменят свое положение - то же самое что у тебя dynamic :)

ps2. сам думаю что ето неочень и сложно, но ето псевдо 3д молнии - хотя где вы видели молнии которые реально изображаются как 3д ?

ps3. думал как зделать реально молнии в 3д
на думал так :
1) генерим 3д линии и сохраняем их в меши
2) на линии надо накладывать еффект свечения, независимости от тумана и освещения, и переход цветов делать так - плавный из белого в ярко синий, потом чуть помедленее из ярко синиго в чуть ярко приглушеный синий :) , потом вырисовываем палитру из чуть ярко приглушеного синего в темно синий

3) все что получилось (а должно около 15 мешей) - вставляем в передыдуший алгоритм , вместо спрайтов :)

ps4. здесь главное чтобы красиво получилось

pax 08.11.2005 23:57

Руль :bravo: :super:

SubZer0 09.11.2005 00:11

2 Jimon

да, если создать пару десятков мешей и потом подставлять каждый с рандомным поворотом, то можно тоже много чего достичь... но это будет сильно специализированно, а тут, можно, допустим, настраиваемой длины создать или количество сегментов задать или радиус рандомизации задать... :)

pax 09.11.2005 01:45

Цитата:

а тут, можно, допустим, настраиваемой длины создать или количество сегментов задать или радиус рандомизации задать... :)
Еще бы отростков сделать... :rolleyes:

jimon 09.11.2005 15:06

просто то что ты зделал не для игр :)

SubZer0 09.11.2005 20:05

ессно не для игр... для учебы... :rolleyes:

для игр делается все специализированное... это и ежу понятно... :)

pax 12.11.2005 21:21

Вот седня накатал...
Код:

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

:)

jimon 12.11.2005 22:01

оно практически одинаково у вас двоих вышло

pax 12.11.2005 22:11

Цитата:

Originally posted by jimon@Nov 12 2005, 10:01 PM
оно практически одинаково у вас двоих вышло
У меня принцип работы другой... я не храню информацию о положении вертексов в явном виде (за это отвечает Field LSeed%) :)

pax 12.11.2005 22:24

Вот этот же код тока в отдельном файле:


Часовой пояс GMT +4, время: 05:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot