Вода, отражения.

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Вода, отражения.

Сообщение Mikle » 15.10.2004 (Пт) 9:16

Вот написал DLL-ку. Генерирует и анимирует поверхность, типа воды. Привожу пример использования. В DLL-ке один объект - WaterPlane, имеет методы и свойства:

Init - начальная инициализация. Параметры - d3dDevice и детализация, допустимые значения - 8, 16, 32, 64, 128. При значении, например, 64 - будет создано 64*64 вертексов.
Amplitude - высота волн.
Speed - скорость анимации.
Update - параметр - время, прошедшее с прошлого кадра. Просчитывает новые значения, но НЕ РЕНДЕРИТ.
Render - а это уже рендер.
Kill - освобождает память, желательно вызывать перед уничтожением самого объекта (Set WP = Nothing).
Amplitude и Speed можно менять на ходу, в примере это делается стрелками (ArrowKeys).

Это полностью софтовый рассчет, никакого бампа или шейдеров - то есть и никаких претензий к видеокарте, зато зависит от процессора. На Celeron 1300 при максимальной детализации просчитывает около 100 кадров за секунду. Я не стал накладывать текстурные координаты - какая текстура у воды? Прозрачность и\или цвет можно сделать материалом. Для демонстрации того, что просчитывается не только координата, но и нормали - я наложил карту отражений.

Не забудьте зарегистрировать DLL в системе (regsvr32) и, если не заработает, удалите из примера ссылку на WaterPlane и добавьте ее снова (Project\References\Browse).
Не имею ничего против применения WaterPlane в ваших проектах (особенно с указанием автора :wink: ).

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.10.2004 (Пн) 11:15

Оригинально, на GameDev - ажиотаж, а тут тишина, какой спокойный и вдумчивый народ :)
Если кому-то проблемма использовать DLL - так я выложил и исходник (см. флейм на GameDev.ru). Там есть полезная доработка - такие куски можно без шва состыковывать между собой в любом направлении. Повторный рассчет (Update) при этом НЕ НУЖЕН!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 11:30

Пытался запустить на этом буке...
Ошибка при инициализации hardware_vertexprocessing. Заменил на software, попёрло. Но возникла ошибка на WP.Init d3dDevice, 128. Значения понижал до 8, всё равно не пропала :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 21.10.2004 (Чт) 12:03

Зачем DLL'ку сделал продовать что ли будешь :wink:
Интересно же посмотреть как это было сделано
Вообщето красиво :wink:
Но только больше похоже на зеркало (жидкое :) )
И почему размер волны даже на максимум такой маленький

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 21.10.2004 (Чт) 19:36

Исходник смотри на геймдеве, я же уже написал.
http://www.gamedev.ru/download/?id=1342
Как я могу продавать, если уже выложил в свободное пользование. Просто DLL в чем-то удобнее. Напр. в том, что я проект совершенствую. Пользователю легче поменять DLL, чем код.
Похоже на зеркало (ртуть), потому что нет прозрачности. Это ТОЛЬКО демонстрация софтового рассчета нормалей и координат.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 21.10.2004 (Чт) 23:10

Отличная работа, МIKLE! Я долго (как ты говорил "осмысленно") ждал пока все выговорятся. GSERG подсказал о наличии "глюка" в коде. Исправил на Software_Vertex ещё до первого запуска, программа пошла сразу, без проблем! Чёткие 50 FPS на GF2MX400, D900, 256 SDRAM.
BONESNAPPER,
вид ртути и отравы не имеет ни малейшего оношения к коду и прозрачности - это всего лишь результат неудачно выбранной текстуры.
Ну и как повелось - несколько гвоздей:
1. У меня поверхность воды не прямоугольная (задумано как пример реализации многоугольников?).
2. Границы поверхности "немного плывут" синхронно с волной. Не повлияет - ли это на дальнйшую стыковку.
3. Не думаю, что имеет смысл выносить 6 последовательных строк кода (QFreq и QTime) в отдельные функции, а тем более в модуль. Дополнительные вызова только замедлят код. Не знаю точно, как VB компиирует модули и классы, но скорее всего в отдельные сегменты. Причем по старым процам знаю, что межсегментный переход/вызов был всегда медленне внутрисегментного. Возможно, это имеет место и в новых.
4. При прочих равных условиях подсчет ФПС прошел неоднозначно (50-51 при первом пуске VB, 55-56 при последующем)

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 22.10.2004 (Пт) 10:46

