Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

Реалистичная траектория падения снежинки Как сделать ?   Найти похожие ветки 

 
Темас   (2005-06-02 01:43) [0]

Вертикально вниз - плохо. По диагонали - тоже не реалистично. А как правильно сделать ?


 
Zer0 ©   (2005-06-02 01:53) [1]

рандомно, но с учотом ветра. а если если поюзать perlin noise получится красота


 
XProger ©   (2005-06-02 02:19) [2]


x := x + (random*0.5 - 0.5)*Speed + WindSpeed;
y := y + Gravity/abs(WindSpeed);

Вот такой снег в моих фантазиях :)


 
Темас   (2005-06-02 02:19) [3]


> Zer0 ©   (02.06.05 01:53) [1]
> рандомно, но с учотом ветра. а если если поюзать perlin
> noise получится красота


Запости код.


 
Темас   (2005-06-02 02:22) [4]


> XProger ©   (02.06.05 02:19) [2]

А можно без рандом, а то функция медленная, а снежинок должно быть много.


 
XProger ©   (2005-06-02 02:24) [5]

Кто медленная? Рандом медленная? Отрисовка снежинки по сравнению с этой функцией вечность! ;)


 
XProger ©   (2005-06-02 02:25) [6]

поправка: random - 0.5


 
Темас   (2005-06-02 02:29) [7]


> XProger ©   (02.06.05 02:24) [5]
> Кто медленная? Рандом медленная?

Да. Надо без рэндому.


 
XProger ©   (2005-06-02 02:40) [8]

Темас, тогда расчитывай сопротивление воздуха + силу восходящего потока на плоскость снежинки. И не забудь про варщение самой снежинки, а ведь в полёте она и тает следовательно меняется расположение центра тяжести... ;)

Говоря "Реалистичная траектория падения снежинки" ты должен прекрасно понимать, что всё реальное трудноописуемо математикой!

Но если и это тебе не подходит:

x := x;
y := y + Speed;

Работает со немыслимой скоростью!

P.S.
Шумы перлина научат тебя различать шустрые и тормознутые решения...


 
Темас   (2005-06-02 02:55) [9]


> XProger ©   (02.06.05 02:40) [8]
> x := x;
> y := y + Speed;

Это вертикальное падение просто.


 
XProger ©   (2005-06-02 03:00) [10]

Не хочешь рандома, не хочешь по диагонали, не хочешь по вертикали тогда:

x := x + sin(y/100);
y := y + Speed;

Как тебе?


 
Темас   (2005-06-02 03:34) [11]


> XProger ©   (02.06.05 03:00) [10]
> x := x + sin(y/100);
> y := y + Speed;
>
> Как тебе?

Шататься будет влево-вправо просто. Еслиб она могла спускаться по спирали. Чтобы Y был задействован ещё.


 
XProger ©   (2005-06-02 03:49) [12]


ang := ang + 0.1;
x := x + cos(ang);
y := y + sin(ang) + Speed;

И ты считаешь sin и cos щустрее рандома работают? ;)


 
Zer0 ©   (2005-06-02 03:56) [13]

если снежинок очень много (>1`000`000) и стандартный рандом начинает заметно затормаживать все это дело можно поступить следующим образом - изначально случайным образом распределить снежинки на экране (так, чтобы две соседних по массиву находились достаточно далеко друг от друга). затем в основном цилке считать рандом не для каждой - а для сотни или скажем тысячи соседних по массиву.


timefactor:=1/fps; wst:=WindSpeed*timefactor; gravt:=Gravity/abs(WindSpeed)*timefactor

for i:=0 to 999 do
begin
 rand:=random-0.5; k:=i*1000;
 for j:=0 to 999 do
   with snow[k+j] do
   begin
     x := x + rand*speed*timefactor + wst;
     y := y + gravt;
   end;
end;


зы. перлин тем хорош, что выдает плавную зависимость рандома от координат - 10000 снежинок выглядят красяво, но заметно скидивыают fps.

