forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Создание эффектов в стиле WarCraft (http://forum.boolean.name/showthread.php?t=13901)

ABTOMAT 18.12.2010 16:37

Ответ: Создание эффектов в стиле WarCraft
 
Ой неужели я правда такую ссылку запостил? Вот балда

Amatsu 18.12.2010 16:45

Ответ: Создание эффектов в стиле WarCraft
 
Цитата:

Сообщение от ABTOMAT (Сообщение 172323)
Ой неужели я правда такую ссылку запостил? Вот балда

Да, ссылка эпическая по размеру :crazy:

Randomize 18.12.2010 16:48

Ответ: Создание эффектов в стиле WarCraft
 
И тут в тред врывается рандоме.
PHP код:

HidePointer()
Global 
camera,light,world,Flex,mx#,my#,ball,w
;setup graphics and scene
Graphics3D 800
,600,32,2
SetBuffer BackBuffer
()
camera=CreateCamera()
CameraRange camera,1,1600
MoveEntity camera
,500,800,500
light
=CreateLight(2)
MoveEntity light,0,400,400
LightRange light
,350
AmbientLight 50
,50,50

;make test world
world
=CreateWorld() 

;
make shadow
Flex
=CreateFlex()
EntityColor Flex02550


;hack
;whitetexture=CreateTexture(32,32)


;
make ball
ball
=CreateSphere()
EntityColor ball,255,0,0
EntityShininess ball
,1
ScaleEntity ball
,50,50,50
MoveEntity ball
,0,300,0
TurnEntity ball
,0,-45,0

;misc
PointEntity camera
,world
SetBuffer BackBuffer
()

;
mainloop
While Not KeyHit(1)
    If 
KeyHit(17)
        
w=1-w
        WireFrame w
        
;visibility hack for you to test
        
If w=1
            EntityBlend Flex
,1
        
Else
            
EntityBlend Flex,2
        
EndIf
    EndIf
    
    
mx#=MouseXSpeed()*0.5
    
my#=MouseYSpeed()*0.5
    
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
    MoveEntity ball
,-mx,0,my
    
    
;UpdateFlex(target deformable mesh (try a model!!),mesh that casts shadow)
    
UpdateFlex(Flex,ball)
    
UpdateWorld
    RenderWorld
    Text 0
,0,"Use mouse to move ball, watch the shadow!"
    
Text 0,16,"press 'w' to toggle wireframe mode, ESC to quit."
    
Flip
Wend
End

;load your own levelbut make it pickable.
Function 
CreateWorld()
    
p=CreatePivot()
    
a=CreateCube(p)
    
FitMesh a,-500,0,-500,1000,10,1000
    a
=CreateCube(p)
    
FitMesh a,-200,10,-200,400,40,400
    a
=CreateSphere(8,p)
    
ScaleEntity a,100,100,100
    MoveEntity a
,-200,0,-200
    a
=CreateSphere(8,p)
    
ScaleEntity a,100,100,100
    MoveEntity a
,200,0,-200
    a
=CreateSphere(8,p)
    
ScaleEntity a,100,100,100
    MoveEntity a
,200,0,200
    a
=CreateSphere(8,p)
    
ScaleEntity a,100,100,100
    MoveEntity a
,-200,0,200
    
    
For i=1 To CountChildren(p)
        
EntityPickMode GetChild(p,i),2
    Next
    
    
Return p
End 
Function

Function 
CreateFlex()
    
m=CreateFace(8) ;segs
    ScaleEntity m
,250,250,250
    
Return m
End 
Function

Function 
UpdateFlex(flexmesh,source)
    
x#=EntityX(source):y#=EntityY(source):z#=EntityZ(source)
    
PositionEntity flexmesh,x,y,z
    
    
;you can optimise by precalculating x and z
    s
=GetSurface(flexmesh,1)
    For 
i=0 To CountVertices(s)-1
        
        vx
#=VertexX(s,i)
        
vy#=0
        
vz#=VertexZ(s,i)
        
        
TFormPoint vx,vy,vz,flexmesh,0
        vx
=TFormedX() : vy=TFormedY() : vz=TFormedZ()
        
        
LinePick vx,vy,vz,vx,vy-9000,vz
        vy
=PickedY()+50
        
        TFormPoint vx
,vy,vz,0,flexmesh
        vx
=TFormedX() : vy=TFormedY() : vz=TFormedZ()
        
        
VertexCoords s,i,vx,vy,vz
        
    Next
    
End 
Function


;
Creates a single sided face
;segmented
Function CreateFace(segs=1,double=False,parent=0)
    
mesh=CreateMeshparent )
    