а мне не очень понравилось (((

некуда применять! текстуру на воду придется натягивать всегда другую - под окружающий мир.

но тут - красяво ) ничего не скажешь )))
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 24.10.2004 (Вс) 16:43

Yurich
У меня поверхность воды не прямоугольная

Если это о втором примере (исходник), то там сшиты 3 прямоугольных куска.
. Границы поверхности "немного плывут" синхронно с волной. Не повлияет - ли это на дальнйшую стыковку.

Как видишь эти 3 куска состыкованы без швов. А "плывут" потому, что волны меняют не только нормали, а и реальную высоту. Если сделать вид строго сверху и изометрическую проекцию - ничего плыть не должно. Или у тебя другое?
Не думаю, что имеет смысл выносить 6 последовательных строк кода (QFreq и QTime) в отдельные функции, а тем более в модуль

Согласен. Прошу весь остальной код, кроме модуля WaterPlane считать наспех написанным ТОЛЬКО для демонстрации работы самого модуля. А вот WaterPlane, считаю, неплохо оптимизирован. Хотя совершенству нет предела. :wink:
подсчет ФПС прошел неоднозначно (50-51 при первом пуске VB, 55-56 при последующем)
.... трудно сказать в чем дело. Но вообще эта программа очень процессорозависима, поэтому FPS лучше смотреть в скомпилированном EXE.
d3drm
некуда применять! текстуру на воду придется натягивать всегда другую - под окружающий мир.

Планируется использовать так: представляем воду гладким зеркалом, рендерим отражение (не проблема?), но рендерим не в бэкбуфер, а в текстуру. Эту текстуру используем для воды. Получаем почти реальное отражение.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 24.10.2004 (Вс) 20:25

Да, идея очень хорошая... а как рендерить в текстуру?
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 25.10.2004 (Пн) 16:28

Вот пример рендера в текстуру. Если еще кто-нибудь разберется, почему оно прекрасно работает из бейсика, но не работает скомпилированное в Native-Code... :cry:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 26.10.2004 (Вт) 13:48

Mikle писал(а): Если еще кто-нибудь разберется, почему оно прекрасно работает из бейсика, но не работает скомпилированное в Native-Code... :cry:
В FormLoad перед циклом поставь On Error Resume Next :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 27.10.2004 (Ср) 15:25

Это понятно, но хотелось бы локализовать саму ошибку.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 27.10.2004 (Ср) 18:34

у меня вот тут вылетает:

Set Tex2 = d3dDevice.CreateTexture(TexSize, TexSize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT)

UseMip = True не помогает...
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 28.10.2004 (Чт) 9:28

d3drm
Значит твоя видюшка (насколько помню, Riva128) не поддерживает рендер в текстуру. UseMip - это мип-фильтрация RenderTarget текстуры, процесс очень ресурсоемкий.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.03.2005 (Пт) 0:31

ставлю:
Код: Выделить всё
  D3DXMatrixScaling Mtrx, 100!, 100!, 100!
  D3DDevice.SetTransform D3DTS_WORLD, Mtrx
и разводы куда-то деваются :shock: .. видно только на краях, что вода двигается..... (как ее растянуть :? ).... Да, и че делает вот эта штука :
Код: Выделить всё
D3DDevice.SetTextureStageState 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR
:roll: Мона ли без нее, а то при вращении камеры, вращается и текстура... :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.03.2005 (Пт) 11:45

1. Поменяй в класс-модуле константу (кажется kReflect) так, чтобы видимая степень отражения соответствовала амплитуде волн.