если же использовать point sprites и вертекс-шейдеры (для расчета того самого шума перлина, движения снежинок и проч) то результат должен быть весьма кошерным. надо будет попробовать забабахать....


 
Темас   (2005-06-02 03:57) [14]

Я не мерил.


 
Zer0 ©   (2005-06-02 15:18) [15]

на офсайте неВидии:

Minimum Required: Geforce FX GPU. OpenGL

This example demonstrates an implementation of Perlin noise using vertex programs. An animated 3D noise function is used to displace the vertices of a sphere along the vertex normal. The geometry is entirely static, but is displaced on the fly by the vertex program hardware. Perlin noise is implemented for the vertex program profile using recursive lookups into a permutation table stored in constant memory. The size of this table determines the period at which the noise function repeats. 3D noise costs around 65 instructions, 2D noise around 45, 1D noise around 20.


 
Мимоход   (2005-06-03 06:45) [16]


> Zer0 ©   (02.06.05 15:18) [15]
> Perlin noise

А что вообще за Перлин Нойз такой ? Понятно, что перлинов шум. А что это такое ?


 
XProger ©   (2005-06-03 09:19) [17]

Мимоход, http://www.gamedev.ru/articles/?id=30126


 
!Trinix ©   (2005-06-03 10:14) [18]

Если хочешь реалистичности и быстрой работы попробуй такой вариант:
Сделай две основы для снежинок. Первая - обычная диогональная траектория. Вторая выпускает снежинок на порядок меньше, но по совету XProger © (random). Я так поступаю - очень реалистично.
Если используешь ветер, то направляй обе основы по ветру, хотя он нужен только, если используешь verlet.


 
q3   (2005-06-03 19:11) [19]

если снежинок > 1 000 000.

Тогда лугче всего нарисовать белый квадрат на весь экран ;)
эффект тот же а работает быстрее.

А вобще мне очень нравится снег в проге RivaTuner
New Year Edition (в about). Там, кстати, могет быть и без
рандома сделали. но ооочень красиво.

p.s ты же имеешь в виду 2d снежинки ? )))


 
Мимоход   (2005-06-04 03:39) [20]


> XProger ©   (03.06.05 09:19) [17]
> Мимоход, http://www.gamedev.ru/articles/?id=30126


И вот, что там написано : "В этом методе генерируется несколько текстур «октав» и слагая их вместе мы получаем довольно интересную текстуру, вид которой зависят от нескольких параметров."

Очень толково. А поподробнее ?


 
XProger ©   (2005-06-04 04:07) [21]

Мимоход, подробнее описано в следующих предложениях данной статьи...


 
Ке   (2005-06-10 01:26) [22]

Попробовал реализовать вышесказанное :
http://dcegame.narod.ru/snow.html

F1 - менять параметры. Выглядит так себе. На ёлку не похоже.


 
XProger ©   (2005-06-10 01:39) [23]

Игра: http://timeforkill.mirg.ru/files/game/TFK_040.exe
Карта: http://timeforkill.mirg.ru/files/maps/weather.rar
Пример реализации random метода ("тормозного" ;)


 
Код Да   (2005-06-10 05:04) [24]


> XProger ©   (03.06.05 09:19) [17]
> Мимоход, http://www.gamedev.ru/articles/?id=30126


А на Дельфи есть реализация этого всего? Это же форум Дельфи.


 
Zer0 ©   (2005-06-10 05:56) [25]

[22] Ке   (10.06.05 01:26)
это всего лишь один "слой" снежинок.

лучше всего сделать нексколько слоев - скажем на самом дальнем снежинки движутся медленно и имеют более серый оттенок. а чем ближе - тем выше скорость и цвет ближе к белому.

