Benchmark AI / Public workspace
LongBench v2 / 66eefe85821e116aacb228dc / These are two articles about grassland simulation. The first article is…
Problem
Answer published by the source. Consult the official source to check your work against its answer.
choice A
In the first article, some unimportant leaves were removed to save performance, and the second article use LOD (detail level) algorithm for performance optimization.
choice B
The second article emphasizes the undulation of the grass by using color changes in different bent states, while the first article does not use this method.
choice C
The first article calculates leaf displacement using natural elements as coefficients, while the second article uses fluid simulation to calculate wind forces that bend the leaves.
choice D
The first article can simulate wind in a certain direction or specific wind source, while the second article can simulate the effects of wind fields in multiple directions on grasslands and allow users to freely customize wind effects.
context · full text (118,549 characters)
Responsive Real-Time Grass Rendering for General 3D Scenes Klemens Jahrmann∗ Michael Wimmer† TU Wien TU Wien Figure 1: This figure shows an example of our rendering technique. The collision reaction is visible at the trail of the bowling ball. The right side is rendered in wireframe mode to show the accuracy of our occlusion culling method. Abstract Grass plays an important role in most natural environments. Most interactive applications use image-based techniques to approximate fields of grass due to the high geometrical complexity, leading to vi- sual artifacts. In this paper, we propose a grass-rendering technique that is capable of drawing each blade of grass as geometrical ob- ject in real time. Accurate culling methods together with an adapt- able rendering pipeline ensure that only the blades of grass that are important for the visual appearance of the field of grass are ren- dered. In addition, we introduce a physical model that is evaluated for each blade of grass. This enables that a blade of grass can react to its environment by calculating the influence of gravity, wind and collisions. A major advantage of our approach is that it can ren- der fields of grass of arbitrary shape and spatial alignment. Thus, in contrast to previous work, the blades of grass can be placed on any 3D model, which is not required to be a flat surface or a height map. Keywords: real-time rendering, vegetation, hardware tessellation Concepts: •Computing methodologies →Rendering; Physical simulation; Visibility; 1 Introduction Rendering outdoor scenes is an important task for many interac- tive applications. Almost all of these outdoor scenes contain grass ∗e-mail:klemens.jahrmann@net1220.at †e-mail:wimmer@cg.tuwien.ac.at Permission to make digital or hard copies of all or part of this work for per- sonal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for components of this work owned by others than the author(s) must be honored. Abstract- ing with credit is permitted. To copy otherwise, or republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Request permissions from permissions@acm.org. c ⃝2017 Copyright held by the owner/author(s). Publication rights licensed to ACM. I3D ’17, February 25 - 27, 2017, San Francisco, CA, USA ISBN: 978-1-4503-4886-7/17/03 DOI: http://dx.doi.org/10.1145/3023368.3023380 or grass-like vegetation. Due to the high geometrical complex- ity, fields of grass are often rendered using billboards or other image-based techniques. However, image-based techniques have the drawback that the realism depends on the position and the viewing direction of the camera. To remedy this, modern grass- rendering techniques draw each blade of grass as geometrical ob- ject. While this enables the animation of each blade according to its environment, it also requires acceleration structures to handle the high amount of geometrical objects. Therefore, most of these techniques use hardware instancing to draw patches of grass in a grid-based data structure. This limits the shape of a field of grass to height fields, which is a problem since many terrains are not equiv- alent to height maps. In this paper, we propose a rendering technique that is capable of rendering fields of grass on arbitrary 3D models by drawing each blade of grass as geometrical object indexed by a geometry-agnostic acceleration structure. For the rendering of each blade, we use hardware tessellation to apply dynamic level of detail, and the shape of a blade is defined by an analytic function. Each blade of grass is influenced by environmental forces, like gravity, wind and col- lisions with both simple and complex objects. In addition, several culling methods ensure that only those blades are rendered that have an impact on the visual appearance of the field of grass. In addition to standard occlusion culling, we also use the orientation and the distance to the camera as culling criteria. All of these computations are carried out completely on the GPU through indirect rendering, avoiding costly round-trips between CPU and GPU. 2 Previous Work Current grass-rendering techniques can can be divided into image- based, geometric and hybrid approaches. Image-based rendering techniques are used most often in interactive applications because they are fast. Most of these techniques draw billboards with semi- transparent grass textures. The billboards can be camera-facing [Whatley 2005] or arranged in star-shaped clusters [Pelzer 2004]. Orthmann et al. [2009] introduce a billboard technique that is able to react to collisions with complex objects. Other image-based tech- niques use transparent texture slices that are placed in a grid [Habel et al. 2007]. The major drawback of all image-based techniques is that the visual quality is different when viewed from different angles. In addition, wind animation and reaction to collisions can heavily distort the used textures, which leads to rendering artifacts and lack of realism. Similar to our rendering technique, there are several methods that draw single blades of grass as geometrical objects. Most of them draw patches that consist of many blades of grass multiple times using hardware instancing. However, this requires that the field of grass is placed on a height map, which limits the field of applica- tion. The advantage of geometric methods is that each blade can be individually influenced by its environment. This influence can be processed in different ways. A skeleton [Wang et al. 2005] can be added to each blade of grass that can be animated to simulate wind effects. Another approach simulates collisions using wave calculations [Chen and Johan 2010]. Jahrmann et al. [2013] trans- late the tip of a blade of grass according to a wind animation and use image-based methods to approximate collisions. More sophis- ticated collisions are introduced by Fan et al. [2015], who evaluate collisions between single blades of grass and spheres. However, the wind is calculated separately using an analytic function. In contrast to these methods, our rendering technique is not limited to height maps. Furthermore, a single consistent physical model is evaluated for each blade of grass to calculate natural forces like gravity or wind, and collisions with both simple and complex objects, while no previous method combines all these effects. An alternative to pure geometry-based or image-based rendering is to draw a billboard only as a proxy geometry and evaluate the exact curve geometry in the fragment shader [Loop and Blinn 2005], however, this was not implemented for grass yet. Finally, Boulanger et al. [2009] propose a hybrid grass-rendering technique that uses both geometric and image-based approaches as different static level-of-detail stages. Grass that is near the camera is drawn as geometric objects, whereas grass that is further away is drawn by rendering multiple horizontal and vertical texture slices. This ap- proach is able to render realistic images in real time, and was used in production video games such as Madden NFL 25 (EA Sports R ⃝). However, the blades of grass are static and cannot react to colli- sions or natural forces. The idea of multiple level-of-detail stages can be added to our approach as future work to further increase the rendering performance. 3 Overview In a preprocessing phase, the blades of grass are distributed on the surface of a 3D model, and subsequently divided into mul- tiple patches, where each patch contains approximately the same number of blades. Note that the patches can have arbitrary shapes and alignments, since they are only container objects of individual blades of grass. During the rendering of each image, three steps are performed: 1. The physical model is evaluated for each blade of grass. 2. The culling methods cull the blades that are not important for the final rendering, based on occlusions and the orientation and distance of the blade to the camera. 3. Each blade of grass is rendered as tessellated geometric object using an indirect rendering approach. The following sections describe each step in detail. 4 Preprocessing During the preprocessing step, the blades of grass are generated on the surface of a 3D model and the patches are generated from these Figure 2: Illustration of the definition of a blade of grass. blades. We start by introducing our model for a single blade of grass. Grass blade model In our system, a blade of grass consists of three vertices, v0...2, which are the control points of a quadratic B´ ezier curve. The first control point v0 indicates the fixed position of the blade of grass, v2 is moved according to the physical model described in the next section, and v1 is positioned according to v2. In addition, a blade of grass has several further attributes: height, width, stiffness coefficient, up-vector and direction angle, which in- dicates the alignment of the blade on the local plane defined by the up-vector. Altogether, a blade of grass can be completely described by four 4D vectors. An illustration of a blade of grass is shown in Figure 2. Grass distribution During the generation of the blades of grass, either single blades or whole tufts of grass can be generated. The amount of blades that are generated is defined by a user-defined density value and the total area of the 3D model. In case of gen- erating tufts of grass, we use Poisson-disk sampling on the surface [Cline et al. 2009] to ensure that the tufts are not clumped together. The blades of a tuft are placed randomly in the vicinity of the tuft center, and orientation and attributes are also assigned randomly within certain ranges. In case of generating single blades of grass, the blades are distributed randomly on the surface of the 3D model, without Poisson-disk sampling, since random clumping of blades is beneficial for a natural grass distribution. Single-blade seeding is good for covering fields of grass with equal density, whereas tuft seeding generates a more natural grass distribution. Therefore, a re- alistic meadow can be generated using a combination of both seed- ing methods. Each blade of grass is generated in an initial pose where the control points v1 and v2 share the same position, which is above the ground position v0 according to the height and the up- vector. Patch generation After the blades of grass have been generated, patches are formed. The number of patches generated from the blades is crucial for the performance of our rendering algorithm, and the optimal number depends on the graphics hardware. The evaluation of the physical model and culling will be performed using compute shaders. To maximize parallelism, the number of blades in a patch should therefore be (1) the same in all patches and (2) allow maximum occupancy in compute shader dispatches. In practice, we use a multiple of the maximum number of workgroup invocations reported by the hardware. Furthermore, the shape of a patch should be as compact and rectangular as possible to achieve a tight bounding box, which improves the effectiveness of culling. Splitting the blades into compact and equally sized patches can be seen as balanced clustering problem [Malinen and Fr¨ anti 2014], which has the constraint of equal-element clusters. The balanced clustering problem can be efficiently solved using linear program- ming or graph-theoretical approaches. In our case, the elements are the blades of grass, the resulting clusters are the patches and the metric used for clustering is proximity. For measuring the proxim- ity, we use the Euclidean and the Manhattan distance metrics. After the division into patches, the blades of each patch are sorted to en- sure that nearby blades have similar indices, which is necessary for our algorithm. Currently, a simple lexicographical sort according to the coordinates has proven efficient, although more sophisticated sorting algorithms (like Morton order) could be investigated. 5 Physical Model Our physical model simulates natural forces and collisions with other objects, represented as collections of spheres, and is evalu- ated for each blade of grass separately for highest realism. Figure 3 shows an illustration of the different influences. The calculations are performed completely on the graphics card using a compute shader. In order to allow free movement for a blade of grass, the forces first manipulate only the tip of the blade (v2), followed by three correction steps to achieve a valid state for the blade. This validation procedure is explained in Section 5.2. The translation ⃗ δ of v2 is calculated by using three natural forces (recovery r, gravity g and wind w) and a displacement d caused by collisions. The forces are applied to the translation by a heuristic. This heuristic uses the natural forces directly as displacement that is normalized by a time interval ∆t, which corresponds to the time required for the last frame. The collision reaction is already calcu- lated as displacement and must not be normalized. This leads to a reaction of the blade to the environment that is independent of the frame rate. ⃗ δ = (r + g + w) ∆t + d (1) The final translation is saved in a texture, called force map, where each blade of grass has a distinct texel. In addition, the fourth di- mension of a texel in the force map saves the strength of the col- lisions that influence this blade of grass. This collision strength is used in later frames to have a persistent crippling effect of collisions on each blade of grass. Over the time, this value decreases, which makes the blade stand up after some time if no further collisions are detected. In order to simulate the fading over time of the collision strength η, we multiply a constant user-defined amount of decrease a with ∆t: η = max (c −a∆t, 0) (2) 5.1 Natural Forces In our physical model, we consider three different natural forces: recovery, gravity and wind. Most related algorithms, like Fan et al. [2015], focus more on collisions than on the natural forces and only simulate wind by procedurally modifying the geometry during the rendering. Recovery The recovery force is the counterforce to previously applied forces, which follows Hooke’s law. It is directed towards the initial pose of the blade of grass Iv2 and its strength depends on the stiffness coefficient s of the blade. In order to simulate the crippling effect of a blade, the collision strength η is added to the equation to suppress the effect of the recovery force r. r = (Iv2 −v2) s max (1 −η, 0.1) (3) Figure 3: Illustration of the different influences that are considered in the physical model. Gravity The influence of gravity on a blade of grass consists of two additive forces. One force represents the gravity of the whole scene. We call this influence the environmental gravity, gE. In order to be adaptable to various scenes, the environmental gravity can be represented in two different ways: It can be a global gravity direction that is the same for the whole scene, or it can be a gravity center to which all gravity forces point. In practice, we allow both representations to be used simultaneously and interpolate them with a user-defined parameter t: gE = m Dxyz ∥Dxyz∥Dw (1 −t) + Cxyz −v0 Cxyz −v0 Cw t (4) In this equation, m is the mass of a blade and D is the four- dimensional gravity direction, where the fourth component indi- cates the gravitational acceleration. In the same way, C is the cen- ter of a gravity force. The vector of the other influencing force is orthogonal to the width of the blade of grass. Based on the direc- tion of this influence, we call it front gravity, gF . This simulates the elasticity of a blade of grass, which causes the tip of the grass being bent by the influence of the gravity. The strength of gF depends on the strength of gE, which is expressed in the following equation: gF = 1 4 ∥gE∥f, (5) where f indicates the front direction that is perpendicular to the width of the blade. The total gravity force g is computed by the sum of both gravity forces: g = (gE + gF ) (6) Wind The third natural force is the wind influence, which is com- puted by using analytic functions that represent wind waves moving through 3D space. The influence of this wind wave on a single blade of grass depends on three criteria: the direction and strength of the wind wave at the position of the blade of grass, and the alignment of the blade towards the wind wave. Thus, the analytic wind function is responsible for computing a vector wi (v0) that represents the direction and the strength of the wind influence at the position of a blade of grass. The analytic functions can be modeled heuristically using multiple sine and cosine functions with different frequencies. This can simulate wind coming from some direction or a specific source, like a helicopter or a fan. Figure 4 shows some examples of Figure 4: This figure shows the results of two different wind func- tions in 2D space. The height of the red surface indicates the strength of the wind at the respective position and the black ar- rows illustrate the direction of the influence as well as the move- ment of the wind wave. The upper function simulates a common wind comming from a direction, whereas the lower function shows the influence of a specific wind source. 2D representations of wind functions. The alignment of the blade towards the wind wave is developed following two ideas: First, a blade of grass that is standing in its straight position should be influ- enced more by the wind than a blade that is pushed to the ground. In addition, if the direction of the force caused by the wind is directed along the width of the blade, the influence should be less than if the direction of the wind is orthogonal to the blade. Thus, the align- ment value θ (wi (v0) , h) consists of two factors: the directional alignment fd (wi (v0)) towards the wind influence wi (v0) and the height ratio fr (h) that indicates the straightness of the blade with respect to the up-vector up. fd (wi (v0)) = 1 − wi (v0) ∥wi (v0)∥· v2 −v0 ∥v2 −v0∥ fr (h) = (v2 −v0) · up h θ (wi (v0) , h) = fd (wi (v0)) fr (h) (7) Finally, the resulting wind force on a blade of grass is defined by the following equation: w = wi (v0) θ (wi (v0) , h) (8) 5.2 State Validation A valid state of a blade of grass is defined by three conditions: v2 must not be pushed beneath the ground, the position of v1 has to be set according to the position of v2, and the length of the curve must be equal to the height of the blade of grass. These conditions have to be fulfilled for a blade of grass before it is used for collision detection or rendering. Since it would require too much time to check whether v2 is pushed inside the underlying 3D model, we assume that the surface is a plane defined by the up-vector of the blade locally. By this assump- tion, a position of v2 above the local plane can be ensured by a single equation: v2 = v2 −up min (up · (v2 −v0) , 0) , (9) where up represents the up-vector of the blade. After a valid position for v2 is found, the position of v1 can be calculated. This position is constrained to be always above v0 ac- cording to the up-vector of the blade. For the position calculation, Figure 5: Illustration of the relation between v1 and v2. The dif- ferent colors symbolize different states of the blade of grass. the length of the vector from v0 to v2 projected onto the ground plane lproj is computed: lproj = ∥v2 −v0 −up ((v2 −v0) · up)∥, (10) where up is the up-vector of the blade. If this length is zero, v2 rests in the idle position and v1 has the same position. Otherwise, the more v2 is pushed away from the idle position the lower is the position of v1. However, in order to ensure that the blade of grass always has at least a slight curvature, the position of v1 is never the same as the position of v0. This is illustrated in Figure 5 and can be calculated using the following equation: v1 = v0+h up max 1 −lproj h , 0.05 max lproj h , 1 , (11) where h is the height of the blade, up its up-vector and 0.05 is the constant factor to ensure that the position of v1 is not equal to the position of v0. The last validation step has to ensure that the length of the B´ ezier curve is not larger than the height of the blade. Without this step, the length of a blade of grass would not be consistent if it is influenced by forces, which is a major drawback of the algorithm of Jahrmann et al. [2013]. However, calculating and correcting the length of a curve precisely for each blade of grass requires too much time. Therefore, we use an approximation for the length L of a Bezier curve of degree n [Gravesen 1993]: L = 2L0 + (n −1) L1 n + 1 , (12) where L0 indicates the distance between the first and the last control point and L1 is the sum of all distances between a control point and its subsequent one. After the length of the curve is measured, the ratio r between the height of the blade and the measured length is calculated. Finally, the correction of the length is performed by multiplying each segment between the control points with r, which is shown in Equation 13, where v1corr respectively v2corr are the corrected positions of the control points. r = h L v1corr = v0 + r (v1 −v0) v2corr = v1corr + r (v2 −v1) (13) 5.3 Collision In order to simulate natural behavior of a blade of grass, it has to be able to react to its environment. Therefore, we detect and react to Figure 6: Illustration of two possible collisions between a blade of grass and a sphere. collisions for each blade of grass separately. We use spheres as ob- ject representation, which allows fast calculation with a low mem- ory footprint since a sphere can be completely defined by a 4D vec- tor. Thus, complex objects have to be approximated using spheres. In our application, we use a sphere-packing approach [Weller and Zachmann 2010] to generate the sphere representation, but repre- sentations with overlapping spheres [Stolpner et al. 2012] should be applicable as well. Since it would require too much time to mea- sure the exact intersection between a curve and a sphere, we use two points for the calculations, which are v2 and the center point m of the curve, which can be computed using curve interpolation: m = 1 4v0 + 1 2v1 + 1 4v2 (14) However, our physical model can only modify v2. Thus, a collision reaction of m has to be translated to a reaction of v2, which can be easily achieved by multiplying the translation vector by 4. In order to detect a collision, we test whether one of the two points is inside the sphere. If a collision is detected, the reaction is the translation of the point to the nearest point on the surface of the sphere. Both steps can be formulated by a single equation: d = min (∥c −p∥−r, 0) c −p ∥c −p∥, (15) where d is the resulting translation, p is the point that is tested and c and r represent the center position and the radius of the sphere. Figure 6 shows an illustration of the collision calculation. Each time a collision is detected, the squared length of the translation is added to the collision strength η, which is stored in the force map for the following frame: η = η + d · d (16) 6 Rendering For rendering a field of grass, we draw each blade as a tessellated 2D object. Similar to the method of Jahrmann et al. [2013], we use the tessellation pipeline to provide dynamic level of detail to the shape of a blade. However, instead of using an alpha texture to create the shape of the blade, we use analytic functions that directly modify the geometry, which is explained in Section 6.3. Since each blade of grass has its individual state and position, we cannot render multiple instances of a single patch. In order to achieve real-time performance, we use culling on the basis of single blades to render only the blades that have an impact on the appearance of the field of grass. The culling of single blades requires a rendering pipeline that allows a varying amount of geometry to be rendered each frame. Therefore, we use an indirect rendering approach, which is de- scribed in the following section. 6.1 Indirect Rendering In contrast to common direct rendering, an indirect rendering call does not include the parameters of the draw command. Instead, the parameters are read from a buffer in GPU memory. This en- ables the parameter buffer to be modified inside a compute shader without synchronizing with the CPU. In our technique, we use a compute shader to cull unwanted blades of grass. The definition of an unwanted blade of grass is given in the following section. Each blade that is not culled increases the object count of the parameter buffer and writes its index to an index buffer. 6.2 Culling Culling is performed in two steps. First, the bounding box of the patches are tested against the camera’s view frustum. Note that in preprocessing, bounding-box calculation takes the potential blade movement into account to avoid false positives. Then, each blade of grass of visible patches is tested based on occlusions by other objects and its orientation and distance to the camera. This leads to four tests that each blade has to pass to be rendered. These tests are explained in the following. Orientation test This test culls a blade based on its orientation towards the camera. This is important due to the pseudo three- dimensionality of a blade of grass, as it has no thickness. Thus, blades that are approximately parallel to the viewing direction can cause unwanted aliasing artifacts since their projected pixel width is less than the size of a pixel. Therefore, we calculate the absolute value of the cosine of the angle between the viewing direction dirc and the vector along the width of the blade dirb and cull the blade if this value exceeds 0.9. 0.9 > |dirc · dirb| →blade culled (17) View-frustum test The second test checks whether a blade is in- side the camera’s view frustum. Since it is impossible to test each point on the blade against the view frustum, we only consider three points (v0, midpoint of the curve m and v2) and add some toler- ance to the calculation. The calculation of m is shown in Equation 14. In order to test a point against the view frustum, we project the point to normalized device coordinates using the view-projection matrix VP and homogenous coordinates. After the projection, the test can be performed by comparing the x-, y- and z-coordinates with the homogenous coordinate. This is shown in the following equation for some point p, where p′ indicates the normalized de- vice coordinates of the point, t is a small tolerance value and h is the homogenous coordinate with added tolerance. The boolean result v indicates if a point is inside the view frustum. If the test results in false for all three points, the blade is culled. p′ = VP p h = p′ w + t v = p′ x ∈[−h, h] ∧p′ y ∈[−h, h] ∧p′ z ∈[−h, h] (18) As an optimization, this test could be omitted for patches that are fully inside the view frustum. Distance test The third test culls blades of grass according to their distance towards the camera. This is important since a field of grass appears to be more dense near the horizon due to perspective. This high density can cause two problems during the rendering. First, due to the lower precision of depth values in the distance, z- fighting can occur. Second, blades at high distances are smaller than Figure 7: Illustration of the effect of the occlusion test in wireframe mode. The left image is rendered with occlusion test, the right one without. a pixel, which can cause aliasing artifacts. Note that the density increase due to perspective is stronger near the horizon than when the field of grass is viewed from above. Therefore, the distance from the camera to the blade of grass is projected onto the local plane defined by the up-vector before it is used for distance culling: dproj = ∥v0 −c −up ((v0 −c) · up)∥, (19) where dproj is the projected distance, c is the position of the cam- era and up the blade’s up-vector. According to this distance, the blade is classified into one of n distance levels, which are evenly distributed over the interval [0, dmax], where dmax is a user-defined maximum distance. The lowest level culls no blades. The second- lowest level culls one out of n blades, etc., until the nth level culls all blades. In order to determine which blades of the same distance level are culled, the index id of each blade is used, which is shown in the following inequality: id mod n < n 1 −dproj dmax →blade culled (20) The distance test assumes that nearby blades have similar indices. Thus, the blades must not be indexed in an arbitrary way, otherwise the distance test can introduce bare spaces. This is ensured by the patch generation algorithm, which is described in Section 4. Occlusion test The last test checks whether a blade of grass is occluded by another object. Similar to the view-frustum test, this test is applied to three points of the curve, which are projected to screen coordinates. These coordinates are used to sample a previ- ously generated texture that represents the linear depth values of opaque scene objects. The sampled depth values are compared to the blade’s distance to the camera. If the depth value is smaller, the blade of grass is culled. Similar to the problems of shadow mapping [Everitt et al. 2001], unwanted artifacts can appear from aliasing if the sampled depth values refer to surfaces which are not perpendicular to the viewing direction. Therefore, a small bias has to be added to the depth values. Figure 7 shows the result of the occlusion test. 6.3 Blade Geometry During rendering, each blade is drawn as 2D object positioned in 3D space. The generation of the shape of a blade is performed in the tessellation evaluation shader, which is uses the information of the hardware-tessellation unit to position the generated vertices. Initially, the blade geometry is a flat quad that is defined by the interpolation parameters u and v, where u indicates the interpola- tion along the width of the blade and v the interpolation along the height. By evaluating the curve interpolation of the control points for each generated vertex, the quad becomes aligned to the B´ ezier Figure 8: Illustration of the four basic shapes: quad, triangle, quadratic and triangle-tip. The red and green dotted lines repre- sent the positions of c0 and c1. curve. This is achieved by using De Casteljau’s algorithm [Farin and Hansford 2000], which also calculates the tangent vector t0 as intermediate results. The bitangent t1 is given directly by the di- rection vector along the width of the blade, which is calculated in advance. With the two tangent vectors, the normal n can be com- puted by using the cross product. These calculations are shown in the following equation, where c is the curve point using interpola- tion parameter v and c1 and c2 are the two resulting curve points that span the width w of the blade. In addition, a respectively b are auxiliary vectors. a = v0 + v (v1 −v0) b = v1 + v (v2 −v1) c = a + v (b −a) c0 = c −wt1 c1 = c + wt1 t0 = b −a ∥b −a∥ n = t0 × t1 ∥t0 × t1∥ (21) In order to apply more sophisticated shapes to the blade of grass, we use analytic functions to calculate the final position of the generated vertices. The input of these functions are the interpolation parame- ters u and v generated by the tessellation, the resulting curve points c0 and c1, and the normal vector n. The parameter u can only have the distinct values 0, 0.5 and 1, where a value of 0.5 indicates the middle axis of the blade. The specific values of v that are inside the interval [0, 1] depend on the grade of the tessellation. In the follow- ing, we present four basic shapes, which are illustrated in Figure 8. In addition, we also show the possibility to create complex shapes with analytic functions by introducing a function that represents a dandelion leaf. Furthermore, two additional features can be added to the shape of a blade, which are a 3D displacement and a width correction that reduces aliasing for tipped shapes by forcing a quad shape if the width becomes too small due to perspective. Basic shapes The position p of a vertex for a basic shapes is computed by interpolating between the two curve points c0 and c1 using an interpolation parameter t that depends on u and v: p = (1 −t) c0 + tc1, (22) The quad shape simply uses the parameter u as interpolation pa- rameter, t = u, so that either c0, c or c1 is emitted. The trian- gle’s interpolation parameter is calculated by applying the equa- tion: t = u + 0.5v −uv. The quadratic shape is formed like a quad on one side and like a parabola on the other side. This is achieved by using the parameter t = u −uv2. Finally, the triangle-tip shape is a combination of a quad near the ground and Figure 9: Illustration of the dandelion shape. The left image repre- sents the graph of the analytic dandelion function, where the x-axis represent v and the y-axis represent u. The different colors cor- respond to different tessellation levels. The right image shows a rendering of a dandelion tuft. a triangle further up. The border between these two shapes is de- fined by a threshold τ, which is in the interval [0, 1). The inter- polation parameter for this shape is calculated using the equation t = 0.5 + (u −0.5) 1 −max(v−τ,0) 1−τ . Dandelion In the same way as the basic shapes, the dandelion function interpolates between c0 and c1. The interpolation param- eter is calculated by a complex equation that uses trigonometric functions that we developed heuristically. Figure 9 shows an illus- tration of the graph of this function together with a rendered image of a dandelion leaf. In order to not lose any spikes due to aliasing when the tessellation level is low, the tessellation level is included in the equation. 3D displacement The 3D displacement is an additional feature that can be added to the shape of a blade, where the middle axis of the blade is translated along the normal vector, resulting in a “v”- shape in its cross-section. If the shape has a tip, it is important that the translation has to decrease the nearer the generated point is to the top. Otherwise, the blade has a depth but no width at the tip. Equation 23 shows the calculation of the displacement vector d, where n is the normal vector and w the width of the blade. By adding this displacement, the shape has approximately a right angle and the unfolded width of the blade increases by the factor √ 2. d = w n (0.5 −|u −0.5| (1 −v)) (23) Width correction When rendering blades at greater distance, es- pecially tipped shapes can be thinner than the size of a pixel, which can lead to aliasing artifacts. This effect can be reduced by mod- ifying the interpolation parameter of the respective shape with a correction value based on the width in pixels, so that blades of grass at far distances are rendered as quads regardless of the cho- sen shape. The pixel width of the blade is calculated in four steps. First, the curve points are transformed to screen coordinates in the range [0, 1]. Second, the difference between these screen coordi- nates is calculated. Third, this difference vector is multiplied with the screen resolution. Finally, the length of the difference vector wp represents the width of the blade in pixels. The correction value Φ can be calculated with respect to two constant values, wmin and wspan. The value of wmin indicates the minimum width for a blade. If the width of a blade is smaller than or equal to wmin, Φ is equal to one, which enforces the blade to be shaped as a quad. If Φ is equal to zero, the interpolation of the shape is not influenced at all. The second value wspan indicates the length of the interval, in which the shape is corrected. Thus, if wmin is set to 1 and wspan is set to 2, the shape of all blades having a pixel size in the range [0, 3] are corrected. The following equation shows the calculation of Φ and how it is applied to the shape’s interpolation parameter t: Φ = 1 −min max wp −wmin wspan , 0 , 1 t = t (1 −Φ) + u Φ2 (24) 7 Results In this section, we present the results of our rendering technique and compare them to related algorithms. The evaluation of our results is based on visual appearance, elapsed time on the graph- ics card and the total time required for a frame. The results are rendered in a testing framework that focuses on the geome- try and the animation of the field of grass, but lacks additional photo-realistic rendering techniques that are common in modern engines like shadows, ambient occlusion or atmospheric effects. Note, however, that this is not a limitation of the method: since the grass blades are drawn as geometrical objects, it is straightfor- ward to integrate our method into an engine that supports such tech- niques. The framework is implemented in C++ and OpenGL, ver- sion 4.5. The results are generated on a machine using an NVIDIA GeForce GTX 780M graphics card and an Intel Core i7-4800 @ 2.7 GHz CPU with 32 GB Ram. The resolution that is used for the renderings is 1024x768 pixels. In order to reduce aliasing arti- facts, MSAA with 8 samples is used. A representative open-source demo application of our grass-rendering technique is availlable at https://github.com/klejah/ResponsiveGrassDemo. In the following, we present two scenes that are evaluated and dis- cussed. The evaluation is based on different measurements, which are: the rendered frames per second, the time for rendering the frame, the number of blades that are drawn, the number of blades that are culled, the time used for the evaluation of the physical model, the time used for the visibility calculation and indirect ren- dering setup, the time used for rendering and the number of colli- sion spheres that are considered in the force update. The time values are measured in milliseconds. The measurements are gathered un- der three different circumstances: all features are enabled, collision detection disabled, culling disabled. In order to guarantee a reason- able comparison, all measurements of a scene are taken from frames having the exact same input data from a fixed reference viewpoint as shown in the respective renderings (Figures 10,11). Animated renderings of these scenes can be found in the accompanying video. 7.1 Nature scene The nature scene consists of several 3D objects and resembles an outdoor scenario. A rendering of this scene is presented in Figure 10. The field of grass is generated on a terrain with smooth hills. It consists of 397,881 blades of grass. Each blade of grass has a moderate width, which leads to a high density. The scene contains a bunny model, which is represented by 1000 collision spheres in total. The effect of the physical model is shown by two rolling balls, which leave a trail behind. Additionally, several objects are added for a better visual representation. Table 1 presents the mea- surements of the nature scene. The evaluation proves the advantage of the culling methods based on each blade of grass. Almost three-fourths of all blades of grass of visible patches are culled by our algorithm. Nevertheless, the appearance of the meadow is still dense without any bare spaces. Table 2 shows the number of blades that are culled by the different tests. Note that the sum of culled blades is larger than the number of blades, since some blades fail multiple tests. The visibility test that culls the most blades is based on the view frustum. If all culling Figure 10: The left image shows the rendering of the nature scene as it is evaluated. The right image visualizes the sphere representa- tion of the bunny model. Measurement All Collision Culling features disabled disabled FPS 123 129 78 Frame time 8.130 7.742 12.821 Blades drawn 43,128 43,128 168,333 Blades culled 125,205 125,205 0 Time physical model 0.547 0.041 0.519 Time visibility 1.401 1.392 2.375 Time rendering 2.057 2.082 3.872 Amount collision spheres 183 0 183 Table 1: Evaluation of the nature scene. The most interesting mea- surements are highlighted. methods are disabled, an interesting phenomenon occurs. The re- quired time for the visibility test increases, although no visibility tests are performed. This shows that more time is required to set up of the indirect buffer if more blades are visible. Thus, the less blades are culled the more time is required for both the update and the rendering pass. Visibility test Blades culled Orientation test 44,695 View-frustum test 79,533 Distance test 46,965 Occlusion test 6,025 Table 2: The amount of blades culled by each visibility test in the nature scene. Another important fact is shown in the time used for the evalua- tion of the physical model. Even though many collision spheres have to be checked for collision, the calculation is performed in less time than one millisecond. However, if the collision detection is disabled, the force update requires almost no time, which shows the high performance of the calculations, especially considering the fact that the physical model is evaluated not only for visible blades of grass. 7.2 Helicopter scene The helicopter scene shows the impact of the wind effect together with the rendering of a field of grass of extreme density. Since the only other 3D model is a helicopter that flies above the ground, no blades can be culled due to occlusion, which resembles a worst-case scenario for our algorithm. The field of grass consists of 900,000 blades. The wind effect of the helicopter is simulated by a point- based wind with the helicopter being the wind source. Figure 11 shows a rendering of this scene and Table 3 presents the measure- ments. Figure 11: This figure shows a rendering of the helicopter scene. Measurement All Collision Culling features disabled disabled FPS 56 56 35 Frame time 17.860 17.692 28.624 Blades drawn 165,135 165,135 503,382 Blades culled 338,247 338,247 0 Time physical model 1.421 1.372 1.570 Time visibility 6.817 6.792 8.142 Time rendering 5.471 5.398 9.149 Amount collision spheres 0 0 0 Table 3: This table shows the evaluation of the helicopter scene. The most interesting measurements are highlighted. Since the helicopter scene does not contain any collision spheres, there is obviously no significant difference if the collision detection is disabled. Similar to the previous measurement, a huge amount of blades can be culled without a noticeable difference in the density of the field of grass. The high amount of blades makes the im- provement of the performance even more significant if the culling methods are enabled. Note that distance and orientation culling can introduce some popping artifacts for moving cameras, depending on the number of levels used, as can also be seen in the accompa- nying video. 7.3 Comparison to related work In contrast to many related grass rendering techniques, especially geometrical approaches, our technique is capable of processing fields of grass of arbitrary shape and spatial alignment. This en- ables a variety of different scenes that can not be modeled as a heightmap. In addition, grass that is able to grow on top of a 3D model can also simulate fur or hair. Figures 12 and 13 show grass growing on three models of different topologies, which cannot be represented as heightmaps. A major contribution of our technique is the physical interaction. The work of Orthmann et al. [2009] as well as the work of Fan et al. [2015] focus on the interaction between grass and environmen- tal colliders. Orthmann et al. use billboards for the grass represen- tation that are able to react to the collision with complex objects. When a collision is detected, the vertices of the billboard are dis- placed and after a fixed time the billboard regains its original state. The algorithm of Fan et al. follows a similar procedure. However, the blades of grass are represented as 3D objects and the collision detection is limited to spheres. As reaction to the collision, the vertices of the corresponding blades are displaced and after a fixed time period the blade resets to its initial state. Figure 12: This figure shows grass growing on two complex 3D models with different color textures. Figure 13: This figure shows grass growing on a model of a M¨ obius strip. In contrast to these approaches, our technique is able to operate on each single blade and can react to collisions with both spheres and complex objects. In addition, each blade saves its individual an- imation state, which allows that the time until a blade regains its initial state can depend on the collision that occurred and no fixed time period has to be set. In comparison to the technique of Orth- mann et al., we modeled a scene where a hand moves over a field of grass. As it is shown in Figure 14, the trails of the fingers are clearly visible where the blades were pushed down. The rendering of Orthmann et al. shows the drawbacks of using billboards, be- cause the trails are also visible, but the textures of the billboards are heavily distorted due to the displacement. In comparison to Fan et al., we generated a scene with many balls being thrown over the field of grass, which is shown in Figure 15. Since the meadow is much denser in our rendering, the collision reaction is more visible. Table 4 summarizes the differences of our method to Fan et al.’s method. The work of Wang et al. [2005] represents realistic natural forces that are applied to each blade of grass. The technique is capable of producing special variants of wind influence that can simulate the effect of a landing helicopter or even a tornado. For the calcula- tion of the wind influence, the authors assume the blade to be in its straight up position and compute the displacement that is cause by the wind effect. In comparison, our physical model has a persistent state over more than a single frame, which allows the implementa- tion of natural forces and collisions with one physical model. Fig- ure 16 represents two scenes with special wind effects that simulate a helicopter and a tornado. Jahrmann et al. [2013] use a similar rendering approach, which uses the tessellation pipeline to render smoothly shaped blades of grass. The shape of the blade is generated by an alpha texture and invisi- Figure 14: This figure shows the comparison between the technique of Orthmann et al. [2009] (left) and our technique (right). Both scenes show a complex objects moving through a meadow. This illustrates the advantage of drawing each blade as geometric object instead of using billboards. Figure 15: This figure presents the comparison between the tech- nique of Fan et al. [2015] (left) and our technique (right). Both scenes show a field of grass with hundreds of balls being thrown around. The collsion effect is more visible in the right image, since the field of grass has more density. ble fragments are discarded. This enables an easy way to generate different shapes. However, the resolution of the texture that is used is crucial for the visual appearance, since texture sampling artifacts can appear if the resolution is too low. The higher the resolution of the alpha, the higher is the memory footprint of the technique and the method becomes slower. In comparison, we generate the shape by modifying directly the geometry of a blade using ana- lytic functions. This reduces the amount of fragments that has to be computed and the edges of the shape have the same smoothness regardless of the distance to the camera. Figure 17 shows a closeup view of a blade of grass of both techniques. 8 Conclusion and Future Work In this paper, we have proposed a novel grass-rendering technique that is capable of rendering dense fields of grass in real time. In comparison to related work, the field of grass can have any shape or spatial alignment. In addition, our approach renders each blade as geometric object that can react to its environment. This reaction to its environment is performed by evaluating a physically based model for each blade separately. This model includes the influ- ence of gravity, wind, and collisions with both simple and complex objects. We use a sphere-packing approach to represent complex objects during the collision detection. In order to achieve real-time performance, we introduce culling methods that are able to cull sin- gle blades based on occlusion and their orientation and distance to- wards the camera. The culling methods are able to cull up to 75% of all blades of grass in a standard frame without decreasing the density of the field of grass significantly. However, the rendering of each blade of grass is still the bottleneck for the performance. Dif- ferent level-of-detail representations like in the work of Boulanger et al. [Boulanger et al. 2009] can be introduced as future work to Feature Proposed method Fan et al. grass field arbitrary geometry height field only blade geometry three control points with dynamically tessellated quads fixed number of quads LOD dynamic tessellation, culling based on orientation and distance distance culling only effects wind, gravity, collisions wind, collisions physical model integrated model separate models for wind and collision colliders complex objects using sphere packing single spheres only collision recovery recovery time depends on original displacement fixed recovery time Table 4: This table shows the most important differences between the method of Fan et al. [2015] and ours. Figure 16: This figure presents the comparison between the tech- nique of Wang et al. [2005] (left) and our technique (right). Both techniques are capable of creating special wind effects that are more complex than calculating the influence by trigonometric func- tions. further reduce the rendering time. References BOULANGER, K., PATTANAIK, S. N., AND BOUATOUCH, K. 2009. Rendering grass in real time with dynamic lighting. IEEE Comput. Graph. Appl. 29, 1 (Jan.), 32–41. CHEN, K., AND JOHAN, H. 2010. Real-time continuum grass. In 2010 IEEE Virtual Reality Conference (VR), 227–234. CLINE, D., JESCHKE, S., RAZDAN, A., WHITE, K., AND WONKA, P. 2009. Dart throwing on surfaces. Computer Graph- ics Forum 28, 4 (June), 1217–1226. EVERITT, C., REGE, A., AND CEBENOYAN, C. 2001. Hardware shadow mapping. White paper, nVIDIA 2. FAN, Z., LI, H., HILLESLAND, K., AND SHENG, B. 2015. Simu- lation and rendering for millions of grass blades. In Proceedings of the 19th Symposium on Interactive 3D Graphics and Games, ACM, New York, NY, USA, i3D ’15, 55–60. FARIN, G. E., AND HANSFORD, D. 2000. The essentials of CAGD. AK Peters Natick. GRAVESEN, J. 1993. Adaptive subdivision and the length of Bezier curves. Mathematical Institute, Technical University of Den- mark. Figure 17: This figure presents the comparison between the tech- nique of Wang et al. [2005] (left) and our technique (right). Both renderings show a closeup view of a blade of grass. The shape generated by an alpha texture shows texture sampling artifacts, whereas the analytic functions generate smooth edges. HABEL, R., WIMMER, M., AND JESCHKE, S. 2007. Instant ani- mated grass. Journal of WSCG 15, 1-3, 123–128. JAHRMANN, K., AND WIMMER, M. 2013. Interactive grass ren- dering using real-time tessellation. In WSCG 2013 Full Paper Proceedings, M. Oliveira and V. Skala, Eds., 114–122. KLEBER, G., 2015. Ea sports madden nfl: Breakthroughs in real- time rendering for next-gen consoles. SIGGRAPH 2015 Talks. LOOP, C., AND BLINN, J. 2005. Resolution independent curve rendering using programmable graphics hardware. Transactions on Graphics 24, 3. MALINEN, M. I., AND FR ¨ ANTI, P. 2014. Balanced K-Means for Clustering. Springer Berlin Heidelberg, Berlin, Heidelberg, 32– 41. ORTHMANN, J., REZK-SALAMA, C., AND KOLB, A. 2009. Gpu- based responsive grass. Journal of WSCG 17, 65–72. PELZER, K. 2004. Rendering countless blades of waving grass. In GPU Gems, R. Fernando, Ed. Addison-Wesley, 107–121. STOLPNER, S., KRY, P., AND SIDDIQI, K. 2012. Medial spheres for shape approximation. IEEE Transactions on Pattern Analysis and Machine Intelligence 34, 6 (June), 1234–1240. WANG, C., WANG, Z., ZHOU, Q., SONG, C., GUAN, Y., AND PENG, Q. 2005. Dynamic modeling and rendering of grass wag- ging in wind: Natural phenomena and special effects. Comput. Animat. Virtual Worlds 16, 3-4 (July), 377–389. WELLER, R., AND ZACHMANN, G. 2010. Protosphere: A gpu- assisted prototype guided sphere packing algorithm for arbitrary objects. In ACM SIGGRAPH ASIA 2010 Sketches, ACM, New York, NY, USA, SA ’10, 8:1–8:2. WHATLEY, D. 2005. Toward photorealism in virtual botany. In GPU Gems 2, M. Pharr, Ed. Addison-Wesley, 7–25. Citation: Choi, N.; Sung, M. CWD-Sim: Real-Time Simulation on Grass Swaying with Controllable Wind Dynamics. Appl. Sci. 2024, 14, 548. https://doi.org/10.3390/ app14020548 Academic Editor: João M. F. Rodrigues Received: 29 November 2023 Revised: 1 January 2024 Accepted: 6 January 2024 Published: 8 January 2024 Copyright: © 2024 by the authors. Licensee MDPI, Basel, Switzerland. This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license (https:// creativecommons.org/licenses/by/ 4.0/). applied sciences Article CWD-Sim: Real-Time Simulation on Grass Swaying with Controllable Wind Dynamics Namil Choi and Mankyu Sung * Department of Computer Engineering, Keimyung University, Daegu 42601, Republic of Korea; chnamil21@gmail.com * Correspondence: mksung@kmu.ac.kr Abstract: In this paper, we propose algorithms for the real-time simulation of grass deformation and wind flow in complex scenes based on the Navier–Stokes fluid. Grasses play an important role in natural scenes. However, accurately simulating their deformation due to external forces such as the wind can be computationally challenging. We propose algorithms that minimize computational cost while producing visually appealing results. We do this by grouping the grass blades and then applying the same force to the group to reduce the computation time. We also use a quadratic equation to deform the blades affected by the wind force rather than using a complicated spline technique. Wind force is fully modeled by the Navier–Stokes fluid equation, and the blades react to this force as if they were being swept by the wind. We also propose the AGC interface (Arrow-Guided wind flow Control), which allows the direction and intensity of the wind to be manipulated using an arrow-shaped interface. Through this interface, users can have grass sway in response to user-defined wind forces in a real-time rate. We verified that the proposed algorithms can simulate 900% more grass blades than the compared paper’s algorithms. Keywords: interactive visualization; natural scene visualization; grass animation; real-time simulation; fluid dynamics in graphics 1. Introduction Simulating natural phenomena presents a significant challenge but is essential in computer graphics, especially for creating realistic scenes in applications like video games and virtual environments. Grass, ubiquitous in natural landscapes, plays a pivotal role. The accurate simulation of grass swaying in the wind necessitates a detailed modeling of each blade and an in-depth understanding of the wind flow dynamics. Achieving such realism requires sophisticated physics algorithms capable of simulating intricate wind patterns and blade deformation along with substantial computing resources to simulate and render a large number of blades effectively. In this paper, we introduce the Controllable Wind Dynamics (CWD) techniques, which were designed to facilitate the real-time simulation of numerous grass blades interacting with external forces. This approach leverages the parallel computation capabilities of GPUs for the simulation, deformation, and rendering of grass blades. To minimize unnecessary transfer overhead between the CPU and GPU, all data updates are confined to the GPU memory buffer. The computation of blade deformation is contingent upon the direction and magnitude of the artificially generated wind. We achieve a precise representation of wind force and its interaction with the blades through fluid simulation governed by the Navier–Stokes equations, which are fundamental to fluid dynamics. The methodol- ogy for implementing fluid simulation using the Navier–Stokes equations is extensively documented. In our research, we have adopted the methods delineated in [1–5]. The reason why the CWD-Sim algorithm uses minimal computational resources compared to previous methods is that it uses a combination of techniques specifically Appl. Sci. 2024, 14, 548. https://doi.org/10.3390/app14020548 https://www.mdpi.com/journal/applsci Appl. Sci. 2024, 14, 548 2 of 14 designed to optimize simulation steps. First, unlike the method proposed in [6], which uses Bezier curves to deform the grass blades, our method uses a simple quadratic equation to stretch the grass blade model vertically and bend it in all directions. This approach requires fewer operations than spline curves, although both produce similar results. Second, instead of simulating individual blades, we group them based on their world positions and place them in a grid structure. All blades in a group can have different deformation effects, even if they are exposed to the same wind force because they have slightly different initial physical properties. This grouping significantly reduces the computation time without causing any noticeable visual artifacts. Through experiments, we have found that the computation speed remains almost constant regardless of the number of blades and objects. Essentially, the value of a cell on the grid computed by the fluid simulation determines the curvature, orientation, and shadow of the blade through specific separate equations. In particular, we use the quadratic equation to deform the blade model into a curved shape, as if it were under the influence of gravity. The curved shape of the blade model can also be bent or stretched by external wind forces. An important problem to be addressed is how to efficiently specify the direction and force of the wind in the environment. Our method proposes the AGC (Arrow-Guided wind flow Control) interface, which allows users to intuitively control wind flow. The interface adds a set of 2D arrows that represent wind directions for a given time period directly into the environment. These arrows are connected to control the flow. Using this interface, users can manage complex flows, such as branching and merging of the wind. The remaining sections consist of the following. Section 2 provides an overview of related work and a comparison with the proposed algorithm. Section 3 describes the technical details of the CWD-Sim algorithms. Section 4 presents the experimental results and performance graphs. Finally, Section 5 concludes the paper with a discussion and outlines future work that could improve our CWD method. 2. Related Works 2.1. Static Grasses In recent years, several methods have been proposed for real-time grass simulation. For example, ref. [7] proposed a non-dynamic method to render more than 627,000,000 virtual grass blades in real time at 18 fps. However, this method could not simulate the deformation of grass by external forces, such as the wind or objects, and could only render a static grass model without dynamic grass deformation. Similarly, Deussen et al. proposed a method that did not focus on rendering time [8]. It showed the most colorful plant composition among the papers referenced, but it could only render a static grass model and takes 75 min to render the scene. 2.2. Grass Deformation with External Forces Habel focused on real-time vegetation rendering and animation [9] but did not specif- ically address the aspects of wind interaction and manipulation in detail. Chen et al. presented a 2D approach to animate 3D vegetation in real time [10]. While their previous method proposed a simple method to animate vegetation with billboard images based on simulation-guided grid-based warping, the methods did not provide specific features for the wind interaction. Qiu et al. proposed a rendering system for large-scale grass [11]. The three-layer framework separated the rendering task from the data logic, making it convenient to add new vegetation simulation methods on the data layer, but it did not propose an interaction with external forces. Max et al. proposed a method for render- ing grasses blowing in the wind with global illumination [12] using a lattice Boltzmann model, a mass-spring system and multiple scattering. However, since the simulation and rendering were performed on the CPU, performance was limited. Fan et al. utilized physical laws to simulate the movement of grasses deformed by a rolling ball [13]. The authors were able to reduce the computational load by activating and deactivating tile groups, which is the subdivision of the environment, as the ball passes over them for a Appl. Sci. 2024, 14, 548 3 of 14 certain period of time. Although this approach showed highly dynamic grass interactions, it did not account for interactions with the wind. Furthermore, if global wind affecting the entire scene or interactions with rigid body objects was required, then this method would result in a significant computational burden. Similarly, Wang et al. proposed a GPU-based grass simulation with accurate blade reconstruction [14], which focused on im- proving the grass blade representation. But it still did not address the wind interaction and manipulation extensively. 2.3. Grass Deformation with Fluid Dynamics In [6], Lo et al. used a 60 × 60 × 20 3D Navier–Stokes simulation for wind dynamics, and each grass blade calculated four control points of the parametric spline to represent a curved shape swaying by the wind. Although their approach was able to produce highly realistic grass animation, simulating 3D fluids and finding four control points of each blade of grass were computationally intensive for large scenes. Our method proposes a 1000 × 1000 2D Navier–Stokes simulation for wind dynamics instead. Complex wind dynamics created by the proposed method and its interaction with grasses in Figure 1. Our method produces more detailed wind interaction than [6] and is able to cover larger complex scenes due to a more detailed and highly optimized wind dynamic control scheme. For instance, our quadratic equation for the deformation of the grass blade offers an alternative approach that can represent natural movement in all directions within a three-dimensional space while reducing the computational com- plexity involved in deforming the blades. Please refer to the accompanying video clip (Supplementary Materials) for more details. Appl. Sci. 2024, 1, 0 3 of 14 period of time. Although this approach showed highly dynamic grass interactions, it did not account for interactions with the wind. Furthermore, if global wind affecting the entire scene or interactions with rigid body objects was required, then this method would result in a significant computational burden. Similarly, Wang et al. proposed a GPU-based grass simulation with accurate blade reconstruction [14], which focused on improving the grass blade representation. But it still did not address the wind interaction and manipulation extensively. 2.3. Grass Deformation with Fluid Dynamics In [6], Lo et al. used a 60 × 60 × 20 3D Navier–Stokes simulation for wind dynamics, and each grass blade calculated four control points of the parametric spline to represent a curved shape swaying by the wind. Although their approach was able to produce highly realistic grass animation, simulating 3D fluids and finding four control points of each blade of grass were computationally intensive for large scenes. Our method proposes a 1000 × 1000 2D Navier–Stokes simulation for wind dynamics instead. Complex wind dynamics created by the proposed method and its interaction with grasses in Figure 1. Our method produces more detailed wind interaction than [6] and is able to cover larger complex scenes due to a more detailed and highly optimized wind dy- namic control scheme. For instance, our quadratic equation for the deformation of the grass blade offers an alternative approach that can represent natural movement in all directions within a three-dimensional space while reducing the computational complexity involved in deforming the blades. Please refer to the accompanying video clip (Supplementary Materials) for more details. Figure 1. Complex wind dynamics created by the proposed method and its interaction with grasses. The blue arrows splat the wind and can be moved through the red colored control point. Another point that makes our approach different from all the other work is the wind force authoring technique. Our method includes the ability to control the flow of the wind in a way that designers intend. All previous work [8,12,13,15–18] did not address the problem of wind authoring. For comparison, ref. [6] provides only a one-way wind generator. However, in our proposed method, the designer can place and modify the wind flow directly in the environment with the AGC interface. The designer can also adjust the strength of the wind and the area affected by the wind. To put a wind force, the AGC interface allows users to put a starting point and an arrow guideline in front and behind the starting point. It is also possible for multiple arrows to be branched out from a single starting point, showing that various wind dynamics can be designed according to the designer’s intent. Figure 1. Complex wind dynamics created by the proposed method and its interaction with grasses. The blue arrows splat the wind and can be moved through the red colored control point. Another point that makes our approach different from all the other work is the wind force authoring technique. Our method includes the ability to control the flow of the wind in a way that designers intend. All previous work [8,12,13,15–18] did not address the problem of wind authoring. For comparison, ref. [6] provides only a one-way wind generator. However, in our proposed method, the designer can place and modify the wind flow directly in the environment with the AGC interface. The designer can also adjust the strength of the wind and the area affected by the wind. To put a wind force, the AGC interface allows users to put a starting point and an arrow guideline in front and behind the starting point. It is also possible for multiple arrows to be branched out from a single Appl. Sci. 2024, 14, 548 4 of 14 starting point, showing that various wind dynamics can be designed according to the designer’s intent. 3. Proposed Algorithms The CWD-Sim method describes a computationally efficient technique to realistically simulate the sway of the grass by the wind. It involves grouping grass blades into a two-dimensional grid, simplifying the forces affecting the grass, on the vertex shaders to deform the grass model, and allowing the designer to control the flow of wind using arrow guides. We are going to explain all steps in detail in the following sections. 3.1. Grouping of Grasses Performing individual fluid simulation calculations for every grass blade increases the computational load. It blocks the real-time performance required for interactive applica- tions. To solve this problem, the grass blades are grouped and assigned to a grid structure. To do so, the world positions of the blade groups are converted to a group index. The group index, G ∈Z, is calculated in Equation (1). G = Px w + 0.5, Pz h + 0.5 (1) where G ∈R2, w is the width of the grid, h is the height of the grid, Px and Pz are the x and z world coordinates of the blade. This equation divides the whole world into a 2D grid with a fixed cell size. Each cell contains a group of grass blades within its range. The grid, which has a 1000 × 1000 resolution in our case, is used for fluid simulation of wind dynamics. However, this grid resolution can be reduced to obtain faster simulation speeds. Our experiments indicate that reducing it to 200 × 200 would not make a big difference in visual quality. The 1000 × 1000 grid size means that there would be a total of 1,000,000 groups of grass blades. Using the instance ID, which is the ID number of the instance when we use the GPU Instancing technique [19], we can calculate the appropriate grid position for each grass blade based on its world coordinates and then assign it to the appropriate group. Once we determine the cells of all blade groups, we can make all blades in a group receive the same force instead of applying a different force to each individual blade. This approach greatly reduces the computational load because all blades within a group receive the same force. However, the visual quality does not decrease because there are so many grasses with different sizes and orientations. Figure 2 represents the 2D grid structure and the positions where the grass blades are placed. Note that the grass blades are randomly distributed on the cell. Appl. Sci. 2024, 1, 0 4 of 14 3. Proposed Algorithms The CWD-Sim method describes a computationally efficient technique to realistically simulate the sway of the grass by the wind. It involves grouping grass blades into a two-dimensional grid, simplifying the forces affecting the grass, on the vertex shaders to deform the grass model, and allowing the designer to control the flow of wind using arrow guides. We are going to explain all steps in detail in the following sections. 3.1. Grouping of Grasses Performing individual fluid simulation calculations for every grass blade increases the computational load. It blocks the real-time performance required for interactive applica- tions. To solve this problem, the grass blades are grouped and assigned to a grid structure. To do so, the world positions of the blade groups are converted to a group index. The group index, G ∈Z, is calculated in Equation (1). G = ( Px w + 0.5, Pz h + 0.5) (1) where G ∈R2, w is the width of the grid, h is the height of the grid, Px and Pz are the x and z world coordinates of the blade. This equation divides the whole world into a 2D grid with a fixed cell size. Each cell contains a group of grass blades within its range. The grid, which has a 1000 × 1000 resolution in our case, is used for fluid simulation of wind dynamics. However, this grid resolution can be reduced to obtain faster simulation speeds. Our experiments indicate that reducing it to 200 × 200 would not make a big difference in visual quality. The 1000 × 1000 grid size means that there would be a total of 1,000,000 groups of grass blades. Using the instance ID, which is the ID number of the instance when we use the GPU Instancing technique [19], we can calculate the appropriate grid position for each grass blade based on its world coordinates and then assign it to the appropriate group. Once we determine the cells of all blade groups, we can make all blades in a group receive the same force instead of applying a different force to each individual blade. This approach greatly reduces the computational load because all blades within a group receive the same force. However, the visual quality does not decrease because there are so many grasses with different sizes and orientations. Figure 2 represents the 2D grid structure and the positions where the grass blades are placed. Note that the grass blades are randomly distributed on the cell. (a) (b) Figure 2. (a): Visualization of the 2D grid. (b): Grass blades represented as black points in the (a) cell. 3.2. Wind Force Modeling Simulating wind on a computer is commonly achieved using the Navier–Stokes equa- tions. These can be effectively solved through computational fluid dynamics methods, as detailed in [1]. The wind force in our simulation is modeled by a real-time fluid simula- Figure 2. (a): Visualization of the 2D grid. (b): Grass blades represented as black points in the (a) cell. Appl. Sci. 2024, 14, 548 5 of 14 3.2. Wind Force Modeling Simulating wind on a computer is commonly achieved using the Navier–Stokes equa- tions. These can be effectively solved through computational fluid dynamics methods, as detailed in [1]. The wind force in our simulation is modeled by a real-time fluid simulation algorithm grounded in the theory of Stable Fluid introduced by Jos Stam in [1,3]. In this section, we will briefly summarize the basic fluid simulation algorithms. This algorithm provides a stable numerical solution to solve the Navier–Stokes equation, which is denoted in Equation (2). ∂u ∂t = −(u·∇)u −1 ρ∇p + ν∇2u + F (2) ∇·u = 0 (3) where ∂is partial derivative, u is fluid velocity, t is time, ∇is gradient operator, ν is the kinematic viscosity, ∇2 is the Laplacian operator quantifying the diffusion, p is pressure, ∂u ∂t is the local or temporal acceleration, reflecting the changes in velocity at a specific point over time, and the term (u·∇)u is the convective acceleration that represents the transport of momentum by the fluid. The term ν∇2u represents the viscous diffusion of momentum. The term −∇p represents the pressure gradient, which is responsible for driving or opposing fluid motion. Finally, F represents any external forces acting on the fluid, such as the wind. Most air movement in the atmosphere is considered incompressible, and Equation (3) embodies the assumption of incompressibility for the fluid. Our implementation is based on the procedures proposed by Dobryakov et al. [3]. The procedures consist of multiple steps given a 2D grid to obtain the velocity grid V, where Vi,j ∈R2 is a cell in the ith row and the jth column. To obtain the final updated velocity grid V′′′, the algorithm performs the following processes from (4) to (9) in order. First, we calculate the curl of the velocity field as shown in Equation (4) that provides a quantification of the rotation at each point. Ci,j = Vi+1,j −Vi−1,j + Vi,j+1 −Vi,j−1 (4) where Ci,j is a 2D curl value at the ith row and jth cell of the grid. The subtraction term, Vi+1,j −Vi−1,j, approximates the median difference for the derivative of the velocity. The term Vi+1,j represents a single step speed to the right cell from the current position and Vi−1,j represents a single step speed for the left cell. Also, Vi,j+1 −Vi,j−1 indicates the vertical speed. The calculation of these two directions gives a rotation measurement at (i, j) points. Next, we apply the vorticity confinement as described in Equation (5). This process helps to improve the smaller swirls that are noticeable in the fluid flow. fi,j = Ci,j+1 −Ci,j−1, Ci+1,j −Ci−1,j ·λ V′ i,j = Vi,j + fi,j·∆t (5) where V′ i,j is the first updated velocity, fi,j ∈R2 is the force at (i, j), ∆t is the time step and λ is the vorticity confinement factor. The divergence of the velocity field is then computed as in Equation (6) in the next step. In fluid dynamics, this calculation gauges the rate at which the density leaves a specific region of space. Di,j = V′ i,j+1 −V′ i,j−1 + V′ i+1,j −V′ i−1,j /2 (6) where Di,j ∈R2 is the divergence value. This step is followed by the projection of the pressure, which is described in Equation (7). This step eliminates the component of the velocity that does not contribute to the advection along the vector field, leaving only the divergence-free component. Pi,j = Pi,j+1 + Pi,j−1 + Pi+1,j −Pi−1,j −Di,j /4 (7) Appl. Sci. 2024, 14, 548 6 of 14 where Pi,j ∈R2 is the pressure and Di,j is the divergence at the gi,j. Next, the pressure gradient is subtracted from the velocity field as indicated in Equation (8). This step ensures the conservation of mass within our fluid system. V′′ i,j = V′ i,j − Pi+1,j −Pi−1,j, Pi,j+1 −Pi,j−1 (8) where V′′ i,j is the second updated velocity and V′ i,j the first updated velocity obtained in Equation (5). In the final step, the velocity field is then advected along itself. This stage creates the illusion of motion and fluidity, which is a critical aspect of fluid dynamics visualization. Let us say that the 2D coordinates of cell is α = (i, j). Then, the updated coordinate α′ is first calculated from the second updated velocity and the grid size s. Note that the grid has a square shape where the width and height are equal to s. α′ = α −V′′ i,j·s·∆t (9) Once the advection is complete, the final velocity V′′′ i,j is obtained through Equation (10). V′′′ i,j = V′′ α′/(1.0 + λ·∆t) (10) The calculated V′′′ in Equation (9) is used to model the deformation of the grass group. Each blade in a grass group calculates the deformation vector with Equation (12) based on V′′′ in the next Section 3.3. 3.3. Deformation of the Grass Model From real-world observations of grass swaying in the wind, we propose a basic grass deformation model. It replicates grass dynamics through a blend of the two most significant grass motions, as shown in Figure 3. Bending is due to the influence of gravity, and the swaying of the grass is due to the wind force. Appl. Sci. 2024, 1, 0 6 of 14 where Pi,j ∈R2 is the pressure and Di,j is the divergence at the gi,j. Next, the pressure gradient is subtracted from the velocity field as indicated in Equation (8). This step ensures the conservation of mass within our fluid system. V′′ i,j = V′ i,j −(Pi+1,j −Pi−1,j, Pi,j+1 −Pi,j−1) (8) where V′′ i,j is the second updated velocity and V′ i,j the first updated velocity obtained in Equation (5). In the final step, the velocity field is then advected along itself. This stage creates the illusion of motion and fluidity, which is a critical aspect of fluid dynamics visualization. Let us say that the 2D coordinates of cell is α = (i, j). Then, the updated coordinate α′ is first calculated from the second updated velocity and the grid size s. Note that the grid has a square shape where the width and height are equal to s. α′ = α −V′′ i,j · s · ∆t (9) Once the advection is complete, the final velocity V′′′ i,j is obtained through Equation (10). V′′′ i,j = V′′ α′/(1.0 + λ · ∆t) (10) The calculated V′′′ in Equation (9) is used to model the deformation of the grass group. Each blade in a grass group calculates the deformation vector with Equation (12) based on V′′′ in the next Section 3.3. 3.3. Deformation of the Grass Model From real-world observations of grass swaying in the wind, we propose a basic grass deformation model. It replicates grass dynamics through a blend of the two most significant grass motions, as shown in Figure 3. Bending is due to the influence of gravity, and the swaying of the grass is due to the wind force. (a) (b) (c) Figure 3. Shows the detailed bending effect of a grass blade due to the wind force. (a): Default state. (b): Only gravity. (c): Gravity with external wind force. The deformation of the grass is carried out in the vertex shader. Initially, before the wind force is applied, the only force that acts on the grass is gravity. This force consistently bends the blade downward, and the amount of bending depends on the weight of the blade in the absence of wind force. This process is divided into gravity deformation and external force deformation. In the first step, we apply an initial deformation based on the elevation value Py ∈R of the position of the vertex. This step modifies the original position of the vertex P ∈R3 to a new position P′, as shown in Figure 4. The second step converts the external force into a translation vector using a quadratic equation, as shown in Figure 5. Figure 3. Shows the detailed bending effect of a grass blade due to the wind force. (a): Default state. (b): Only gravity. (c): Gravity with external wind force. The deformation of the grass is carried out in the vertex shader. Initially, before the wind force is applied, the only force that acts on the grass is gravity. This force consistently bends the blade downward, and the amount of bending depends on the weight of the blade in the absence of wind force. This process is divided into gravity deformation and external force deformation. In the first step, we apply an initial deformation based on the elevation value Py ∈R of the position of the vertex. This step modifies the original position of the vertex P ∈R3 to a new position P′, as shown in Figure 4. The second step converts the external force into a translation vector using a quadratic equation, as shown in Figure 5. Appl. Sci. 2024, 14, 548 7 of 14 This calculation of a quadratic equation eliminates the computational overhead of using a Bezier curve in [6] and provides a similar translation result. P′ = Px, Py −k1· Py 2, Pz + k2· Py 2 (11) where k1 and k2 are parameters to control the shape of the curve. For comparison, Figure 4a,b show an example of bending of a grass blade. Figure 4a is the result when we apply our simple quadratic equation, whereas Figure 4b shows the case when we apply the Bezier curve. For comparison, we put two graphs together to check the similarity for both Figures 4a and 5a where the dotted curves are the Bezier curves and the green curves are our proposed methods. We also show the red dots for control points for the Bezier curves. As we can see from the picture, the bending result is quite similar for both cases, although our equation needs fewer computations. We also add numerical comparisons in Table 1. Appl. Sci. 2024, 1, 0 7 of 14 This calculation of a quadratic equation eliminates the computational overhead of using a Bezier curve in [6] and provides a similar translation result. P′ = (Px, Py −k1 · (Py)2, Pz + k2 · (Py)2) (11) where k1 and k2 are parameters to control the shape of the curve. For comparison, Figure 4a,b show an example of bending of a grass blade. Figure 4a is the result when we apply our simple quadratic equation, whereas Figure 4b shows the case when we apply the Bezier curve. For comparison, we put two graphs together to check the similarity for both Figures 4a and 5a where the dotted curves are the Bezier curves and the green curves are our proposed methods. We also show the red dots for control points for the Bezier curves. As we can see from the picture, the bending result is quite similar for both cases, although our equation needs fewer computations. We also add numerical comparisons in Table 1. (a) (b) Figure 4. Comparison of grass’s default state due to gravity. (a): Proposed deformation equa- tion (11) is shown as a green line, the Bezier curve is shown as a red dotted line superim- posed on our equation. (b): Bezier curve equation (P = (1 −t)3P1 + 3(1 −t)2tP2 + 3(1 −t) t2P3 + t3P4, 0 ≤t ≤1) proposed in [20]. (a) (b) Figure 5. Comparison of grass’s swaying state due to external force. (a): Proposed deformation equations (11) and (12) applied are shown as a green line, the Bezier curve is shown as a red dotted line superimposed on our equation. (b): Bezier curve equation (P = (1 −t)3P1 + 3(1 −t)2tP2 + 3(1 − t)t2P3 + t3P4, 0 ≤t ≤1) proposed in [20]. Figure 4. Comparison of grass’s default state due to gravity. (a): Proposed deformation Equation (11) is shown as a green line, the Bezier curve is shown as a red dotted line superimposed on our equation. (b): Bezier curve equation P = (1 −t)3P1 + 3(1 −t)2tP2 + 3(1 −t) t2P3 + t3P4 , 0 ≤t ≤1) proposed in [20]. Appl. Sci. 2024, 1, 0 7 of 14 This calculation of a quadratic equation eliminates the computational overhead of using a Bezier curve in [6] and provides a similar translation result. P′ = (Px, Py −k1 · (Py)2, Pz + k2 · (Py)2) (11) where k1 and k2 are parameters to control the shape of the curve. For comparison, Figure 4a,b show an example of bending of a grass blade. Figure 4a is the result when we apply our simple quadratic equation, whereas Figure 4b shows the case when we apply the Bezier curve. For comparison, we put two graphs together to check the similarity for both Figures 4a and 5a where the dotted curves are the Bezier curves and the green curves are our proposed methods. We also show the red dots for control points for the Bezier curves. As we can see from the picture, the bending result is quite similar for both cases, although our equation needs fewer computations. We also add numerical comparisons in Table 1. (a) (b) Figure 4. Comparison of grass’s default state due to gravity. (a): Proposed deformation equa- tion (11) is shown as a green line, the Bezier curve is shown as a red dotted line superim- posed on our equation. (b): Bezier curve equation (P = (1 −t)3P1 + 3(1 −t)2tP2 + 3(1 −t) t2P3 + t3P4, 0 ≤t ≤1) proposed in [20]. (a) (b) Figure 5. Comparison of grass’s swaying state due to external force. (a): Proposed deformation equations (11) and (12) applied are shown as a green line, the Bezier curve is shown as a red dotted line superimposed on our equation. (b): Bezier curve equation (P = (1 −t)3P1 + 3(1 −t)2tP2 + 3(1 − t)t2P3 + t3P4, 0 ≤t ≤1) proposed in [20]. Figure 5. Comparison of grass’s swaying state due to external force. (a): Proposed de- formation Equations (11) and (12) applied are shown as a green line, the Bezier curve is shown as a red dotted line superimposed on our equation. (b): Bezier curve equation P = (1 −t)3P1 + 3(1 −t)2tP2 + 3(1 −t)t2P3 + t3P4, 0 ≤t ≤1 proposed in [20]. Appl. Sci. 2024, 14, 548 8 of 14 Table 1. Comparative analysis of algorithmic efficiency in processing vertex points. # of Vertex Points Computation Time of Equation (11) (ms) Computation Time of Bezier Curve (ms) 1000 1.9 6.8 5000 5.9 37.9 10,000 13.0 75.8 Table 1 shows the evaluation of up to 10,000 virtual vertex points. Our proposed algorithm (11) shows a speed faster than that of using the Bezier curve in terms of com- putation times, which is approximately 82.8% faster, with a time savings of 62.8 ms. This efficiency difference is quite important when we are dealing with a large set of vertex points such as grasses because it underscores the impact of computational complexity on processing speed and therefore highlights the importance of choosing the right algorithm for time-sensitive computational tasks. In the second step of our process, we take into account the impact of the wind force on the grass blades. We calculate the wind translation vector T from the wind direction vector W and its magnitude F. This vector T essentially quantifies how the wind force should alter the position of the grass blades. The elevation value of the deformed vertex P′ y is again used to calculate the wind translation. Specifically, we calculate T, which encapsulates both the direction vector of the wind W and its magnitude F. The height of the deformed vertex, which we refer to as P′ y, plays a critical role in this calculation. The effect of the wind changes depending on the height of the blade, and this is captured in the height value. For example, the wind may have a stronger impact on the top of the blade than on the lower base part. Therefore, we use P′ y to adjust the strength of the wind translation vector T. Equation (12) describes how these computations are performed. T = F· V′′′ x P′ y 2 , − V′′′ P′ y 2 , −V′′′ y P′ y 2 (12) Figures 4 and 5 show another comparison between our equation proposed in (12) and the Bezier curve. As we can see, these two curves are almost identical, which proves that our equation can be used to bend the grass blade influenced by wind force. The final step involves updating the vertex positions by applying the wind translation T to the initial deformed positions P′. Transformation of the positions of the vertex positions is facilitated by the model matrix M. As shown in Equation (13), the final position of the vertex, P′′, is calculated. P′′ = M (1 −λ)T + λP′ (13) where λ is the weighting parameter. The λ is a weighting parameter that represents the degree of effect that wind translation T and initial deformation P′ have on the final position P′′. When λ is closer to 0, the wind translation T has more influence on the final position, and when λ is closer to 1, the initial deformation P′ has more influence. 3.4. Shadows between Grasses Without the shadows, realism is greatly reduced, and blade interaction is difficult to perceive. However, calculating the shadows between all blades of grass can be com- putationally expensive. In particular, if we use a conventional method such as shadow mapping, which requires multi-pass rendering, it would not be effective to generate the map considering a large number of geometry data to render. To solve this problem, we propose a simplified self-shadow calculation technique, as shown in Figure 6. We use a simplified equation to handle the shadows between all the grass blades. When a blade is in shadow, its color becomes dark. The brightness of the grass is adjusted based on the highest height of every group of grasses. The vertex of the highest position has the lightest color, while the color becomes dimmer as it goes down. This principle is based on the fact that when a blade of grass is pushed downward, it has a Appl. Sci. 2024, 14, 548 9 of 14 high chance of being obscured by other blades of grass. Equation (14) represents the color adjustment formula. Figure 3 shows the detailed bending effect of a grass blade due to the wind force. Note that the x axis is the x or z offset from the local origin, while the y axis indicates the y offset from the origin, which shows the amount of bending. The original upright grass blade is also shown for comparison. As we can see in the figure, there were no unnatural artifacts on the mesh. As shown in Figure 7, the difference in naturalness with and without shadows is significant. c f = ct· max(mmin, min(P′′ y −|F|·c1 + c2, mmax)) (14) where c f ∈R4 is the color of a vertex, ct ∈R3 is a diffuse color, mmin and mmax are the darkest and brightest values, c1 and c2 are control parameters and p′′ y is the height of the blade. Through experimentation, we believe that this approach is sufficient for grasses in a large meadow where a large number of homogeneous grasses are packed. We have shown the comparison results in Section 4. Appl. Sci. 2024, 1, 0 9 of 14 high chance of being obscured by other blades of grass. Equation (14) represents the color adjustment formula. Figure 3 shows the detailed bending effect of a grass blade due to the wind force. Note that the x axis is the x or z offset from the local origin, while the y axis indicates the y offset from the origin, which shows the amount of bending. The original upright grass blade is also shown for comparison. As we can see in the figure, there were no unnatural artifacts on the mesh. As shown in Figure 7, the difference in naturalness with and without shadows is significant. c f = ct · max(mmin, min(P′′ y −|F| · c1 + c2, mmax)) (14) where c f ∈R4 is the color of a vertex, ct ∈R3 is a diffuse color, mmin and mmax are the darkest and brightest values, c1 and c2 are control parameters and p′′ y is the height of the blade. Through experimentation, we believe that this approach is sufficient for grasses in a large meadow where a large number of homogeneous grasses are packed. We have shown the comparison results in Section 4. Figure 6. As the bending of the blade goes deeper due to the wind force, vertex colors become darker. (a) (b) Figure 7. (a): Without the shadow between grasses. (b): After applying the proposed shadow generation technique to grasses. 3.5. Arrow-Guided Wind Flow Control One of the problems with using fluid for wind dynamics is how we can specify the wind the way the designer wants. Our algorithm gives designers the ability to control the wind flow in a scene using the so-called AGC (Arrow-Guided wind flow Control) interface. These arrow guides consist of a root point and multiple ending points, which can be added or removed as needed. The root point acts as the starting point for the wind flow. Clicking the points also opens the inspector window. In this window, the force strength can be adjusted by changing sliders or by entering a number. Setting an end point determines the direction of the flow from the root point, which automatically changes to an Figure 6. As the bending of the blade goes deeper due to the wind force, vertex colors become darker. Appl. Sci. 2024, 1, 0 9 of 14 high chance of being obscured by other blades of grass. Equation (14) represents the color adjustment formula. Figure 3 shows the detailed bending effect of a grass blade due to the wind force. Note that the x axis is the x or z offset from the local origin, while the y axis indicates the y offset from the origin, which shows the amount of bending. The original upright grass blade is also shown for comparison. As we can see in the figure, there were no unnatural artifacts on the mesh. As shown in Figure 7, the difference in naturalness with and without shadows is significant. c f = ct · max(mmin, min(P′′ y −|F| · c1 + c2, mmax)) (14) where c f ∈R4 is the color of a vertex, ct ∈R3 is a diffuse color, mmin and mmax are the darkest and brightest values, c1 and c2 are control parameters and p′′ y is the height of the blade. Through experimentation, we believe that this approach is sufficient for grasses in a large meadow where a large number of homogeneous grasses are packed. We have shown the comparison results in Section 4. Figure 6. As the bending of the blade goes deeper due to the wind force, vertex colors become darker. (a) (b) Figure 7. (a): Without the shadow between grasses. (b): After applying the proposed shadow generation technique to grasses. 3.5. Arrow-Guided Wind Flow Control One of the problems with using fluid for wind dynamics is how we can specify the wind the way the designer wants. Our algorithm gives designers the ability to control the wind flow in a scene using the so-called AGC (Arrow-Guided wind flow Control) interface. These arrow guides consist of a root point and multiple ending points, which can be added or removed as needed. The root point acts as the starting point for the wind flow. Clicking the points also opens the inspector window. In this window, the force strength can be adjusted by changing sliders or by entering a number. Setting an end point determines the direction of the flow from the root point, which automatically changes to an Figure 7. (a): Without the shadow between grasses. (b): After applying the proposed shadow generation technique to grasses. 3.5. Arrow-Guided Wind Flow Control One of the problems with using fluid for wind dynamics is how we can specify the wind the way the designer wants. Our algorithm gives designers the ability to control the wind flow in a scene using the so-called AGC (Arrow-Guided wind flow Control) interface. These arrow guides consist of a root point and multiple ending points, which can be added or removed as needed. The root point acts as the starting point for the wind flow. Clicking the points also opens the inspector window. In this window, the force strength can be adjusted by changing sliders or by entering a number. Setting an end point determines the Appl. Sci. 2024, 14, 548 10 of 14 direction of the flow from the root point, which automatically changes to an arrow. Because all points can be added or removed directly anywhere in the environment, the designer has complete control over editing the wind forces, as shown in Figure 8. Appl. Sci. 2024, 1, 0 10 of 14 arrow. Because all points can be added or removed directly anywhere in the environment, the designer has complete control over editing the wind forces, as shown in Figure 8. (a) (b) Figure 8. Starting with the state of (a) and adding as shown in (b) using the controllable arrow guide wind editing tool. One of advantages of our proposed AGC interface is that multiple arrows can be connected to build more complicated wind dynamics. Thus, the wind flow can be a simple line or can be designed to resemble a tree structure or other complex patterns. By changing the position and length of the arrows, designers can adjust the direction of the wind flow. Once the design is complete, the wind forces are generated from the root to the end point along the series of arrows. Each point, which is the end point of the arrow, applies a force to the fluid simulation in the direction of the arrow from the start point. In the case of a tree structure, the forces are applied in a sequence based on the direction of the arrow’s flow to make it appear continuous. 4. Experiments To verify our algorithms, we built a system and performed a set of experiments. Hardware specifications include an E3-1230 v2 CPU and GTX 660 2GB GPU. For 3D rendering, we used the OpenGL and GLSL version 4.5. The grass model that we used in the experiments was in Autodesk’s FBX format. Please see the accompanying video clip that we submitted (Supplementary Materials) and the Youtube video (https://youtu.be/ uV0CFSqszJE (accessed on 5 January 2024)). For fluid simulation, we used a 2D texture grid size of 1000 × 1000 to simulate fluid dy- namics, applying Equations (4)–(10). In Equation (5), we set the vorticity confinement factor λ to 50. Regarding grass deformation, in Equation (11), we set the deformation parameters k1 to 0.05 and k2 to 0.1. These values were used to control the initial shape of the grass, which represented the weight of a grass blade due to gravity. Furthermore, in Equation (13), we set 0.2 for λ to control the flexibility of the grass blade under external force. In the first experiment, we checked the performance of our algorithm. As we increase the number of grass blades, we checked its fps. Note that all computations and rendering are performed on the GPU side. The result is shown in Figure 9. As we can see in the figure, our algorithm maintained the real-time performance even if we increased the number of grasses up to 1,200,000. For comparison with other algorithms, we picked [6], which we believe to be one of the complete solutions for grass rendering and animation. Figure 9 shows the performance comparison between our algorithm and [6]. Note that the narrow blue and orange bands represent the trends of the graph. For this test, we used the same GPU to obtain an unbiased result. From this test, we knew that our algorithm did not significantly reduce performance as we increase the number of grasses. On the contrary, the algorithm proposed in [6] had a substantial decrease in fps. It turned out that our simulation can achieve speeds 10× to 50× faster than [6] in a similar hardware environment. Figure 8. Starting with the state of (a) and adding as shown in (b) using the controllable arrow guide wind editing tool. One of advantages of our proposed AGC interface is that multiple arrows can be connected to build more complicated wind dynamics. Thus, the wind flow can be a simple line or can be designed to resemble a tree structure or other complex patterns. By changing the position and length of the arrows, designers can adjust the direction of the wind flow. Once the design is complete, the wind forces are generated from the root to the end point along the series of arrows. Each point, which is the end point of the arrow, applies a force to the fluid simulation in the direction of the arrow from the start point. In the case of a tree structure, the forces are applied in a sequence based on the direction of the arrow’s flow to make it appear continuous. 4. Experiments To verify our algorithms, we built a system and performed a set of experiments. Hardware specifications include an E3-1230 v2 CPU and GTX 660 2GB GPU. For 3D rendering, we used the OpenGL and GLSL version 4.5. The grass model that we used in the experiments was in Autodesk’s FBX format. Please see the accompanying video clip that we submitted (Supplementary Materials) and the Youtube video (https://youtu.be/ uV0CFSqszJE (accessed on 5 January 2024)). For fluid simulation, we used a 2D texture grid size of 1000 × 1000 to simulate fluid dy- namics, applying Equations (4)–(10). In Equation (5), we set the vorticity confinement factor λ to 50. Regarding grass deformation, in Equation (11), we set the deformation parameters k1 to 0.05 and k2 to 0.1. These values were used to control the initial shape of the grass, which represented the weight of a grass blade due to gravity. Furthermore, in Equation (13), we set 0.2 for λ to control the flexibility of the grass blade under external force. In the first experiment, we checked the performance of our algorithm. As we increase the number of grass blades, we checked its fps. Note that all computations and rendering are performed on the GPU side. The result is shown in Figure 9. As we can see in the figure, our algorithm maintained the real-time performance even if we increased the number of grasses up to 1,200,000. For comparison with other algorithms, we picked [6], which we believe to be one of the complete solutions for grass rendering and animation. Figure 9 shows the performance comparison between our algorithm and [6]. Note that the narrow blue and orange bands represent the trends of the graph. For this test, we used the same GPU to obtain an unbiased result. From this test, we knew that our algorithm did not significantly reduce performance as we increase the number of grasses. On the contrary, the algorithm proposed in [6] had a substantial decrease in fps. It turned out that our simulation can achieve speeds 10× to 50× faster than [6] in a similar hardware environment. Appl. Sci. 2024, 14, 548 11 of 14 Appl. Sci. 2024, 1, 0 11 of 14 Figure 9. Performance comparison between our algorithms and the method proposed in [6]. In the second experiment, we tested how efficient our algorithms are in designing complicated wind dynamics. Figure 1 shows the case where winds coming from multiple sources must interact with static obstacles. Our method could generate a realistic bump and churn in a very realistic way between wind and obstacles. Figure 10 shows two winds colliding in the middle of the environment. You can see that the two winds are deflecting and changing direction smoothly as shown in Figure 11. Please refer to the accompanying video of the result for more details. Figure 7 compared two cases in which we applied the shadow generation technique proposed in Section 3.5 and not. We can easily tell that shadowing between grasses improves visual quality. Finally, Figure 8 shows the wind- editing process with the proposed AGC interface. Root points and end points are added directly to the environment to form the arrow guides, and those guides are connected to each other to create complicate tree-like wind forces, which improves controllability. (a) (b) Figure 10. The two winds interact in the middle and then turn from the other direction (a) to (b). Figure 9. Performance comparison between our algorithms and the method proposed in [6]. In the second experiment, we tested how efficient our algorithms are in designing complicated wind dynamics. Figure 1 shows the case where winds coming from multiple sources must interact with static obstacles. Our method could generate a realistic bump and churn in a very realistic way between wind and obstacles. Figure 10 shows two winds colliding in the middle of the environment. You can see that the two winds are deflecting and changing direction smoothly as shown in Figure 11. Please refer to the accompanying video of the result for more details. Figure 7 compared two cases in which we applied the shadow generation technique proposed in Section 3.5 and not. We can easily tell that shadowing between grasses improves visual quality. Finally, Figure 8 shows the wind- editing process with the proposed AGC interface. Root points and end points are added directly to the environment to form the arrow guides, and those guides are connected to each other to create complicate tree-like wind forces, which improves controllability. Appl. Sci. 2024, 1, 0 11 of 14 Figure 9. Performance comparison between our algorithms and the method proposed in [6]. In the second experiment, we tested how efficient our algorithms are in designing complicated wind dynamics. Figure 1 shows the case where winds coming from multiple sources must interact with static obstacles. Our method could generate a realistic bump and churn in a very realistic way between wind and obstacles. Figure 10 shows two winds colliding in the middle of the environment. You can see that the two winds are deflecting and changing direction smoothly as shown in Figure 11. Please refer to the accompanying video of the result for more details. Figure 7 compared two cases in which we applied the shadow generation technique proposed in Section 3.5 and not. We can easily tell that shadowing between grasses improves visual quality. Finally, Figure 8 shows the wind- editing process with the proposed AGC interface. Root points and end points are added directly to the environment to form the arrow guides, and those guides are connected to each other to create complicate tree-like wind forces, which improves controllability. (a) (b) Figure 10. The two winds interact in the middle and then turn from the other direction (a) to (b). Figure 10. The two winds interact in the middle and then turn from the other direction (a) to (b). The data in Table 2 present additional performance metrics obtained using an Intel Core i7-10700KF CPU and an NVIDIA RTX 2080 8 GB GPU. The simulations were conducted with a varying number of grass blades, up to a maximum of 7,000,000, to evaluate real-time performance. The optimal frame rate achieved under these conditions was 29 fps. The grid size for wind simulation was 1000 × 1000. The whole simulation time includes the processes time described in Equations (11)–(13). The time for the grass shadow indicates the performance of the shading algorithm, as illustrated in Figure 7b. The grass rendering time includes both the grass simulation and shadow rendering step. Appl. Sci. 2024, 14, 548 12 of 14 Appl. Sci. 2024, 1, 0 12 of 14 (a) (b) Figure 11. Two winds are changing direction over time after bending. (a) has been changed to (b). The data in Table 2 present additional performance metrics obtained using an Intel Core i7-10700KF CPU and an NVIDIA RTX 2080 8 GB GPU. The simulations were conducted with a varying number of grass blades, up to a maximum of 7,000,000, to evaluate real- time performance. The optimal frame rate achieved under these conditions was 29 fps. The grid size for wind simulation was 1000 × 1000. The whole simulation time includes the processes time described in Equations (11)–(13). The time for the grass shadow indicates the performance of the shading algorithm, as illustrated in Figure 7b. The grass rendering time includes both the grass simulation and shadow rendering step. Table 2. Performance metrics of grass simulation. Grass Count Wind Simulation (ms) Grass Simulation (ms) Grass Shadow (ms) Grass Rendering (ms) FPS 1,000,000 5.9 0.1 0.1 3.3 87 2,000,000 5.9 0.1 0.1 7.5 69 3,000,000 5.9 0.1 0.1 11.4 51 4,000,000 5.9 0.3 0.2 15.6 42 5,000,000 5.9 0.6 0.4 19.4 36 6,000,000 5.9 0.7 0.5 23.2 32 7,000,000 5.9 0.7 0.5 27.4 29 5. Conclusions In this paper, we presented CWD-Sim, a real-time simulation algorithm for grass deformation and wind dynamic control in complex scenes. Our algorithm is capable of naturally simulating the effects of wind on grasses while allowing designers to have control over the wind flow in complex scenes with obstacles or other structures. By grouping grass blades and simplifying the force calculation, our algorithm significantly reduces computational load and achieves faster and more efficient simulations. Our method also allows for grass-model variation and efficient shadowing, which further enhances the realism of the simulation. However, we acknowledge some limitations of our method. While our algorithm is well suited for animating large numbers of homogeneous grass blades, it focuses on the aggregate behaviors, such as wind-induced swaying, and therefore may not be appropriate for real-world physics-based animation, which would require a physics-based simulation technique. Another drawback of our method is 2D wind dynamics. Our proposed grass deformation is based on a 2D fluid simulation. Therefore, it is impossible to reproduce certain 3D fluid behaviors, such as the three-dimensional vortex observed in the real world. However, we believe that the 3D deformation can be approximated with the 2D simulation with simple quadratic equations that we proposed. Also, our method did not take into account collisions between grass blades. To solve this problem, a more complex calculation method is needed. If our quadratic equation is to reflect the deformation of the adjacent grass blades, the collision information can be Figure 11. Two winds are changing direction over time after bending. (a) has been changed to (b). Table 2. Performance metrics of grass simulation. Grass Count Wind Simulation (ms) Grass Simulation (ms) Grass Shadow (ms) Grass Rendering (ms) FPS 1,000,000 5.9 0.1 0.1 3.3 87 2,000,000 5.9 0.1 0.1 7.5 69 3,000,000 5.9 0.1 0.1 11.4 51 4,000,000 5.9 0.3 0.2 15.6 42 5,000,000 5.9 0.6 0.4 19.4 36 6,000,000 5.9 0.7 0.5 23.2 32 7,000,000 5.9 0.7 0.5 27.4 29 5. Conclusions In this paper, we presented CWD-Sim, a real-time simulation algorithm for grass deformation and wind dynamic control in complex scenes. Our algorithm is capable of naturally simulating the effects of wind on grasses while allowing designers to have control over the wind flow in complex scenes with obstacles or other structures. By grouping grass blades and simplifying the force calculation, our algorithm significantly reduces computational load and achieves faster and more efficient simulations. Our method also allows for grass-model variation and efficient shadowing, which further enhances the realism of the simulation. However, we acknowledge some limitations of our method. While our algorithm is well suited for animating large numbers of homogeneous grass blades, it focuses on the aggregate behaviors, such as wind-induced swaying, and therefore may not be appropriate for real-world physics-based animation, which would require a physics-based simulation technique. Another drawback of our method is 2D wind dynamics. Our proposed grass deformation is based on a 2D fluid simulation. Therefore, it is impossible to reproduce certain 3D fluid behaviors, such as the three-dimensional vortex observed in the real world. However, we believe that the 3D deformation can be approximated with the 2D simulation with simple quadratic equations that we proposed. Also, our method did not take into account collisions between grass blades. To solve this problem, a more complex calculation method is needed. If our quadratic equation is to reflect the deformation of the adjacent grass blades, the collision information can be extracted and used. We will need to discuss this further in the future to incorporate the collision of many grasses into our processing simulations. According to experiments, our methods appeared a little slower than certain prior methods such as [6] in performance, which had 43.5 fps for 50,000 grass blades compared to our 35 fps. However, our method did not downgrade much in performance as the number of blades increased. For example, while the [6] drops to 15.9 fps at 200,000 blades, our method maintains a frame rate of 28 fps even with 500,000 blades as shown in Figure 9, showing its advantage in large-scale simulations. Additionally, we have also conducted experiments on the latest hardware specification and can see that it shows excellent real-time performance at 29 fps at 7,000,000 of grass count as shown in Table 2. Appl. Sci. 2024, 14, 548 13 of 14 In future research, we would like to incorporate level of detail (LOD) and culling techniques for optimization and complement them with different types of models, such as flowers, and different types of grasses. In the course of our current experiments, we have encountered a challenge in simulat- ing the effects of strong winds on grass blades. We found that too much wind can cause grass blades to become too dark and flat. Although allowing the user to adjust the wind strength could potentially mitigate this problem, it could also lead to tedious control by the user. An alternative approach was considered instead, such as limiting the maximum wind strength, but this may cause the grass blades to appear unnaturally rigid. We also carried out an experiment with interpolation methods to smoothly limit the wind intensity, but this did not effectively solve the problem in the cases of very strong winds. Furthermore, our attempts to use periodic functions such as cosine and sine to maintain constant motion in grass blades were not successful, either. Identifying and solving this problem represents a significant opportunity for future research, as it is critical to achieving more realistic and dynamic simulations of natural environments. Supplementary Materials: The following supporting information can be downloaded at: https: //www.mdpi.com/article/10.3390/app14020548/s1. Author Contributions: Conceptualization and methodology, N.C. and M.S.; software, N.C.; valida- tion, N.C. and M.S.; formal analysis, N.C. and M.S.; investigation, N.C.; resources, N.C. and M.S.; data curation, N.C.; writing—original draft preparation, N.C. and M.S.; writing—review and editing, N.C. and M.S.; visualization, N.C.; supervision, M.S.; project administration, M.S. All authors have read and agreed to the published version of the manuscript. Funding: This work was supported by the National Research Foundation of Korea (NRF) grant funded by the Korea government (MSIT) (No. 2021R1A2C1012316) and was supported 2023 Cultural Heritage Smart Preservation & Utilization R&D Program by Cultural Heritage Administration, National Research Institute of Cultural Heritage (Project Name: A smart H-BIM modeling technology of wooden architecture for the conservation of Historical and Cultural Environment, Project Number: 2023A02P01-001, Contribution Rate: 50%). Institutional Review Board Statement: Not applicable. Informed Consent Statement: Not applicable. Data Availability Statement: Data is contained within the article or Supplementary Materials. Conflicts of Interest: The authors declare no conflicts of interest. References 1. Stam, J. Stable fluids. In Proceedings of the 26th Annual Conference on Computer Graphics and Interactive Techniques, Los Angeles, CA, USA, 8–13 August 1999; pp. 121–128. 2. Harris, M.J. Fast Fluid Dynamics Simulation on the GPU. GPU Gems. 2005; Chapter 38. Available online: https://developer. nvidia.com/sites/all/modules/custom/gpugems/books/GPUGems/gpugems_ch38.html (accessed on 12 April 2023). 3. Dobryakov, P. WebGL Fluid Simulation. Available online: https://github.com/PavelDoGreat/WebGL-Fluid-Simulation (accessed on 12 April 2023). 4. haxiomic. Cross-Platform GPU Fluid Simulation. Available online: https://github.com/haxiomic/GPU-Fluid-Experiments (accessed on 12 April 2023). 5. angeluriot. 2D Fluid Simulation. Available online: https://github.com/angeluriot/2D_fluid_simulation (accessed on 12 April 2023). 6. Lo, Y.; Chu, H.K.; Lee, R.R.; Chang, C.F. A simulation on grass swaying with dynamic wind force. In Proceedings of the 20th ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games, Redmond, DC, USA, 27–28 February 2016; p. 181. 7. Boulanger, K.; Pattanaik, S.N.; Bouatouch, K. Rendering Grass in Real Time with Dynamic Lighting. IEEE Comput. Graph. Appl. 2009, 29, 32–41. [CrossRef] [PubMed] 8. Deussen, O.; Hanrahan, P.; Lintermann, B.; Mˇ ech, R.; Pharr, M.; Prusinkiewicz, P. Realistic modeling and rendering of plant ecosystems. In Proceedings of the 25th Annual Conference on Computer Graphics and Interactive Techniques, Orlando, FL, USA, 19–24 July 1998; pp. 275–286. 9. Habel, R. Real-Time Rendering and Animation of Vegetation. Ph.D. Thesis, Technischen Universität Wien, Vienna, Austria, 2010. Appl. Sci. 2024, 14, 548 14 of 14 10. Chen, K.; Johan, H. Animating 3D vegetation in real-time using a 2D approach. In Proceedings of the 19th Symposium on Interactive 3D Graphics and Games, San Francisco, CA, USA, 27 February–1 March 2015; pp. 69–76. 11. Qiu, H.; Chen, L. Rendering System for Large-Scale Grass. In Proceedings of the 2009 International Conference on Computational Intelligence and Software Engineering, Wuhan, China, 11–13 December 2009; pp. 1–4. [CrossRef] 12. Max, N.; Saito, S.; Watanabe, K.; Nakajima, M. Rendering grass blowing in the wind with global illumination. Tsinghua Sci. Technol. 2010, 15, 133–137. [CrossRef] 13. Fan, Z.; Li, H.; Hillesland, K.; Sheng, B. Simulation and Rendering for Millions of Grass Blades. In Proceedings of the 19th Symposium on Interactive 3D Graphics and Games, i3D ’15, San Francisco, CA, USA, 27 February–1 March 2015; pp. 55–60. [CrossRef] 14. Wang, S.; Ali, S.G.; Lu, P.; Li, Z.; Yang, P.; Sheng, B.; Mao, L. GPU-based Grass Simulation with Accurate Blade Reconstruc- tion. In Proceedings of the Advances in Computer Graphics: 37th Computer Graphics International Conference, CGI 2020, Geneva, Switzerland, 20–23 October 2020; pp. 288–300. 15. Jahrmann, K.; Wimmer, M. Interactive Grass Rendering Using Real-Time Tessellation. In WSCG 2013 Full Paper Proceedings; TU Wien: Vienna, Austria, 2013. 16. Bakay, B.; Lalonde, P.; Heidrich, W. Real-Time Animated Grass. In Eurographics (Short Presentations); TU Wien: Vienna, Austria, 2002. 17. Jens, O.; Salama, C.R.; Kolb, A. GPU-based responsive grass. J. WSCG 2009, 17, 65–72. 18. Belyaev, S.Y.; Laevsky, I.; Chukanov, V.V. Real-Time Animation, Collision and Rendering of Grassland. In Proceedings of the GraphiCon2011, Moscow, Russia, 26–30 September 2011. 19. JoeyDeVries. LearnOpenGL-Instancing. Available online: https://github.com/JoeyDeVries/LearnOpenGL/tree/master/src/ 4.advanced_opengl/10.1.instancing_quads (accessed on 12 April 2023). 20. Dobryakov, P. NURBS Demo-Evaluator for Non Uniform Rational B-Splines. Available online: http://nurbscalculator.in (accessed on 12 April 2023). Disclaimer/Publisher’s Note: The statements, opinions and data contained in all publications are solely those of the individual author(s) and contributor(s) and not of MDPI and/or the editor(s). MDPI and/or the editor(s) disclaim responsibility for any injury to people or property resulting from any ideas, methods, instructions or products referred to in the content.
difficulty
hard
domain
Multi-Document QA
length
short
question
These are two articles about grassland simulation. The first article is "Responsive Real Time Grass Rendering for General 3D Scenes", and the second article is "CWD Sim: Real Time Simulation on Grass Swaying with Controllable Wind Dynamics”. Which of the following statements regarding the differences in content between the two articles is incorrect?
sub domain
Academic
Discussion
No discussion posts on this page yet. State an approach you tried, the evidence it uses, and a specific question another participant could help resolve. Use the posting template.
Artifacts
Code, notes and reproducible work shared by participants. Files are served from a separate origin.
No artifacts on this page yet. Share reproducible code or notes in a contribution. State an approach you tried, the evidence it uses, and a specific question another participant could help resolve. Use the posting template.
Source and history
initial import