2. Эта строка означает, что текстурные координаты берутся не из вертексов, а вычисляются, исходя из нормали и позиции камеры, и ПРИМЕРНО соответствуют текстурным координатам на сферической текстуре отражений.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.03.2005 (Пт) 18:35

Mikle писал(а):2. Эта строка означает, что текстурные координаты берутся не из вертексов, а вычисляются, исходя из нормали и позиции камеры, и ПРИМЕРНО соответствуют текстурным координатам на сферической текстуре отражений.
Майкл, а нельзя ли ее как-нть обойти, а то некрасиво выходит... камера едит она едит, поворачиваюсь и она текстура поворачивается (некрасиво...текстура не имеет своего положения)... :roll: Я вот подумал, может можно так же как и снормалями tu tv считать? :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.03.2005 (Сб) 11:19

Vovik
Я уже пробовал вместо нормалей считать tu\tv, это годится для изометрии, а для перспективы рассчет СИЛЬНО усложнится.
А чтобы в варианте с нормалями текстура реалистично вращалась, нужно рассчитать матрицу, как для камеры, только БЕЗ СМЕЩЕНИЯ, то есть как камера, смотрящая всегда из точки 0, 0, 0. Потом для нее сделать обратную матрицу, и загнать ее в D3DTS_TEXTURE.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 12.03.2005 (Сб) 16:05

Mikle писал(а):Vovik
Я уже пробовал вместо нормалей считать tu\tv, это годится для изометрии, а для перспективы рассчет СИЛЬНО усложнится.
А чтобы в варианте с нормалями текстура реалистично вращалась, нужно рассчитать матрицу, как для камеры, только БЕЗ СМЕЩЕНИЯ, то есть как камера, смотрящая всегда из точки 0, 0, 0. Потом для нее сделать обратную матрицу, и загнать ее в D3DTS_TEXTURE.
Как я понял нужно делать так:
Код: Выделить всё
  Dim Mtrx1 As D3DMATRIX
  Dim d As Single
 
  D3DXMatrixTranslation Mtrx, 0!, 0!, 0!
  D3DDevice.MultiplyTransform D3DTS_WORLD, Mtrx
  D3DXMatrixScaling Mtrx, 100!, 100!, 100!
  D3DDevice.MultiplyTransform D3DTS_WORLD, Mtrx
 
  D3DDevice.GetTransform D3DTS_WORLD, Mtrx1
 
  D3DXMatrixInverse Mtrx1, d, Mtrx1
  D3DDevice.SetTransform D3DTS_TEXTURE0, Mtrx1
Но чет оно не пашет... Мне нужно как бы зафиксировать текстуру, типа с tu,tv... :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.03.2005 (Сб) 18:27

D3DXMatrixTranslation Mtrx, 0!, 0!, 0!
D3DDevice.MultiplyTransform D3DTS_WORLD, Mtrx
- не имеет смысла. Это умножение на матрицу, к-рая ничего не меняет.
GetTransform берется не из World, а из View.
То есть если для камеры так:
D3DXMatrixRotationX Mtrx, Diff
d3dDevice.SetTransform D3DTS_VIEW, Mtrx
D3DXMatrixRotationY Mtrx, Angle
d3dDevice.MultiplyTransform D3DTS_VIEW, Mtrx
D3DXMatrixTranslation Mtrx, -CamPos.x, -CamPos.y, -CamPos.z
d3dDevice.MultiplyTransform D3DTS_VIEW, Mtrx
то для текстуры:
D3DXMatrixRotationX Mtrx, Diff
d3dDevice.SetTransform D3DTS_TEXTURE0, Mtrx
D3DXMatrixRotationY Mtrx, Angle
d3dDevice.MultiplyTransform D3DTS_TEXTURE0, Mtrx
D3DXMatrixInverse Mtrx, 1!, Mtrx
D3DDevice.MultiplyTransform D3DTS_TEXTURE0, Mtrx
Под рукой нет VB, чтобы проверить, но я пробовал, должно работать.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

    TopList