Моделирование и визуализация водных поверхностей

Автор работы: Пользователь скрыл имя, 11 Декабря 2011 в 07:50, дипломная работа

Краткое описание

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

Содержание работы

1. Введение 3
1.1 Обзор публикаций 4
1.2 Постановка задачи 6
2. Имитация поведения поверхности воды 7
2.1 Выбор типа сетки для представления поверхности воды 7
2.2 Волновое уравнение поверхности 8
3. Имитация оптических эффектов 12
3.1 Оптические свойства воды 12
3.2 Создание текстур 13
3.3 Проекционное текстурирование 15
3.4 Отсечение объектов 16
3.5 Цвет воды 17
4. Описание приложения 19
4.1 HLSL – высокоуровневый язык шейдеров 19
4.2 Рендеринг в текстуру (Render To Texture) 21
4.3 Руководство пользователя 21
5. Заключение 23
6. Список литературы 24

Содержимое работы - 1 файл

8403-Лалакина_бакалаврская.doc

— 785.00 Кб (Скачать файл)

    Возможность реализовать все версии эффекта  в одном файле дает нам более полную инкапсуляцию эффекта в целом, а объединение реализации эффекта это и есть одна из целей каркаса эффектов.

    Каждая  техника объединяет один или несколько  проходов визуализации (rendering passes). Проход визуализации объединяет режимы устройства, режимы выборки и шейдеры, используемые для визуализации на данном этапе. Причина наличия нескольких проходов в том, что для реализации некоторых эффектов необходимо визуализировать один и тот же объект несколько раз с различными режимами визуализации, шейдерами и т.д. для каждого прохода.

    Файл  эффектов не ограничивает нас только использованием программируемого конвейера. Например, можно использовать фиксированный конвейер для управления режимами устройств, такими как освещение, материалы и текстуры.

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

4.2 Рендеринг в текстуру (Render To Texture)

    Данный  метод достаточно широко распространен  в компьютерной графике и является одной из продвинутых техник. С  одной стороны, это не очень сложно, но с другой стороны этот способ является мощным средством создания многих визуальных эффектов (например, эффект свечения вокруг объекта – glow effect, карты окружения и карты теней, эффекты постобработки, а также многое другое).

    Принцип использования метода очень прост:

  1. Создать текстуру с одним уровнем детализации и флагами D3DUSAGE_RENDERTARGET и D3DPOOL_DEFAULT
  2. Получить поверхность текстуры (surface)
  3. Сохранить backbuffer, чтобы в конце восстановить исходное состояние
  4. Установить созданную текстуру в качестве объекта рендеринга
  5. Произвести отрисовку сцены
  6. Восстановить состояние, установив сохраненный backbuffer в качестве объекта рендеринга

    Для упрощения процесса можно использовать интерфейс ID3DXRenderToSurface. В таком случае не нужно будет заботиться о сохранении backbuffer’a, а кроме того появится возможность  производить рендеринг с включенным аппаратным сглаживанием.

    Исходя  из вышесказанного, можно утверждать, что данный метод является вполне простым, но, тем не менее, мощным средством  создания некоторых эффектов.

4.3 Руководство пользователя

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

рис.19 Внешний вид приложения

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

    Управление  производится с помощью клавиатуры и мыши:

    WASD или стрелки   – движение

    SHIFT (при движении)  – быстрое перемещение

    SPACE     – прыжок (в режиме хождения по ландшафту)

    Правая  кнопка мыши – переключение режимов GUI и управления камерой 

    Приложение  позволяет настраивать: силу искажений и дождя, коэффициент вязкости жидкости. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

           

 

5. Заключение

    Итак, в результате работы были изучены некоторые способы физического моделирования и реализован один из них (численное решение волнового уравнения)

    Кроме физических моделей были также рассмотрены  способы визуального моделирования  водной поверхности: создание текстур  отражения и преломления и их смешивание по формуле Френеля, влияние глубины на цвет воды и  применение эффекта каустик.

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

    Будущие исследования будут вестись в  следующих направлениях.

    Во-первых, реализация других физических моделей (например, волны Gerstner или быстрое преобразование Фурье).

    Во-вторых, увеличение реалистичности и детальности  отображения воды. Здесь открывается  широкий простор для творчества. Например, для увеличения реалистичности можно добавить механизм моделирования брызг на основе систем частиц, пены, каустик, а также так называемого эффекта «godrays». Так же можно добавить объекты, движущиеся в воде и механизм образования расходящихся волн от этих объектов.

 

