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)

Goblur 18.12.2010 15:01

Создание эффектов в стиле WarCraft
 
Всем жителям форума, привет!

При разработке своего проекта возник вопрос, о том, как реализуются различные эффекты в играх, например, ауры. Ниже скриншот (чтобы было понятнее).


Интересует абсолютно любая информация, какими средствами (меш это, или спрайт или еще чего), также буду рад исходникам на Блице или Хорсе.

PacMan 18.12.2010 15:07

Ответ: Создание эффектов в стиле WarCraft
 
Я ауру делал очень просто.
На полигон натягивал текстуру ауры и все.

Goblur 18.12.2010 15:12

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

Сообщение от PacMan (Сообщение 172302)
Я ауру делал очень просто.
На полигон натягивал текстуру ауры и все.

Такая идея была, но поступая таким способом, как ты заставишь ауру не пересекаться, скажем, с террейном, а ровно перемещаться по нему?

EvilChaotic 18.12.2010 15:15

Ответ: Создание эффектов в стиле WarCraft
 
Создаешь квад с сегментами.
позиционируешь квад под объект, пробегаешься по вершинам и выравниваешь Y позиции вершин под террайн.

Конечно же не обойтись без недостатков.
Чем больше сегментов - медленее будет работать но меньше шанс того, что квад влезет в террайн. Если обьект с "аурой" полезет на горку - то она растянется под угл наклона горки...

Goblur 18.12.2010 15:22

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

Сообщение от EvilChaotic (Сообщение 172304)
Создаешь квад с сегментами.
позиционируешь квад под объект, пробегаешься по вершинам и выравниваешь Y позиции вершин под террайн.

С вершинами, к сожалению, никогда не работал в блице. Можно коротенький пример? Конкретно интересует получение Y-координаты вершин и террейна.

EvilChaotic 18.12.2010 15:23

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

Сообщение от Goblur (Сообщение 172307)
С вершинами, к сожалению, никогда не работал в блице. Можно коротенький пример? Конкретно интересует получение Y-координаты вершин и террейна.

Ладно, сейчас напишу пример.

Goblur 18.12.2010 15:29

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

Сообщение от EvilChaotic (Сообщение 172308)
Ладно, сейчас напишу пример.

Буду очень признателен!

Amatsu 18.12.2010 15:38

Ответ: Создание эффектов в стиле WarCraft
 
Попробуй подключить к блитцу fast-библиотеки от Михаила. Там реализована система проекционных текстур, возможно это то что тебе нужно.
Если на самом уровне у тебя заняты все слои текстур, можешь скопировать меш уровня, слегка расширив его геометрию по вертексам (относительно их нормалей, как в демке с целл-шейдинговыми контурами моделей) и наложить на этот меш свои круги с альфой (чтобы весь уровень был невидимым, а отображался только круг на текстуре)... В общем как-то так.
з.ы. этот вариант гораздо шустрее полигональных деформаций будет + никакого проваливающегося квада в вершины и ребра полигонов уровня

Goblur 18.12.2010 15:58

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

Сообщение от Amatsu (Сообщение 172311)
Попробуй подключить к блитцу fast-библиотеки от Михаила. Там реализована система проекционных текстур, возможно это то что тебе нужно.
Если на самом уровне у тебя заняты все слои текстур, можешь скопировать меш уровня, слегка расширив его геометрию по вертексам (относительно их нормалей, как в демке с целл-шейдинговыми контурами моделей) и наложить на этот меш свои круги с альфой (чтобы весь уровень был невидимым, а отображался только круг на текстуре)... В общем как-то так.
з.ы. этот вариант гораздо шустрее полигональных деформаций будет + никакого проваливающегося квада в вершины и ребра полигонов уровня

