From 50c9589c4b05c8224ffdb02cd77470ce44e8dc26 Mon Sep 17 00:00:00 2001 From: Emily Howell Date: Tue, 29 Oct 2024 20:27:29 -0700 Subject: [PATCH] Fixing Nan errors in Camera Frustum Mesh (#1397) * Issue was that when normalized, the look vector had a slight floating point imprecision that caused this to try and calculate a new up vector. Because the up vector was being rotated based on that floating point imprecision, it was trying to rotate around a (0,0,0) axis which caused nan values * Adding a test with the look_at and position vectors very close to each other. * Alternative to rounding the look vector values --- .../ascent_runtime_rendering_filters.cpp | 4 ++-- ..._camera_image_4_frustum_front_image_100.png | Bin 0 -> 17441 bytes ...t_camera_image_4_frustum_side_image_100.png | Bin 0 -> 138961 bytes src/tests/ascent/t_ascent_render_3d.cpp | 11 +++++++++-- 4 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 src/tests/_baseline_images/tout_render_3d_frust_camera_image_4_frustum_front_image_100.png create mode 100644 src/tests/_baseline_images/tout_render_3d_frust_camera_image_4_frustum_side_image_100.png diff --git a/src/libs/ascent/runtimes/flow_filters/ascent_runtime_rendering_filters.cpp b/src/libs/ascent/runtimes/flow_filters/ascent_runtime_rendering_filters.cpp index 239d5ecbe..55108311d 100644 --- a/src/libs/ascent/runtimes/flow_filters/ascent_runtime_rendering_filters.cpp +++ b/src/libs/ascent/runtimes/flow_filters/ascent_runtime_rendering_filters.cpp @@ -1922,8 +1922,8 @@ void generate_camera_meshes(conduit::Node &image_data){ vtkm::Vec forward(0,0,-1); double angle_between = vtkm::ACos(vtkm::Dot(forward, vtkm_look)) / vtkm::Pi() * 180; - // If the look vector has been rotated by a certain angle, ajust the camera up vector to match - if (angle_between != 0.0) { + // If the look vector has been rotated by a certain angle, adjust the camera up vector to match + if (vtkm::Abs(angle_between) >= 0.001) { vtkm::Vec axisOfRotation = vtkm::Cross(vtkm_look, forward); vtkm_up = vtkm::Transform3DVector(vtkm::Transform3DRotate(-angle_between, axisOfRotation), vtkm_up); diff --git a/src/tests/_baseline_images/tout_render_3d_frust_camera_image_4_frustum_front_image_100.png b/src/tests/_baseline_images/tout_render_3d_frust_camera_image_4_frustum_front_image_100.png new file mode 100644 index 0000000000000000000000000000000000000000..bae74f236f52cd1e119fd20d9ed1fa804acbb921 GIT binary patch literal 17441 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%0DX4n`kid{lmys)gu{m! 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