{"id":20209785,"url":"https://github.com/srmainwaring/asv_wave_sim","last_synced_at":"2025-07-23T18:32:53.092Z","repository":{"id":39650962,"uuid":"167454392","full_name":"srmainwaring/asv_wave_sim","owner":"srmainwaring","description":"This package contains plugins that support the simulation of waves and surface vessels in Gazebo.","archived":false,"fork":false,"pushed_at":"2025-01-02T13:32:08.000Z","size":46899,"stargazers_count":144,"open_issues_count":19,"forks_count":42,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-03-29T04:04:00.241Z","etag":null,"topics":["gazebo","hydrodynamics","ros","simulation","waves"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/srmainwaring.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-24T23:37:49.000Z","updated_at":"2025-03-28T16:05:59.000Z","dependencies_parsed_at":"2023-02-12T17:45:34.393Z","dependency_job_id":"ad23ff97-5a81-41b4-9d82-be6d84349913","html_url":"https://github.com/srmainwaring/asv_wave_sim","commit_stats":{"total_commits":105,"total_committers":1,"mean_commits":105.0,"dds":0.0,"last_synced_commit":"abc13ea18c8633e8f62b2cb3f21d8321df47c87c"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmainwaring%2Fasv_wave_sim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmainwaring%2Fasv_wave_sim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmainwaring%2Fasv_wave_sim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srmainwaring%2Fasv_wave_sim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srmainwaring","download_url":"https://codeload.github.com/srmainwaring/asv_wave_sim/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247289409,"owners_count":20914464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gazebo","hydrodynamics","ros","simulation","waves"],"created_at":"2024-11-14T05:42:27.691Z","updated_at":"2025-04-05T05:03:04.278Z","avatar_url":"https://github.com/srmainwaring.png","language":"C++","funding_links":[],"categories":["Simulation environments"],"sub_categories":["Gazebo"],"readme":"# Wave Sim\n\n[![Ubuntu Jammy CI](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/ubuntu-jammy-ci.yml/badge.svg)](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/ubuntu-jammy-ci.yml)\n[![macOS Ventura CI](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/macos13-ventura-ci.yml/badge.svg)](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/macos13-ventura-ci.yml)\n[![Cpplint](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/ccplint.yml/badge.svg)](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/ccplint.yml)\n[![Cppcheck](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/ccpcheck.yml/badge.svg)](https://github.com/srmainwaring/asv_wave_sim/actions/workflows/ccpcheck.yml)\n\nThis package contains plugins that support the simulation of waves and surface vessels in [Gazebo](https://gazebosim.org/home).\n\n![rs750_ardupilot_v3_upwind](https://user-images.githubusercontent.com/24916364/228044489-b434b1ae-c30f-4676-9415-1719ee75479b.gif)\n\n\nThe main branch targets [Gazebo Garden](https://gazebosim.org/docs/garden) and no longer has a dependency on ROS. \n\nThere are new features including FFT wave generation methods, ocean tiling, and support for the [Ogre2](https://github.com/OGRECave/ogre-next) render engine. There are some changes in the way that the wave parameters need to be set, but as far possible we have attempted to retain compatibility with the earlier versions. Further details are described below where you can also find a section describing [support for legacy versions of Gazebo](#legacy-versions).\n\n## Dependencies\n\n- A working installation of [Gazebo Garden](https://gazebosim.org/docs/garden) or later including development symbols.\n\n- The simulation uses the [CGAL](https://www.cgal.org/) library for mesh manipulation and [FFTW](http://www.fftw.org/) to compute Fourier transforms. Both libraries are licensed GPL-3.0.\n\n## Ubuntu\n\n- Ubuntu 22.04 (Jammy)\n- Gazebo Sim, version 7.1.0 (Garden)\n\nInstall CGAL and FFTW:\n\n```zsh\nsudo apt-get update\nsudo apt-get install libcgal-dev libfftw3-dev\n```\n\n## macOS\n\n- macOS 12.6 (Monterey)\n- Gazebo Sim, version 7.1.0 (Garden)\n\nInstall CGAL and FFTW:\n\n```zsh\nbrew update\nbrew install cgal fftw\n```\n\n## Installation\n\n### Create a workspace\n\n```bash\nmkdir -p gz_ws/src\n```\n\n### Clone and build the package\n\nClone the `asv_wave_sim` repository:\n\n```bash\ncd ~/gz_ws/src\ngit clone https://github.com/srmainwaring/asv_wave_sim.git\n```\n\nCompile the package:\n\n#### Ubuntu\n\n```bash\ncolcon build --symlink-install --merge-install --cmake-args \\\n-DCMAKE_BUILD_TYPE=RelWithDebInfo \\\n-DBUILD_TESTING=ON \\\n-DCMAKE_CXX_STANDARD=17\n```\n\nSource the workspace:\n\n```bash\nsource ./install/setup.bash\n```\n\n#### macOS\n\n```bash\ncolcon build --symlink-install --merge-install --cmake-args \\\n-DCMAKE_BUILD_TYPE=RelWithDebInfo \\\n-DBUILD_TESTING=ON \\\n-DCMAKE_CXX_STANDARD=17 \\\n-DCMAKE_MACOSX_RPATH=FALSE \\\n-DCMAKE_INSTALL_NAME_DIR=$(pwd)/install/lib\n```\n\nSource the workspace:\n\n```bash\nsource ./install/setup.zsh\n```\n\n### Build the GUI plugin (optional) \n\nThere is an optional GUI plugin that controls the wave parameters.\n\n```bash\ncd ~/gz_ws/src/asv_wave_sim/gz-waves/src/gui/plugins/waves_control \nmkdir build \u0026\u0026 cd build\ncmake .. \u0026\u0026 make\n```\n\n## Usage\n\n### Set environment variables\n\n```bash\n# for future use - to support multiple Gazebo versions\nexport GZ_VERSION=garden\n\n# not usually required as should default to localhost address\nexport GZ_IP=127.0.0.1\n\n# ensure the model and world files are found\nexport GZ_SIM_RESOURCE_PATH=\\\n$GZ_SIM_RESOURCE_PATH:\\\n$HOME/gz_ws/src/asv_wave_sim/gz-waves-models/models:\\\n$HOME/gz_ws/src/asv_wave_sim/gz-waves-models/world_models:\\\n$HOME/gz_ws/src/asv_wave_sim/gz-waves-models/worlds\n\n# ensure the system plugins are found\nexport GZ_SIM_SYSTEM_PLUGIN_PATH=\\\n$GZ_SIM_SYSTEM_PLUGIN_PATH:\\\n$HOME/gz_ws/install/lib\n\n# ensure the gui plugin is found\nexport GZ_GUI_PLUGIN_PATH=\\\n$GZ_GUI_PLUGIN_PATH:\\\n$HOME/gz_ws/src/asv_wave_sim/gz-waves/src/gui/plugins/waves_control/build\n```\n\n### Ubuntu VM\n\nIf running on an Ubuntu virtual machine you may need to use software rendering if the hypervisor does not support hardware acceleration for OpenGL 4.2+. Install `mesa-utils` to enable llvmpipe:\n\n```bash\nsudo apt-get install mesa-utils\n```\n\nTo use the llvmpipe software renderer, prefix Gazebo commands with the `LIBGL_ALWAYS_SOFTWARE` environment variable:\n\n```bash\nLIBGL_ALWAYS_SOFTWARE=1 gz sim waves.sdf\n```\n\n## Examples\n\nOn macOS the client and server must be launched separately. The commands may be combined on Ubuntu.\n\nLaunch a Gazebo session.\n\nServer:\n\n```bash\ngz sim -v4 -s -r waves.sdf\n```\n\nClient:\n\n```bash\ngz sim -v4 -g\n```\n\nThe session should include a wave field and some floating objects.\n\n## Changes\n\nThere are some changes to the plugin SDF schema for hydrodynamics and waves.   \n\n### Waves model and visual plugins\n\n- The `filename` and `name` attributes for the wave model and visal plugins have changed.\n- The `\u003csize\u003e` element has been renamed to `\u003ctile_size\u003e` and moved into `\u003cwaves\u003e`\n- The `\u003ccell_count\u003e` element has been moved into `\u003cwaves\u003e`\n- Add new element `\u003calgorithm\u003e` to specify the wave generation algorithm. Valid options are: `sinusoid`, `trochoid` and `fft`.\n- Add new element `\u003cwind_velocity\u003e` for use with the `fft` algorithm.\n- Add new element `\u003cwind_speed\u003e` for use with the `fft` algorithm.\n- Add new element `\u003cwind_angle_deg\u003e` for use with the `fft` algorithm.\n\n```xml\n\u003cplugin\n    filename=\"gz-waves1-waves-model-system\"\n    name=\"gz::sim::systems::WavesModel\"\u003e\n    \u003cstatic\u003e0\u003c/static\u003e\n    \u003cupdate_rate\u003e30\u003c/update_rate\u003e\n    \u003cwave\u003e\n      \u003c!-- Grid dimensions\n        - The tile_size and cell_count may be a single value\n          for square grids, or a 2d vector if different resolution\n          is desired along the x and y axis.\n        - The cell_count must be a power of 2 for fft waves\n      --\u003e\n      \u003c!-- Either: single value for square grids --\u003e\n      \u003ctile_size\u003e256.0\u003c/tile_size\u003e\n      \u003ccell_count\u003e128\u003c/cell_count\u003e\n\n      \u003c!-- Or: 2d vectors for different resolution in each axis --\u003e\n      \u003ctile_size\u003e256.0 64.0\u003c/tile_size\u003e\n      \u003ccell_count\u003e128 32\u003c/cell_count\u003e\n\n      \u003c!-- Wave algorithms\n        - These elements specify the wave generation method\n          and wave spectrum parameters.\n      --\u003e\n\n      \u003c!-- Either: `fft` waves parameters --\u003e\n      \u003calgorithm\u003efft\u003c/algorithm\u003e\n      \u003cwind_speed\u003e5.0\u003c/wind_speed\u003e\n      \u003cwind_angle_deg\u003e135\u003c/wind_angle_deg\u003e\n      \u003csteepness\u003e2\u003c/steepness\u003e\n\n      \u003c!-- Or: `trochoid` waves parameters --\u003e\n      \u003calgorithm\u003etrochoid\u003c/algorithm\u003e\n      \u003cnumber\u003e3\u003c/number\u003e\n      \u003cscale\u003e1.5\u003c/scale\u003e\n      \u003cangle\u003e0.4\u003c/angle\u003e\n      \u003camplitude\u003e0.4\u003c/amplitude\u003e\n      \u003cperiod\u003e8.0\u003c/period\u003e\n      \u003cphase\u003e0.0\u003c/phase\u003e\n      \u003csteepness\u003e1.0\u003c/steepness\u003e\n      \u003cdirection\u003e1 0\u003c/direction\u003e\n    \u003c/wave\u003e\n\u003c/plugin\u003e\n```\n\nThe waves visual plugin has the same algorithm elements as the model plugin and extra elements to control the shading algorithm. Two approaches are available:\n\n  - `DYNAMIC_GEOMETRY` uses PBS shaders and is suitable for small areas.\n  - `DYNAMIC_TEXTURE` uses a custom shader and is suitable for tiled areas.\n\n```xml\n\u003cplugin\n    filename=\"gz-waves1-waves-visual-system\"\n    name=\"gz::sim::systems::WavesVisual\"\u003e\n  \u003cstatic\u003e0\u003c/static\u003e\n\n  \u003c!-- set the mesh deformation method  --\u003e\n  \u003cmesh_deformation_method\u003eDYNAMIC_GEOMETRY\u003c/mesh_deformation_method\u003e\n\n  \u003c!-- number of additional tiles along each axis --\u003e\n  \u003ctiles_x\u003e-1 1\u003c/tiles_x\u003e\n  \u003ctiles_y\u003e-1 1\u003c/tiles_y\u003e\n  \u003cwave\u003e\n    \u003c!-- `fft` wave parameters --\u003e\n    \u003calgorithm\u003efft\u003c/algorithm\u003e\n    \u003ctile_size\u003e256.0\u003c/tile_size\u003e\n    \u003ccell_count\u003e128\u003c/cell_count\u003e\n    \u003cwind_speed\u003e5.0\u003c/wind_speed\u003e\n    \u003cwind_angle_deg\u003e135\u003c/wind_angle_deg\u003e\n    \u003csteepness\u003e2\u003c/steepness\u003e\n  \u003c/wave\u003e\n\n  \u003c!--\n    Shader parameters only apply when using DYNAMIC_TEXTURE\n  --\u003e\n\n  \u003c!-- shader program --\u003e\n  \u003cshader language=\"glsl\"\u003e\n    \u003cvertex\u003ematerials/waves_vs.glsl\u003c/vertex\u003e\n    \u003cfragment\u003ematerials/waves_fs.glsl\u003c/fragment\u003e\n  \u003c/shader\u003e\n  \u003cshader language=\"metal\"\u003e\n    \u003cvertex\u003ematerials/waves_vs.metal\u003c/vertex\u003e\n    \u003cfragment\u003ematerials/waves_fs.metal\u003c/fragment\u003e\n  \u003c/shader\u003e\n\n  \u003c!-- vertex shader params --\u003e\n  \u003cparam\u003e\n    \u003cshader\u003evertex\u003c/shader\u003e\n    \u003cname\u003eworld_matrix\u003c/name\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003evertex\u003c/shader\u003e\n    \u003cname\u003eworldviewproj_matrix\u003c/name\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003evertex\u003c/shader\u003e\n    \u003cname\u003ecamera_position\u003c/name\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003evertex\u003c/shader\u003e\n    \u003cname\u003erescale\u003c/name\u003e\n    \u003cvalue\u003e0.5\u003c/value\u003e\n    \u003ctype\u003efloat\u003c/type\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003evertex\u003c/shader\u003e\n    \u003cname\u003ebumpScale\u003c/name\u003e\n    \u003cvalue\u003e64 64\u003c/value\u003e\n    \u003ctype\u003efloat_array\u003c/type\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003evertex\u003c/shader\u003e\n    \u003cname\u003ebumpSpeed\u003c/name\u003e\n    \u003cvalue\u003e0.01 0.01\u003c/value\u003e\n    \u003ctype\u003efloat_array\u003c/type\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003evertex\u003c/shader\u003e\n    \u003cname\u003et\u003c/name\u003e\n    \u003cvalue\u003eTIME\u003c/value\u003e\n  \u003c/param\u003e\n\n  \u003c!-- pixel shader params --\u003e\n  \u003cparam\u003e\n    \u003cshader\u003efragment\u003c/shader\u003e\n    \u003cname\u003edeepColor\u003c/name\u003e\n    \u003cvalue\u003e0.0 0.05 0.2 1.0\u003c/value\u003e\n    \u003ctype\u003efloat_array\u003c/type\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003efragment\u003c/shader\u003e\n    \u003cname\u003eshallowColor\u003c/name\u003e\n    \u003cvalue\u003e0.0 0.1 0.3 1.0\u003c/value\u003e\n    \u003ctype\u003efloat_array\u003c/type\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003efragment\u003c/shader\u003e\n    \u003cname\u003efresnelPower\u003c/name\u003e\n    \u003cvalue\u003e5.0\u003c/value\u003e\n    \u003ctype\u003efloat\u003c/type\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003efragment\u003c/shader\u003e\n    \u003cname\u003ehdrMultiplier\u003c/name\u003e\n    \u003cvalue\u003e0.4\u003c/value\u003e\n    \u003ctype\u003efloat\u003c/type\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003efragment\u003c/shader\u003e\n    \u003cname\u003ebumpMap\u003c/name\u003e\n    \u003cvalue\u003ematerials/wave_normals.dds\u003c/value\u003e\n    \u003ctype\u003etexture\u003c/type\u003e\n    \u003carg\u003e0\u003c/arg\u003e\n  \u003c/param\u003e\n  \u003cparam\u003e\n    \u003cshader\u003efragment\u003c/shader\u003e\n    \u003cname\u003ecubeMap\u003c/name\u003e\n    \u003cvalue\u003ematerials/skybox_lowres.dds\u003c/value\u003e\n    \u003ctype\u003etexture_cube\u003c/type\u003e\n    \u003carg\u003e1\u003c/arg\u003e\n  \u003c/param\u003e\n\n\u003c/plugin\u003e\n```\n\n### Hydrodynamics plugin\n\n- The `filename` and `name` attributes for the hydrodynamics plugin have changed.\n- The hydrodynamics parameters are now scoped in an additional `\u003chydrodynamics\u003e` element.\n- The buoyancy and hydrodynamics forces can be applied to specific entities\nin a model using the `\u003cenable\u003e` element. The parameter should be a fully\nscoped model entity (model, link or collision name).\n- The `\u003cwave_model\u003e` element is not used.\n\n```xml\n\u003cplugin\n  filename=\"gz-waves1-hydrodynamics-system\"\n  name=\"gz::sim::systems::Hydrodynamics\"\u003e\n\n  \u003c!-- Apply hydrodynamics to the entire model (default) --\u003e\n  \u003cenable\u003emodel_name\u003c/enable\u003e\n\n  \u003c!-- Or apply hydrodynamics to named links --\u003e\n  \u003cenable\u003emodel_name::link1\u003c/enable\u003e\n  \u003cenable\u003emodel_name::link2\u003c/enable\u003e\n\n  \u003c!-- Or apply hydrodynamics to named collisions --\u003e\n  \u003cenable\u003emodel_name::link1::collision1\u003c/enable\u003e\n  \u003cenable\u003emodel_name::link1::collision2\u003c/enable\u003e\n\n  \u003c!-- Hydrodynamics --\u003e\n  \u003chydrodynamics\u003e\n    \u003cdamping_on\u003e1\u003c/damping_on\u003e\n    \u003cviscous_drag_on\u003e1\u003c/viscous_drag_on\u003e\n    \u003cpressure_drag_on\u003e1\u003c/pressure_drag_on\u003e\n\n    \u003c!-- Linear and Angular Damping --\u003e  \n    \u003ccDampL1\u003e1.0E-6\u003c/cDampL1\u003e\n    \u003ccDampL2\u003e1.0E-6\u003c/cDampL2\u003e\n    \u003ccDampR1\u003e1.0E-6\u003c/cDampR1\u003e\n    \u003ccDampR2\u003e1.0E-6\u003c/cDampR2\u003e\n\n    \u003c!-- 'Pressure' Drag --\u003e\n    \u003ccPDrag1\u003e1.0E+2\u003c/cPDrag1\u003e\n    \u003ccPDrag2\u003e1.0E+2\u003c/cPDrag2\u003e\n    \u003cfPDrag\u003e0.4\u003c/fPDrag\u003e\n    \u003ccSDrag1\u003e1.0E+2\u003c/cSDrag1\u003e\n    \u003ccSDrag2\u003e1.0E+2\u003c/cSDrag2\u003e\n    \u003cfSDrag\u003e0.4\u003c/fSDrag\u003e\n    \u003cvRDrag\u003e1.0\u003c/vRDrag\u003e\n  \u003c/hydrodynamics\u003e\n\n  \u003c!-- Control visibility of markers --\u003e\n  \u003cmarkers\u003e\n    \u003cupdate_rate\u003e10\u003c/update_rate\u003e\n    \u003cwater_patch\u003e1\u003c/water_patch\u003e\n    \u003cwaterline\u003e1\u003c/waterline\u003e\n    \u003cunderwater_surface\u003e1\u003c/underwater_surface\u003e\n  \u003c/markers\u003e\n\u003c/plugin\u003e\n```\n\n## Tests\n\n```bash\n# build with tests\n$ colcon build --merge-install --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_MACOSX_RPATH=FALSE -DCMAKE_INSTALL_NAME_DIR=$(pwd)/install/lib -DBUILD_TESTING=ON --packages-select gz-waves1\n\n# run tests\ncolcon test --merge-install \n\n# check results\ncolcon test-result --all --verbose \n```\n\nTesting within a project build directory\n\n```bash\n$ cd ~/gz_ws/src/asv_wave_sim/gz-waves\n$ mkdir build \u0026\u0026 cd build\n$ cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON\n$ make \u0026\u0026 make test\n```\n\n## Plots\n\nPlots may be generated for some of the wave spectra and wave simulation methods:\n\n```bash\n./install/bin/PLOT_WaveSpectrum\n```\n\n## Legacy versions\n\nThere is no plan to back-port new features to Gazebo9 or Gazebo11. The following branches are maintained for legacy support:\n\n- [`gazebo9`](https://github.com/srmainwaring/asv_wave_sim/tree/gazebo9) - for Gazebo9 / ROS Melodic / Ubuntu 18.04 (Bionic).\n\n- [`gazebo11`](https://github.com/srmainwaring/asv_wave_sim/tree/gazebo11) - for Gazebo11 / ROS Noetic / Ubuntu 20.04 (Focal).\n\nIn addition there are three branches that contain development iterations of the FFT wave simulation - for Gazebo11 / ROS Noetic / Ubuntu 20.04 (Focal):\n\n- [`feature/fft-waves-v1`](https://github.com/srmainwaring/asv_wave_sim/tree/feature/fft-waves-v1)\n- [`feature/fft-waves-v2`](https://github.com/srmainwaring/asv_wave_sim/tree/feature/fft-waves-v2)\n- [`feature/fft-waves-v3`](https://github.com/srmainwaring/asv_wave_sim/tree/feature/fft-waves-v3)\n\n\n## License\n\nThis is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the [GNU General Public License](LICENSE) for more details.\n\nThis project makes use of other open source software, for full details see the file [LICENSE_THIRDPARTY](LICENSE_THIRDPARTY).\n\n## Acknowledgments\n\n- Jacques Kerner's two part blog describing boat physics for games: [Water interaction model for boats in video games](https://www.gamasutra.com/view/news/237528/Water_interaction_model_for_boats_in_video_games.php) and [Water interaction model for boats in video games: Part 2](https://www.gamasutra.com/view/news/263237/Water_interaction_model_for_boats_in_video_games_Part_2.php).\n- The [CGAL](https://doc.cgal.org) libraries are used for the wave field and model meshes.\n- The [UUV Simulator](https://github.com/uuvsimulator/uuv_simulator) package for the orginal vertex shaders used in the wave field visuals.\n- The [VMRC](https://bitbucket.org/osrf/vmrc) package for textures and meshes used in the wave field visuals.\n- Jerry Tessendorf's paper on\t[Simulating Ocean Water](https://people.cs.clemson.edu/~jtessen/reports/papers_files/coursenotes2004.pdf)\n- Curtis Mobley's web book [Ocean Optics](https://www.oceanopticsbook.info/) in particular the section on [Modeling Sea Surfaces](https://www.oceanopticsbook.info/view/surfaces/level-2/modeling-sea-surfaces) and [example IDL code](https://www.oceanopticsbook.info/packages/iws_l2h/conversion/files/IDL-SurfaceGenerationCode.zip)  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrmainwaring%2Fasv_wave_sim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrmainwaring%2Fasv_wave_sim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrmainwaring%2Fasv_wave_sim/lists"}