вот премер из SWAG для BP7, в приницпе переделывается под дельфу без особых проблем:
{
{you"ve seen it before, but not this fast... :-) }
(********************************************************************
Originally idea  : Nick Batalas, ( dated    14-6-1994 )
Sourced from                   : Eric Coolman, ( modified 19-6-1994 )
Rewritten by                   : Wil Barath,              03-9-1994
new : assembly optimisation, random weaving, memory reduction, etc.
********************************************************************)
{$G+}
Program SnowFall;
const
 Flakes = 3000;     { higher = more flakes }
 Fastest= 240;      { try smaller numbers for slower flakes}
 Explosion = False; { False for no explosion }
Var r:Word;
{---------------- Stuff not specific to snowfall ----------------}
Procedure vidMode(mode : byte);assembler;
 asm mov ah,$00;  mov al,mode; int 10h; end;
Function ReadKey:Char;Assembler;
asm Mov ax,0000h; int 16h; end;
Function Keypressed:Boolean;Assembler;
asm Mov ax,0100h; int 16h; JNZ @1; Xor ax,ax; Ret;
@1: Inc ax; end;
Procedure Perturb;assembler;  {Peturbation algorhythm (C) 1982 BarathSoft}
asm Mov dx,r; Xor dx,0aa55h; SHL dx,1; Adc dx,$118; Mov r,dx; end;
{---------------------------MAIN PROGRAM-------------------------}
Type FlakeyRec = Record x,y:Byte;p:Word; end;
var  CurFlake,s,pf:Word;
                Flake:Array[0..flakes] of flakeyrec;
Procedure Pascal_Version;
Begin
 repeat
   for CurFlake:= 1 to flakes do with flake[curflake] do
   begin
     Perturb; Mem[$a000:p]:=0;
     If x>=lo(r) then Inc(p);
     If y>=Hi(r) then Inc(p,320);
     Mem[$a000:p]:=y SHR 5 + $18;
   end;
   Repeat Until (port[$3da] and $08) = $08;  {wait for vRetrace }
 until keypressed;
end;
Procedure Assembly_version;
Begin
 repeat              { * NOTE * the above pascal version was derived }
      ASM            { from the assembly below, and is Very optimal. }
         Mov dx,r
         Mov cx,flakes             {for CurFlake:= 1 to flakes do}
         Mov pf,Offset flake;      {with flake[curflake] do}
         Mov ax,0a000h
         Mov es,ax                 {begin}
         Mov bx,$118
@0:       Xor dx,0aa55h             {Perturb }
         SHL dx,1
         Adc dx,bx
         Mov si,pf
         Mov di,[si.FlakeyRec.p]
         Xor al,al
         Mov es:[di],al            {Mem[$a000:p]:=0;}
         Cmp dl,[si.FlakeyRec.x]   {If x>=Lo(r) then Inc(p);}
         Jnc @1
         Inc di
@1:       Mov ah,[si.FlakeyRec.y]
         Cmp dh,ah                 {If y>=Hi(r) then Inc(p,320);}
         Jnc @2
         Add di,320
@2:       Mov Word Ptr [si.FlakeyRec.p],di
         Shr ah,5                  {Mem[$a000:p]:=y SHR 5 + $18;}
         add ah,bl
         Mov es:[di],ah
         Add pf,Type flakeyRec
         Loop @0
         Mov r,dx
       end;                        {end;}
   Repeat Until (port[$3da] and $08) = $08;  { wait for vRetrace }
 until keypressed;
End;
Begin
 for CurFlake:=0 to Flakes do With Flake[curflake] do
 begin                              { set up snow lookup table }
   Perturb; Inc(s,r);
   y:=Hi(Hi(r)*fastest)+5;
   x:=Hi(Lo(r)*y)+1;                {limit x movement}
   If explosion = False then p:=s;
 end;
 vidMode($13);                      { 320x200x256 graphics mode }
 Repeat
   Pascal_version;
   If ReadKey=#27 then Break;
   Assembly_version;
 Until ReadKey=#27;
 vidMode($03);                      { return to 80x25 textmode }
end.


 
DeadMeat ©   (2005-06-10 21:31) [26]

Когда то давно делал... Практически без всякой оптимизации. Использовались синусы и косинусы. Их конечно можно заменить на уже просчитанные варианты, но просто что получилось...
Два варианта внутри
http://www.deadmeat.programist.ru/Snow.rar

---
...Death Is Only The Begining...


 
dRake ©   (2005-06-10 23:14) [27]

Кстати очень реалистичный 2D вариант получался так:

Рандомом задается время и скорость полета снежинки "направо"
{...}
Время проходит, снежинка летит направо...
{...}
Рандомом задается время и скорость полета снежинки налево..
{..}

Скорость = (Ветер +/- Рандом)*Направление_полета
Время полета = константа + рандом

Варьированием констант и "количества" рандома достигаем красивой картинки, естесс-но снежинки должны быть оформлены как партиклы.


 
XProger ©   (2005-06-10 23:45) [28]


procedure TSuperSnow.Update;
begin
spX   := spX + random*0.1-0.05;
Pos.Y := Pos.Y + 1;
Pos.X := Pos.X + spX;
end;


 
Ке   (2005-06-11 02:18) [29]


> Zer0 ©   (10.06.05 05:56) [25]
> [22] Ке   (10.06.05 01:26)
> это всего лишь один "слой" снежинок.
>
> лучше всего сделать нексколько слоев - скажем на самом дальнем
> снежинки движутся медленно

Я сделал скорости падения снежинок неодинаковыми. Если убрать ветер и свинг, то будет хорошо видно. Параметры менять - F1.
Там можно и миллион снежинок генерить. Только медленно будет.

Кстати, добавил там снеговиков на льдине, чтобы хоть какой-то фон был. И пытаюсь сделать дождь. Но пока плохо выглядит, надо ещё обдумать как дождинки правильно рисовать. http://dcegame.narod.ru/snow.html


>  и имеют более серый оттенок.
> а чем ближе - тем выше скорость и цвет ближе к белому.

А это я ещё не сделал. Но не сложно.
Просто побоялся тормозов, от постоянной смены цвета.

А ассемблерный код, скажу честно, не понял. Вообще для понимания, лучше без ассемблера.


 
XProger ©   (2005-06-11 05:50) [30]

> Просто побоялся тормозов, от постоянной смены цвета.
Ке, ты видел эти тормоза? Пробовать надо, а не бояться...

Дождь:

// ang - угол падения
c := cos(ang);
s := sin(ang);
// обновление
for i := 0 to Count - 1 do
with Rain[i] do
 begin
 X := X + c*Speed;
 Y := Y + s*Speed;
 end;
// отрисовка
glEnable(GL_BLEND);
glBegin(GL_LINES);
for i := 0 to Count - 1 do
with Rain[i] do
 begin
 //Len - длина "шлейфа" от капли
 glColor4f(1, 1, 1, 1); glVertex2f(X, Y);
 glColor4f(1, 1, 1, 0); glVertex2f(X - c*Len, Y - s*Len);
 end;
glEnd;


 
Ке   (2005-06-12 01:20) [31]


> XProger ©   (11.06.05 05:50) [30]
> > Просто побоялся тормозов, от постоянной смены цвета.
> Ке, ты видел эти тормоза? Пробовать надо, а не бояться...

Сказал же ЕЩЁ не делал. Сначала то, что без тормозов, а потом уж наворачивать.

Дождик попробую.


 
Снежок   (2005-06-27 07:11) [32]


> DeadMeat ©   (10.06.05 21:31) [26]
> Когда то давно делал... Практически без всякой оптимизации.
> Использовались синусы и косинусы. Их конечно можно заменить
> на уже просчитанные варианты, но просто что получилось...
> Два варианта внутри
> http://www.deadmeat.programist.ru/Snow.rar


Красиво ! А ты то по какой формуле делал?



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.036 c
14-1129446756
SergP
2005-10-16 11:12
2005.11.06
Сегодня кто-нить будет поздравлять с ДР?


2-1129464892
Vladimir88
2005-10-16 16:14
2005.11.06
Отключение проверки на переполнение


14-1129021214
ANB
2005-10-11 13:00
2005.11.06
Чем отличается попса от рока ?


14-1129639781
oldman
2005-10-18 16:49
2005.11.06
так вот ты какой, русский язык :)


6-1121512855
Dust
2005-07-16 15:20
2005.11.06
Сниферы и PPP-адаптер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский