forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Имитация водной поверхности. (http://forum.boolean.name/showthread.php?t=15000)

dsd 27.06.2011 00:00

Имитация водной поверхности.
 
Подобрал уравнения деформирующие плоскость. Пока сильно подтормаживает, но это от апдэйта нормалей. :) Вроде красиво изгибает меш.

NitE 27.06.2011 00:03

Ответ: Имитация водной поверхности.
 
1. Почему нет кода ?
2. Это будет всегда подтормаживать, так-что не юзабельно, разве что если у тебя в игре будет только вода и одна лодочка.

Amatsu 27.06.2011 00:07

Ответ: Имитация водной поверхности.
 
Эффектно, завороженно смотрел на поверхность минут 5.
AMD X2 6000+, 4Gb ОЗУ, HD4770 - стабильно 70-75 фпс

dsd 27.06.2011 00:15

Ответ: Имитация водной поверхности.
 
Тю, по опыту сдесь код выходящий за рамки кода в справке не анализирут :D
Но вот:
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
Dither 0
Dim plane#(0,0)
Dim noise#(0)
Global pivot,camera,mxs#,mys#,Light,timer3

Const gravitation#=9.8

pivot=CreatePivot()
PositionEntity pivot,0,3,-10
camera=CreateCamera(pivot)
CameraClsColor camera,0,75,151
light=CreateLight()
MeshLight=CreateSphere(6,light)
;ScaleMesh meshlight,0.3,0.3,0.3
EntityFX meshlight,1
AmbientLight 15,15,15

mesh=CreateWaterPlane(36,36,3,3)
PrepareWaterData(mesh)

While Not ((KeyDown(56) And KeyHit(62)) Or (KeyHit(56) And KeyDown(62)) Or KeyHit(1))
timer3=MilliSecs()
PointEntity light,mesh
PositionEntity light,25*Sin(MilliSecs()/30),25,25*Cos(MilliSecs()/30)
UpdateWaterPlane(0.5,0.2,0.7,mesh)
UpdateWorld
RenderWorld
control(0.5,1.4)
Text 200,200,noise#(Rand(0,200))
Flip 0
Wend
End


Function UpdateWaterPlane(windx#,windy#,windz#,meshhandle)
mesh=meshhandle
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)
For i=0 To qvert-1
x00#=plane#(i,0)
y00#=plane#(i,1)

z01#=8*Cos(MilliSecs()/10+x00*3)+6*Sin(MilliSecs()/35+y00*1.5)+0.5*Sin(noise#(i)+MilliSecs()/4)
x01#=x00-8*Cos(MilliSecs()/10+x00*3)+0.5*Cos(noise#(i)+MilliSecs()/8)
y01#=y00-6*Sin(MilliSecs()/25+y00*2)+0.5*Sin(noise#(i)+MilliSecs()/4)
VertexCoords meshsurf,i,x01,z01,y01
Next
UpdateNormals mesh
End Function

Function PrepareWaterData(meshid)
mesh=meshid
meshsurf=GetSurface(mesh,1)
qvert=CountVertices(meshsurf)
Dim plane#(qvert,3)
For i=0 To qvert-1
plane#(i,0)=VertexX(meshsurf,i)
plane#(i,1)=VertexZ(meshsurf,i)

Next
End Function

Function CreateWaterPlane(width,depth,gridx#,gridy#)
mesh=CreateMesh()
meshsurf=CreateSurface(mesh)
b=width
d=depth
For y=-d To d
For x=-b To b

v0=AddVertex(meshSurf,x*gridx,0,y*gridy)
VertexNormal (meshsurf,v0,0,1,0)
Next
Next

qvert=CountVertices(meshSurf)

For i=0 To qvert-1
v0=i
x0#=VertexX(meshSurf,V0)
y0#=VertexZ(meshSurf,V0)

bize=i+3*b
If bize>qvert-1 Then bize=qvert-1

For z=i To bize
If (VertexX#(meshSurf,z)-gridx=x0#) And (VertexZ#(meshSurf,z)=y0#) Then v1=z
If (VertexX#(meshSurf,z)=x0#) And (VertexZ#(meshSurf,z)-gridy=y0#) Then v2=z
If (VertexX#(meshSurf,z)-gridx=x0#) And (VertexZ#(meshSurf,z)-gridy=y0#) Then v3=z
Next

If v0<>v1 And v2<>v3 Then AddTriangle(meshsurf,v1,v0,v2) : AddTriangle(meshsurf,v3,v1,v2) :v1=v2=v3=0
Next

For i=0 To qvert-1
x00#=VertexX(meshsurf,i)
y00#=VertexZ(meshsurf,i)
u00#=x00/(width*gridx)
v00#=y00/(depth*gridy)
VertexTexCoords meshsurf,i,u00,v00

Next

Dim noise#(qvert)
For i=0 To qvert-1
noise#(i)=Rnd(0,359.99)
Next

testtex=CreateTexture(256,256,256)
SetBuffer TextureBuffer(testtex)
Color 127,127,127
Rect 0,0,128,128
Rect 128,128,128,128
Color 235,240,235
Rect 0,128,128,128
Rect 128,0,128,128
SetBuffer BackBuffer()
EntityTexture mesh,testtex,0,0
ScaleTexture testtex,.1,.1


Return mesh
End Function

Function control(speed#,mousesensitivity#)
If KeyDown(2) WireFrame True Else WireFrame False
mxs#=mxs#+(MouseXSpeed()/5.0)
mys#=mys#+(MouseYSpeed()/5.0)
RotateEntity camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
If KeyDown(17) Or KeyDown(200) MoveEntity camera,0,0,speed#
If KeyDown(31) Or KeyDown(208) MoveEntity camera,0,0,-speed#
If KeyDown(30) Or KeyDown(203) MoveEntity camera,-speed#,0,0
If KeyDown(32) Or KeyDown(205) MoveEntity camera,speed#,0,0
PositionEntity pivot,EntityX#(camera,1),EntityY#(camera,1),Entity Z#(camera,1)
PositionEntity camera,0,0,0


Text 100,10,"polygons in view "+TrisRendered()
If (MilliSecs()-timer3)<>0 Text 100,40,"Frames per second is: "+1000/(MilliSecs()-timer3)
End Function

Пока просто лениво считать нормали к точкам, без апдейта это в 5-6 раз резче, плюс можнозамутить перерисовку меша по типу террэйна. Только зачем мне это в пародии на МОО :D
Это эскиз вообще без оптимизации.
1-wireframe

Colossus 27.06.2011 00:20

Ответ: Имитация водной поверхности.
 
да ) неплохо ) вот еще сделать красивую водную поверхность, и постэффекты, и получится шикарно )

Mr_F_ 27.06.2011 00:28

Ответ: Имитация водной поверхности.
 
автор, переходи на dx9+ движки, вертексными шейдерами не будет тормозить)

ARA 27.06.2011 00:36

Ответ: Имитация водной поверхности.
 
Исчо вариант - убрать мелкую рябь, уменьшить полигонаж воды раз в 5. а рябь заменить ревлективным/рефрактивным бампом из FastExt или Ashadow)