Насколько я помню, fast-библиотеки - это коммерческий продукт, соответственно за так их никто не даст, а я ищу менее "болезненный" способ реализации. Возможно такой вариант действительно будет шустрее, но, судя по твоему посту, как-то геморно это реализуется (имею ввиду меши уровня, расширение геометрии, нормали, целл-шейдинговые контуры моделей), и, к тому же, придется тоскать с exe'шником, еще и библу (из-за реализации всего одного эффекта). Мне кажется есть куда более простое решение этой проблемы.

Amatsu 18.12.2010 16:06

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

Сообщение от Goblur (Сообщение 172315)
Насколько я помню, fast-библиотеки - это коммерческий продукт, соответственно за так их никто не даст, а я ищу менее "болезненный" способ реализации. Возможно такой вариант действительно будет шустрее, но, судя по твоему посту, как-то геморно это реализуется (имею ввиду меши уровня, расширение геометрии, нормали, целл-шейдинговые контуры моделей), и, к тому же, придется тоскать с exe'шником, еще и библу (из-за реализации всего одного эффекта). Мне кажется есть куда более простое решение этой проблемы.

Я тебе предлагаю вариант, который не будет глючить и тормозить. Программная работа с вертексами в реальном времени в блитце заметно повышает системные требования игры. К тому же мой вариант реализуется пожалуй даже проще (функция одноразового создания копии уровня с раздутыми вертексами весьма проста), чем реалтаймовая проверка позиции каждого вертекса сквада относительно уровня + сквад все равно будет провалиться в полигоны.
з.ы. мое дело предложить. Выбирай сам, что тебе больше подходит

EvilChaotic 18.12.2010 16:14

Ответ: Создание эффектов в стиле WarCraft
 
Напиши ему пример что-ли на фаст либах, пока я считаю математику. Не знаю, как он поступит с триалом.


Осталось посчитать UV в функции создания квада. И в нормальный вид привести.

ABTOMAT 18.12.2010 16:19

Ответ: Создание эффектов в стиле WarCraft
 
Мне кажется, либа Михаила нецелесообразна здесь. Это слишком общее решение.
Хотя бы потому, что на всех юнитов на карте текстурных слоёв не напасёшься.
Частное решение лучше общего. Аура, безусловно, должна быть мешем.
Вызов функций типа VertexX и иже с ними действительно лагуч.
Советую почитать вот тут способ от питерских пацанчиков: http://blitzetc.blitzmax.ru/index.ph...0%B8_Blit z3D
В принципе, сложностей не вижу, чтобы преобразования координат подстроить под свои нужды.

SBJoker 18.12.2010 16:20

Ответ: Создание эффектов в стиле WarCraft
 
Кароч самое простое - квад с текстурой и ордером меньше чем террейн.

Amatsu 18.12.2010 16:20

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

Сообщение от EvilChaotic (Сообщение 172318)
Напиши ему пример что-ли на фаст либах, пока я считаю математику. Не знаю, как он поступит с триалом.

Я делаю видеомонтаж по свадьбе для начальника :) Халтурку взял домой подработать. Может потом набросаю пример, как время будет

Amatsu 18.12.2010 16:22

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

Сообщение от ABTOMAT (Сообщение 172319)
Мне кажется, либа Михаила нецелесообразна здесь. Это слишком общее решение.
Хотя бы потому, что на всех юнитов на карте текстурных слоёв не напасёшься.
Частное решение лучше общего. Аура, безусловно, должна быть мешем.
Вызов функций типа xVertexX и иже с ними действительно лагуч.
Советую почитать вот тут способ от питерских пацанчиков: [IMG]file:///C:/MUSTDIE/Temp/moz-screenshot.png[/IMG][IMG]file:///C:/MUSTDIE/Temp/moz-screenshot-1.png[/IMG]http://blitzetc.blitzmax.ru/index.php/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_surfac e_%D0%B2_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8_Blit z3D
В принципе, сложностей не вижу, чтобы преобразования координат подстроить под свои нужды.

Ну, если действительно есть способ сделать быструю работу с вертексами... тогда да, вариант с квадом разумнее. А пока что имхо лучше текстурой.

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, время: 05:04.

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