surf=CreateSurfacemesh )
    
stx#=-.5
    
sty#=stx
    
stp#=Float(1)/Float(segs)
    
y#=sty
    
For a=0 To segs
        x
#=stx
        
v#=a/Float(segs)
        
For b=0 To segs
            u
#=b/Float(segs)
            
AddVertex(surf,x,0,y,u,v) ; swap these for a different start orientation
            x
=x+stp
        Next
        y
=y+stp
    Next
    
For a=0 To segs-1
        
For b=0 To segs-1
            v0
=a*(segs+1)+b:v1=v0+1
            v2
=(a+1)*(segs+1)+b+1:v3=v2-1
            AddTriangle
surf,v0,v2,v1 )
            
AddTrianglesurf,v0,v3,v2 )
        
Next
    Next
    UpdateNormals mesh
    
If double=True Then EntityFX mesh,16
    
Return mesh
End 
Function 


ABTOMAT 18.12.2010 16:50

Ответ: Создание эффектов в стиле WarCraft
 
Цитата:

VertexCoords s,i,vx,vy,vz
Тред не читай @ Сразу отвечай

EvilChaotic 18.12.2010 17:55

Ответ: Создание эффектов в стиле WarCraft
 
Тэк, делалось на не трезвую голову. ЗЫ Название переменных, отвечающих за объекты влом переименовывать. В коде никаких Pick, которые очень медленно будут работать на террайнах не требуется.



Пример:
http://rghost.ru/3655618

CreateSymbol(Entity,Texture%,Size#,GridSize%)
Entity - Обьект под которым рисуем символ.
Texture - Текстура на символ.
Size - Размер символа.
GridSize - Размер сетки.
* Возращает хендл на символ.

UpdateSymbols(Terrain%)
Terrain - Террайн.
* Апдейт.

FreeSymbol(h%)
h - Хендл на символ
* Удаление.

IGR 18.12.2010 18:16

Ответ: Создание эффектов в стиле WarCraft
 
я делал просто квад с текстурой ауры !! квад под ноги юниту !! Выставлял ордер кваду что бы он редерился после террейна !! Тут есть одно ололо - если юнит стоит на склоне, то можно так выкрутить камеру что с другой стороны склона рендерился этот квад !!
Но у меня камеры была почти всегда с верху, так что трабла эта отпадала !! :)

Goblur 18.12.2010 18:34

Ответ: Создание эффектов в стиле WarCraft
 
Спасибо EvilChaotic за хороший пример. Думаю тему можно закрывать.

Gector 18.12.2010 19:16

Ответ: Создание эффектов в стиле WarCraft
 
EvilChaotic. Тормозит сильно. Имхо тут проще и разумней квад сделать.

EvilChaotic 18.12.2010 19:29

Ответ: Создание эффектов в стиле WarCraft
 
Цитата:

Сообщение от Gector (Сообщение 172340)
EvilChaotic. Тормозит сильно. Имхо тут проще и разумней квад сделать.

Оно не может тормозить и темболее сильно от 6x6 террайн игриков. Сдаться мне, что ты говоришь о движении сферы Sin/Cos. Закоменти функцию создания символа - увидишь тежи "лаги" при движении сферы и отсутствие эффекта. А лучше напиши счетчик фпс и отключи синхронизацию кадров.

Вот, 389:


Без эффекта 402.
Оно нормально работает.

Goblur 18.12.2010 20:19

Ответ: Создание эффектов в стиле WarCraft
 
Цитата:

Сообщение от Gector (Сообщение 172340)
EvilChaotic. Тормозит сильно. Имхо тут проще и разумней квад сделать.

Вполне хорошо работает, на моем железе фпс: 840-870 выдает.

Gector 18.12.2010 20:19

Ответ: Создание эффектов в стиле WarCraft
 
А вот чо... Стер движение по синусу и подставил обыкновенное движение. Все заработало. Я честно говоря сам понять не мог откуда взялись "тормоза" при переборе нескольких вершин.

EvilChaotic 18.12.2010 20:25

Ответ: Создание эффектов в стиле WarCraft
 
Угу. А вообще это моя ошибка.
Код:

                Local sinX# = Sin(Float(MilliSecs()) / 30 ) * 30
                Local sinZ# = Cos(Float(MilliSecs()) / 30 ) * 30

Так будет работать плавно.

St_AnGer 18.12.2010 20:26

Ответ: Создание эффектов в стиле WarCraft
 
856-902 фпс, полёт отличный :)


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

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