6. Список литературы

  1. Lasse Staff Jensen and Robert Golias. Deep-Water Animation and Rendering. Gamasutra, September 26, 2001 [HTML] 
    (
    http://www.gamasutra.com/gdce/2001/jensen/)
  2. Н.А. Елыков, И.В. Белаго, С.А. Кузиковский. Методы визуализации и анимации моделей протяженных водных поверхностей в системах виртуальной реальности. GRAPHICON 2005 [PDF]
  3. Cass Everitt. Projective Texture Mapping. NVIDIA [PDF]
  4. John Isidoro, Alex Vlachos, Chris Brennan. Rendering Ocean Water. ShaderX  [PDF]
  5. John Isidoro, Alex Vlachos, Chris Oat. Rippling Reflective and Refractive Water. ShaderX [PDF]
  6. Ben Humphrey. Realistic Water Using Bump Mapping and Refraction. [PDF] (http://www.gametutorials.com)
  7. Mark Finch. Effective Water Simulation from Physical Models. NVIDIA GPU Gems, 2004, p. 5-29
  8. Yuri Kryachko. Using Vertex Texture Displacement for Realistic Water Rendering. NVIDIA GPU Gems 2, 2005, p. 283-294
  9. Tiago Sousa. Generic Refraction Simulation. NVIDIA GPU Gems 2, 2005, p. 295-305
  10. Kurt Pelzer. Advanced Water Effects. ShaderX2, 2003, p. 207-225
  11. Static Water Simulation [HTML] (http://collective.valve-erc.com/)
  12. Маркичев А. С., Супиков А.М. Физическое моделирование деформируемых поверхностей в игровых и анимационных приложениях. Анимация водной поверхности. International Conference Graphicon, 1999. [PDF]
  13. Материалы сайтов для разработчиков игр [HTML] (http://www.gamedev.ru/)
  14. Frank D. Luna. Introduction to 3D Game Programming with DirectX 9.0

 

 

Приложение

NXWater.h

#ifndef _NX_WATER_

#define _NX_WATER_ 

#include <d3dx9.h> 

#include "NXCommon.h" 

//--------------------------------------------------------------------------

HRESULT    NXCreateRegularGrid(LPD3DXMESH* ppMesh, LPDIRECT3DDEVICE9 pDevice,

                               UINT iXCount, UINT iZCount, float fXWidth, float fZWidth,

                               D3DXVECTOR3 vCenter);

D3DXMATRIX NXObliqueFrustumCulling(D3DXPLANE& plane, D3DXMATRIX& view, D3DXMATRIX& proj); 

//--------------------------------------------------------------------------

class NXWaterCore

{

    protected:

        D3DXMATRIX m_mReflect; // reflection matrix (about water plane)

        D3DXMATRIX m_mTex;     // remapping matrix (to transform texture coords)

        D3DXMATRIX m_mProj;    // extended projection matrix (increased FOV) 

        D3DXPLANE  m_plNormal; // real water plane

        D3DXPLANE  m_plLower;  // clip planes for rendering reflection & refraction

        D3DXPLANE  m_plUpper; 

        float      m_fLevel;   // water level

        float      m_fShift;   // clip planes shift

        float      m_fFOV;     // current field-of-view for projection matrix 

    public:

        NXWaterCore();

        ~NXWaterCore(); 

        void Init(float fLevel, float fShift);

        void RebuildProjectionMatrix(float fFOV);

        void InitProjectionMatrix(float fFOV, D3DXMATRIX* pMatrix); 

        inline void SetLevel(float fLevel)      { Init(fLevel, m_fShift); }

        inline void SetPlaneShift(float fShift) { Init(m_fLevel, fShift); } 

        inline float GetLevel() { return m_fLevel; } 

        inline D3DXPLANE&  LowerPlane() { return m_plLower; }

        inline D3DXPLANE&  Plane()      { return m_plNormal; }

        inline D3DXPLANE&  UpperPlane() { return m_plUpper; } 

        inline D3DXMATRIX& ReflectionMatrix()  { return m_mReflect; }

        inline D3DXMATRIX& ScreenToTexMatrix() { return m_mTex; }

        inline D3DXMATRIX& ProjExMatrix()      { return m_mProj; }

};

//--------------------------------------------------------------------------

class DepthTexture

{

public:

        ID3DXRenderToSurface* m_RTS;

        IDirect3DSurface9*    m_TopSurface;

public:

        DepthTexture(int iWidth, int iHeight,D3DFORMAT TexFormat);

       ~DepthTexture(); 

        void BeginScene();

        void EndScene(); 

        void OnLostDevice();

Информация о работе Моделирование и визуализация водных поверхностей