|
3D-программирование Вопросы, касающиеся программирования 3D мира |
27.07.2009, 22:40
|
#1
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Глобальные волны синусом
надо бы сделать чтоб синус делал одинаковые волны вне зависимости от позиции меша воды
у меня в цикле так делаются волны
y#=Sin(z#*1000)
на каждый вертекс
надо чтоб меш двигался а волны на нём были как в глобальном пространстве
если делать
TFormPoint x#,y#,z#,mesh,0
gz#=TFormedZ#()
y#=Sin(gz#*1000)
то чето чем дальше я меш от нуля отодвигаю по z тем быстрей эти волны по нему двигаются) т.е. через пару координат уже со скоротсю света летят
ничего не понимаю
graphics3d 1280,1024,32
cam=createcamera()
moveentity cam,250,10,0
CameraClsColor cam,100,100,100
lit=createlight()
Global height#=1
high=CreateLODedWater()
pointentity cam,high
Wireframe 1
While Not KeyHit(1)
If KeyDown(KEY_W) moveentity cam,0,0,1
If KeyDown(KEY_S) moveentity cam,0,0,-1
If KeyDown(KEY_A) moveentity high,0,0,-.1
If KeyDown(KEY_D) moveentity high,0,0,.1
UpdateWater2(high)
renderworld
text 0,0,TrisRendered()
Flip
Wend
Function CreateFace(segs,double,parent)
;segs=24
mesh=CreateMesh()
surf=CreateSurface( mesh )
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)
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 )
AddTriangle( surf,v0,v3,v2 )
Next
Next
Scaleentity mesh,50,height#,50
;rotateentity mesh,180,0,0
Return mesh
End Function
Function UpdateWater2(m)
surf=GetSurface(m,0)
cnt=CountVertices(surf)-1
For k=0 To cnt
x#=VertexX(surf,k)
z#=VertexZ(surf,k)
TFormPoint x#,0,z#,m,0
gz#=TFormedZ#()
y#=Sin((Float(gz#)*1000))*1
VertexCoords surf,k,x,y,z
Next
End Function
Function CreateLODedWater()
height#=1
high=CreateFace(24,0,0)
Return high
End Function
|
кнопки A,D - двигать меш
|
(Offline)
|
|
27.07.2009, 22:58
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Глобальные волны синусом
Пример крешится.
http://ru.wikipedia.org/wiki/Волновое_уравнение не поможет? Насколько я понял, тебе нужны выдержки из мат.физики.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
27.07.2009, 23:07
|
#3
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Глобальные волны синусом
Потому что у тебя синус возведён в зависимость от координаты Z. Как то так..
__________________
|
(Offline)
|
|
28.07.2009, 23:35
|
#4
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Глобальные волны синусом
да вроде да. но как бы это исправить)
|
(Offline)
|
|
29.07.2009, 00:23
|
#5
|
|
Ответ: Глобальные волны синусом
хм ?
y#=Sin((Float(VertexZ(surf,k)-EntityZ(m))*1000))*1
|
|
|
Сообщение было полезно следующим пользователям:
|
|
14.08.2009, 01:00
|
#6
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Глобальные волны синусом
хм, Джимоновский способ не проканал, но проканало это:
xTFormPoint(x#,0,z#,m,0)
gx#=xTFormedX#()
gz#=xTFormedZ#()
y#=Sin( (MilliSecs()/30+gz+gx*0.5)*6 )
НО почему-то в с++ не пашет то же самое:
y=sin( (jMillisecs64f()*0.0011f+gz+gx) *6 );
константу, на которую множить миллисекс я подогнал немного, а то иначе скорость отличалась. До жмиллисекса юзал time(), то же самое было
|
(Offline)
|
|
14.08.2009, 02:09
|
#7
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Глобальные волны синусом
хмм если убрать *6 то пашет. возможно в с++ есть какие то неведомые блицу ограничения по sin?
|
(Offline)
|
|
14.08.2009, 02:22
|
#8
|
|
Ответ: Глобальные волны синусом
Mr_F_
в C++ в радианах надо задавать углы
|
|
|
14.08.2009, 02:47
|
#9
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Глобальные волны синусом
а я не помню что такое радианы
пофиксил всё-таки, меняя константы:
y=sin( ((jMillisecs64f()/700.0f+gz+gx*.5f)*0.5f) );
|
(Offline)
|
|
14.08.2009, 09:55
|
#10
|
Знающий
Регистрация: 12.07.2007
Сообщений: 297
Написано 50 полезных сообщений (для 133 пользователей)
|
Ответ: Глобальные волны синусом
Небольшое отступление, сори:
Интересно, кто-нибудь пробовал делать воду с попощью анимации.
Допустим плэйн 100х100 и 10-20 костей, так подумать кажется может получиться достаточно быстрая вода, а кости можно и програмно двигать и заранее анимацию сделать, все не соберусь попробовать, может кто уже делал...?
|
(Offline)
|
|
14.08.2009, 09:58
|
#11
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Глобальные волны синусом
Сообщение от Damp
Небольшое отступление, сори:
Интересно, кто-нибудь пробовал делать воду с попощью анимации.
Допустим плэйн 100х100 и 10-20 костей, так подумать кажется может получиться достаточно быстрая вода, а кости можно и програмно двигать и заранее анимацию сделать, все не соберусь попробовать, может кто уже делал...?
|
Проще вертексы двигать (желательно в шейдере). Скелетка это то же перемещение вершин + обсчет иерархии скелета. К тому же простое перемещение по синусоиде будет всяко быстрее трансформации позиции матрицей.
|
(Offline)
|
|
14.08.2009, 11:09
|
#12
|
Троллота
Регистрация: 09.07.2007
Сообщений: 1,829
Написано 554 полезных сообщений (для 1,772 пользователей)
|
Ответ: Глобальные волны синусом
Сообщение от Mr_F_
а я не помню что такое радианы
пофиксил всё-таки, меняя константы:
y=sin( ((jMillisecs64f()/700.0f+gz+gx*.5f)*0.5f) );
|
радиан=угол*pi/180
эт если еще надо )
|
(Offline)
|
|
14.08.2009, 14:23
|
#13
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Глобальные волны синусом
Проще вертексы двигать (желательно в шейдере).
|
да, но мне к сожалению нужно взаимодействие физики с поверхностью воды) приходится извращатся с обычным двиганием вертексов. ваще есть такая прикольная вещь - projected grid т.е. вертексы проецируются регулярной сеткой в пространстве камеры, в результате волей-неволей получается что вблизи детально, а вдалеке нет. но похоже в ксорсе сделать такое нереал.
щас у меня пока много квадратных кусков воды, которые стыкуются друг с другом, лодятся/выгружаются и на них собсвтенно этот синус. однака надо поискать какой-то более прикольный алгоритм для генерации процедурных волн, вон в том же крайзисе ( ) намного лучше выглядит (да даже в санандреасе).
|
(Offline)
|
|
14.08.2009, 14:50
|
#14
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Глобальные волны синусом
http://en.wikipedia.org/wiki/Sea_state
тут наверное ключ к прикольным волнам.
но я ничего не понимаю в этих форумулах и как их превратить в xyz вертекса
|
(Offline)
|
|
14.08.2009, 20:28
|
#15
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Глобальные волны синусом
в общем в папере Tessendorf'а 99 года всё написано про крутые процедурные волны. тут имплементация:
http://www.gamasutra.com/gdce/2001/jensen/jensen_01.htm
однака я всё ещё хз как эти формулы понимать
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:47.
|