maxturbo 27.06.2011 00:37

Ответ: Имитация водной поверхности.
 
У автора просто видать хобби... Как и все остальные он пытается из не возможного делать реальные вещи и при чем это получается довольно таки не плохо ;)

Program23 27.06.2011 00:47

Ответ: Имитация водной поверхности.
 
Класс!По-истине релаксирующая водичка,еще бы текстуру натянуть,песчаный берег,крабик,камешек,ракушка,дельфиничика,чаек,пен у от разбивающихся об брег волн...

Amatsu 27.06.2011 00:58

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от Program23 (Сообщение 193252)
Класс!По-истине релаксирующая водичка,еще бы текстуру натянуть,песчаный берег,крабик,камешек,ракушка,дельфиничика,чаек,пен у от разбивающихся об брег волн...

Думаю от таких волн на пляжике не останется ни крабиков, ни ракушек. Волны явно штормовые, причем вдали от берега

dsd 27.06.2011 01:02

Ответ: Имитация водной поверхности.
 
Хм. Где то читал, что уровень графики современных игр должен быть посильным для первых пней если код будет правильный :)))

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

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

И да, скоро я буду вспоминать термех :D

Это просто волны, когда выведу коэффициенты можно будет имитировать от ряби до шторма :) И надо еще с логарифмами и тангенцами поэксперементировать :)

LLI.T.A.L.K.E.R. 27.06.2011 01:34

Ответ: Имитация водной поверхности.
 
dsd с АВТОМАТ-ом могли бы сделать "Минекрафт получше"

moka 27.06.2011 02:01

Ответ: Имитация водной поверхности.
 
dsd, дык, под Blitz3D, есть Xors3D - а там есть и шейдеры. А они позволяют в функции вершинного шейдера, в реальном времени изменять позицию и любые другие параметры вершин со сложными формулами с очень отличной производительностью (на то и шейдеры).
И в современных играх, используют именно их.

dsd 27.06.2011 02:08

Ответ: Имитация водной поверхности.
 
;нужно сделать что бы в зоне видимости камеры была плоскость.
; А вне зоны ее не было. Отсечение ненужного легко решается задачей четырех плоскостей отгораживающих невидимое
; уравнение плоскости ax+by+cz=0 d не нужно так как плоскость проходит через начало координат
; Нужно в координатах камеры найти линии пересечения плоскости воды и клипплэйнов. Это первый этап. Видимость точки определяется легко потому как нормаль имеет длину 1 а уравнения плоскостей приведены к нормальному виду и расстояние от точки до поверхностей считается легко
;
;Этап второй нужным образом а именно линиями расположенными перпендикулярно нормальному вектору связывающему точку проецирующий на камеру в graphicswidth().2 и последовательно расположенную высоту имею рассчитываемые координаты точек, которые перевожу в координаты меша
; Чем дальше от камеры тем шире ряды.
;Рассчитываю полученные из ничто исходные координаты точек меша, считаю новые ставлю точки в полученные натягиваю сюрфэйс. Хитрым финтом для каждой точки из уравнения извлекаю нормаль
;ставлю нормаль. Придумываю как завязать текстурные координаты на глобальные, что бы текстура не дрожала. Профит.

Вот вроде просто :))) Но программирования тут раз в 20 меньше математики :)

Мока, мне триалов для медитаций не хватает :) и на вид ксорс не лучше блитца. Да и жадный я:))))

NitE 27.06.2011 04:26

Ответ: Имитация водной поверхности.
 
Цитата:

мне триалов для медитаций не хватает
Изучил-бы вопрос сначала. У Хорса триал - полная функциональность и ограничение по времени 30 минут. Я сомневаюсь что у тебя хватит силы воли медитировать на эти волны более 30 минут.

Цитата:

и на вид ксорс не лучше блитца.
Во-первых внешность обманчива. Во-вторых http://www.gamedev.ru/flame/forum/?id=142859 и ещё многое (офф. сайт в отключке), это хорс.

Блиц хуже Хорса по всем параметрам, он уже слишком стар чтобы с кем-то тягаться. Да и апдейты на него раз в год по обещанию.

Цитата:

Да и жадный я
Сделай игру - получи хорс бесплатно. Кажется ещё в силе.


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

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