aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerlaender2019-09-21 21:32:40 +0200
committerAdrian Kummerlaender2019-09-21 21:32:40 +0200
commit7aaded636cb6f062c72926b94c697bd9b8c3c081 (patch)
tree301c993ccabbc7167787d3fe6f7d2cd7af27d398
parente95c6d5d1c6253a2b05176a205ad1448c2930aac (diff)
downloadsymlbm_playground-7aaded636cb6f062c72926b94c697bd9b8c3c081.tar
symlbm_playground-7aaded636cb6f062c72926b94c697bd9b8c3c081.tar.gz
symlbm_playground-7aaded636cb6f062c72926b94c697bd9b8c3c081.tar.bz2
symlbm_playground-7aaded636cb6f062c72926b94c697bd9b8c3c081.tar.lz
symlbm_playground-7aaded636cb6f062c72926b94c697bd9b8c3c081.tar.xz
symlbm_playground-7aaded636cb6f062c72926b94c697bd9b8c3c081.tar.zst
symlbm_playground-7aaded636cb6f062c72926b94c697bd9b8c3c081.zip
Fix ray calculation
i.e. use the inverse rotational matrix to project the camera position into lattice space
-rw-r--r--channel_3d_volumetric_rendering_gl_interop.py42
1 files changed, 26 insertions, 16 deletions
diff --git a/channel_3d_volumetric_rendering_gl_interop.py b/channel_3d_volumetric_rendering_gl_interop.py
index b3be853..f862d5d 100644
--- a/channel_3d_volumetric_rendering_gl_interop.py
+++ b/channel_3d_volumetric_rendering_gl_interop.py
@@ -41,9 +41,9 @@ def get_cavity_material_map(g):
(lambda x, y, z: x == g.size_x-2, 4), # outflow
(Sphere(3*g.size_x//20, g.size_y//2, g.size_z//2, 28), 5),
- (Sphere(1*g.size_x//20, g.size_y//2, g.size_z//2, 12), 1),
- (Sphere(3*g.size_x//20, g.size_y//2, g.size_z//2, 16), 1),
- (Sphere(5*g.size_x//20, g.size_y//2, g.size_z//2, 16), 1),
+ (lambda x, y, z: x > 3*g.size_x//20-30 and
+ x < 3*g.size_x//20+30 and
+ (y-g.size_y//2)*(y-g.size_y//2) + (z-g.size_z//2)*(z-g.size_z//2) < 8*8, 1),
(lambda x, y, z: x == 0 or x == g.size_x-1 or
y == 0 or y == g.size_y-1 or
@@ -87,19 +87,27 @@ class Rotation:
self.shift = shift
self.rotation_x = x
self.rotation_z = z
+ self.update(0,0)
def update(self, x, z):
self.rotation_x += x
self.rotation_z += z
- def get(self):
qx = quaternion.Quaternion(quaternion.create_from_eulers([self.rotation_x,0,0]))
qz = quaternion.Quaternion(quaternion.create_from_eulers([0,0,self.rotation_z]))
rotation = qz.cross(qx)
- return numpy.matmul(
+
+ self.matrix = numpy.matmul(
matrix44.create_from_translation(self.shift),
matrix44.create_from_quaternion(rotation)
)
+ self.inverse_matrix = numpy.linalg.inv(self.matrix)
+
+ def get(self):
+ return self.matrix
+
+ def get_inverse(self):
+ return self.inverse_matrix
def glut_window(fullscreen = False):
glutInit(sys.argv)
@@ -160,7 +168,7 @@ lighting_fragment_shader = shaders.compileShader(Template("""
in vec3 frag_pos;
-uniform mat4 rotation;
+uniform mat4 inverse_rotation;
uniform sampler3D moments;
@@ -183,7 +191,7 @@ vec3 blueRedPalette(float x) {
}
void main(){
- const vec4 light_pos = rotation * vec4(0,-2*$size_x,0,1);
+ const vec4 light_pos = inverse_rotation * vec4(0,-2*$size_x,0,1);
const vec3 ray = normalize(frag_pos - light_pos.xyz);
@@ -215,12 +223,13 @@ void main(){
}), GL_FRAGMENT_SHADER)
domain_program = shaders.compileProgram(vertex_shader, fragment_shader)
-projection_id = shaders.glGetUniformLocation(domain_program, 'projection')
-rotation_id = shaders.glGetUniformLocation(domain_program, 'rotation')
+domain_projection_id = shaders.glGetUniformLocation(domain_program, 'projection')
+domain_rotation_id = shaders.glGetUniformLocation(domain_program, 'rotation')
obstacle_program = shaders.compileProgram(lighting_vertex_shader, lighting_fragment_shader)
-projection_id2 = shaders.glGetUniformLocation(obstacle_program, 'projection')
-rotation_id2 = shaders.glGetUniformLocation(obstacle_program, 'rotation')
+obstacle_projection_id = shaders.glGetUniformLocation(obstacle_program, 'projection')
+obstacle_rotation_id = shaders.glGetUniformLocation(obstacle_program, 'rotation')
+obstacle_inverse_rotation_id = shaders.glGetUniformLocation(obstacle_program, 'inverse_rotation')
lattice = Lattice(
descriptor = D3Q27,
@@ -238,7 +247,7 @@ primitives = list(map(lambda material: material[0], filter(lambda material: no
lattice.apply_material_map(material_map)
lattice.sync_material()
-rotation = Rotation([-lattice_x//2, -lattice_y//2, -lattice_z//2])
+rotation = Rotation([-0.5*lattice_x, -0.5*lattice_y, -0.5*lattice_z])
cube_vertices, cube_edges = lattice.geometry.wireframe()
@@ -254,14 +263,15 @@ def on_display():
glDepthFunc(GL_LESS)
shaders.glUseProgram(obstacle_program)
- glUniformMatrix4fv(projection_id2, 1, False, numpy.ascontiguousarray(projection))
- glUniformMatrix4fv(rotation_id2, 1, False, numpy.ascontiguousarray(rotation.get()))
+ glUniformMatrix4fv(obstacle_projection_id, 1, False, numpy.ascontiguousarray(projection))
+ glUniformMatrix4fv(obstacle_rotation_id, 1, False, numpy.ascontiguousarray(rotation.get()))
+ glUniformMatrix4fv(obstacle_inverse_rotation_id, 1, False, numpy.ascontiguousarray(rotation.get_inverse()))
moments_texture.bind()
Box(0,lattice.geometry.size_x,0,lattice.geometry.size_y,0,lattice.geometry.size_z).draw()
shaders.glUseProgram(domain_program)
- glUniformMatrix4fv(projection_id, 1, False, numpy.ascontiguousarray(projection))
- glUniformMatrix4fv(rotation_id, 1, False, numpy.ascontiguousarray(rotation.get()))
+ glUniformMatrix4fv(domain_projection_id, 1, False, numpy.ascontiguousarray(projection))
+ glUniformMatrix4fv(domain_rotation_id, 1, False, numpy.ascontiguousarray(rotation.get()))
glLineWidth(4)
glBegin(GL_LINES)
for i, j in cube_edges: