Three.js示例:物理学意义的glsl代码

时间:2018-08-18 09:07:45

标签: three.js glsl simulation physics numerical-methods

在此期间,我正在尝试学习webgl和glsl的工作方式。 在网络搜索中,我发现Three.js提供了一系列非常有用的示例来了解webgl的工作方式。
我举一个例子,我在理解代码的物理含义时遇到了麻烦。 下面是所涉及的代码部分以及与其中一部分的链接。
https://github.com/mrdoob/three.js/blob/master/examples/webgl_gpgpu_water.html

<script id="heightmapFragmentShader" type="x-shader/x-fragment">

        #include <common>

        uniform vec2 mousePos;
        uniform float mouseSize;
        uniform float viscosityConstant;

        #define deltaTime ( 1.0 / 60.0 )
        #define GRAVITY_CONSTANT ( resolution.x * deltaTime * 3.0 )

        void main() {

            vec2 cellSize = 1.0 / resolution.xy;

            vec2 uv = gl_FragCoord.xy * cellSize;

            // heightmapValue.x == height
            // heightmapValue.y == velocity
            // heightmapValue.z, heightmapValue.w not used
            vec4 heightmapValue = texture2D( heightmap, uv );

            // Get neighbours
            vec4 north = texture2D( heightmap, uv + vec2( 0.0, cellSize.y ) );
            vec4 south = texture2D( heightmap, uv + vec2( 0.0, - cellSize.y ) );
            vec4 east = texture2D( heightmap, uv + vec2( cellSize.x, 0.0 ) );
            vec4 west = texture2D( heightmap, uv + vec2( - cellSize.x, 0.0 ) );

            float sump = north.x + south.x + east.x + west.x - 4.0 * heightmapValue.x;

            float accel = sump * GRAVITY_CONSTANT;

            // Dynamics
            heightmapValue.y += accel;
            heightmapValue.x += heightmapValue.y * deltaTime;

            // Viscosity
            heightmapValue.x += sump * viscosityConstant;

            // Mouse influence
            float mousePhase = clamp( length( ( uv - vec2( 0.5 ) ) * BOUNDS - vec2( mousePos.x, - mousePos.y ) ) * PI / mouseSize, 0.0, PI );
            heightmapValue.x += cos( mousePhase ) + 1.0;

            gl_FragColor = heightmapValue;

        }

    </script>

我认识到heightmapValue.x变量表示所考虑的顶点的高度,并且每次由一系列项的总和构成其值。
称为 ,是邻居的高度与顶点本身的高度之差和 波浪 鼠标的影响(转换为正弦曲线趋势,因此永远不会产生负面影响),我们拥有:

heighmapValue.x =(水槽*(重力**增量时间))+(水槽*粘度)+波浪

问题:
1.为什么将重力常数乘以3(常数定义)?
2.为什么加上粘度项而不是减去它?

也许我错过了一些东西,但我不明白是什么。

0 个答案:

没有答案