3
$\begingroup$

I am working on a research project utilizing blender to visualize realistic clouds generated from a Large Eddy Simulation. I've been able to do so in limited respects. Cloud Field with average liquid water

These images, while pretty, are extremely inefficient due to the how the cloud 'particles' are placed and rendered (taking on the scale of 1hr on an a brand new Nvidia Tesla 32gb).

The code goes through a 3d array (shape = (128,1024,1024), each point represents a $(25m)^3$ block) and places a primitive box at that location.

    bpy.ops.mesh.primitive_cube_add(radius=8*0.999/1024);
    orig_cube = bpy.context.active_object;
    mat = bpy.data.materials.get('CloudMatv0.1')
    orig_cube.data.materials.append(mat)
    orig_cube.name = 'Cloud Particle'
    bpy.ops.mesh.primitive_plane_add()
    o = bpy.context.active_object
    me = o.data
    bm = bmesh.new()
    for particle in cloudarray:
        bm.verts.new().co = [particle[2], particle[1], particle[0]]
    bm.to_mesh(me);
    o.dupli_type = 'VERTS';
    orig_cube.parent = o;  

The material utilizes the light attenuation equation to estimate light absorption (overall not terribly inefficient), and a volume scatter node (very time consuming). Materials and camera are all built to work in cycles. As each of these particles is essentially a clone of the base block, the shape and visual effect that I am looking for is present, however it takes too long.

Goal

I need to maintain the cube shapes with volumetric rendering to be as realistic as possible. The most time consuming part of the render is 'building object flags', which I believe to the a direct result of the way the fields are set up, with many particles leading to a parent block.

Things I have Tried

  • Limiting cloud particle placement by the azimuthal angle to reflect the camera's FOV (80$\deg$)
  • Reducing light path sampling
  • Placing blocks/ merging them for each cloud/ removing inside vertices and faces

Possible Solutions

  • More efficient volume materials (or engine)
  • Point Cloud Skinner (haven't had luck with this)
  • Writing python script to manually build surface of mesh from point cloud (worst case scenario)

Thanks, Nick

$\endgroup$
  • $\begingroup$ unfortunately I am very unfamiliar with the topic, so I'll leave this only as a comment: blender supports openVDB, is there any way you can transfer your simulation data to this format? Then you could import it as cache in a smoke sim. $\endgroup$ – yann Jun 5 '18 at 17:44
  • $\begingroup$ That could work! I'll do some research and see where that takes me, the data structure in openVDB seems compatible with the simulation output with minor alterations. $\endgroup$ – Nicholas Barron Jun 5 '18 at 17:56
2
$\begingroup$

The best solution I found is by utilizing the point density node in the cycles materials. First, I placed a material with vertices - this method was described in my original post. Then, placing a cube around the coordinate extremes and assigning the vertex group as the first mesh. There are some toggles (resolution and radius), these are assigned to match the grid-size as defined by the simulation. Then the remaining of the problem is found in: Is there an easy way to make volumetric clouds for Cycles?.

edit:

The result of said manipulation is as follows enter image description here

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.