Почему на 3D-радарных изображениях я рисую отдельные отдельные столбы, а не непрерывные? [закрыто] ⇐ C++
Почему на 3D-радарных изображениях я рисую отдельные отдельные столбы, а не непрерывные? [закрыто]
Я только начал изучать OpenGL.
[*]Согласно OpenGL учебник (ссылка), Я реализовал 3D-визуализацию данных метеорологического радара с использованием объема. техника рейкастинг. Однако визуализируемый эффект состоит из регулярно расположенные колонны вместо непрерывных фигур, представляющих метеорологическое эхо. [*]3D-радарное изображение, которое я хочу получить, выглядит следующим образом: громкость метеорологического радара рендеринги. Но эффект я достигнутое выглядит так: мой результат.
Ниже приведен код .frag из справочного руководства:
#версия 130 из vec4 a_color; униформа mat4 ViewMatrix; униформа mat3 NormalMatrix; равномерное плавающее фокусное_длина; равномерное плавающее соотношение сторон; униформа vec2 viewport_size; униформа vec3 ray_origin; униформа vec3 сверху; равномерное дно vec3; униформа vec3 background_color; униформа vec3 Material_color; униформа vec3 Light_position; равномерный плавающий шаг_длины; единый плавающий порог; равномерный объем сэмплера3D; равномерный джиттер сэмплера2D; равномерная плавающая гамма; однородные цвета vec3[255];// Rainbow_r, добавлено новое // Рэй структура Рэй { происхождение vec3; направление vec3; }; // Ограничительная рамка, выровненная по оси структура ААВВ { vec3 сверху; vec3 снизу; }; // Оцениваем нормаль на основе конечно-разностной аппроксимации градиента vec3 нормальный (положение vec3, плавающая интенсивность) { float d = длина_шага; float dx = текстура(объем, позиция + vec3(d,0,0)).r - интенсивность; float dy = текстура(объем, позиция + vec3(0,d,0)).r - интенсивность; float dz = текстура(объем, позиция + vec3(0,0,d)).r - интенсивность; return -normalize(NormalMatrix * vec3(dx, dy, dz)); } // Метод Slab для пересечения лучевого блока void ray_box_intersection(Луч луча, поле AABB, выходное число с плавающей запятой t_0, выходное число с плавающей запятой t_1) { vec3 направление_инв = 1,0/ray.direction; vec3 t_top = Direction_inv * (box.top — ray.origin); vec3 t_bottom = направление_inv * (box.bottom — ray.origin); vec3 t_min = min(t_top, t_bottom); vec2 t = max(t_min.xx, t_min.yz); t_0 = max(0.0, max(t.x, t.y)); vec3 t_max = max(t_top, t_bottom); т = мин(t_max.xx, t_max.yz); t_1 = мин(t.x, t.y); } // Очень простая функция передачи цвета vec4 color_transfer (плавающая интенсивность) { vec3 высокий = vec3(1,0, 0,0, 0,0); vec3 low = vec3(0,0, 0,0, 0,0); vec3 color_new = vec3(0.0, 0.0, 0.0); Плавающий индекс = интенсивность * 255; если(индекс 0 && color.a < 1,0) { интенсивность плавания = текстура (объем, позиция).r; vec4 c = color_transfer (интенсивность); // Альфа-смешивание color.rgb = c.a * c.rgb + (1 - c.a) * color.a * color.rgb; цвет.а = ок.а + (1 - ок.а) * цвет.а; длина_луча -= длина_шага; позиция += Step_vector; } // Смешиваем фон color.rgb = color.a * color.rgb + (1 - color.a) * pow(background_colour, vec3(gamma)).rgb; // Гамма-коррекция a_colour.rgb = pow(color.rgb, vec3(1.0 / гамма)); a_color.a = color.a; } Ниже приведен код привязки текстуры:
glDeleteTextures(1, &m_volume_texture); glGenTextures(1, &m_volume_texture); glBindTexture (GL_TEXTURE_3D, m_volume_texture); glTexParameteri (GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); // Массив на хосте имеет выравнивание по 1 байту glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, m_size.x(), m_size.y(), m_size.z(), 0, GL_RED, GL_UNSIGNED_BYTE, data.data()); glBindTexture (GL_TEXTURE_3D, 0); Ниже приведен параметр raycasting:
m_shaders[shader]->setUniformValue("ViewMatrix", m_viewMatrix); m_shaders[шейдер]->setUniformValue("ModelViewProjectionMatrix", m_modelViewProjectionMatrix); m_shaders[шейдер]->setUniformValue("NormalMatrix", m_normalMatrix); m_shaders[шейдер]->setUniformValue("aspect_ratio", m_aspectRatio); m_shaders[шейдер]->setUniformValue("focal_length", m_focalLength); m_shaders[шейдер]->setUniformValue("viewport_size", m_viewportSize); m_shaders[шейдер]->setUniformValue("ray_origin", m_rayOrigin); m_shaders[shader]->setUniformValue("top", m_raycasting_volume->top()); m_shaders[шейдер]->setUniformValue("дно", m_raycasting_volume->дно()); m_shaders[шейдер]->setUniformValue("background_colour", to_vector3d(m_background)); m_shaders[шейдер]->setUniformValue("light_position", m_lightPosition); m_shaders[шейдер]->setUniformValue("material_colour", m_diffuseMaterial); m_shaders[шейдер]->setUniformValue("step_length", m_stepLength); m_shaders[шейдер]->setUniformValue("порог", m_threshold); m_shaders[шейдер]->setUniformValue("гамма", m_gamma); m_shaders[шейдер]->setUniformValue("объем", 0); m_shaders[шейдер]->setUniformValue("дрожание", 1); m_shaders[шейдер]->setUniformValueArray("colors", m_rainbow_colormap.data(), m_rainbow_colormap.size()); //новое добавленное glClearColor(m_background.redF(), m_background.greenF(), m_background.blueF(), m_background.alphaF()); glClear (GL_COLOR_BUFFER_BIT); m_raycasting_volume->paint(); Ниже приведен заголовок созданного мной файла данных VTK:
# vtk DataFile версии 5.1 выход втк ДВОИЧНЫЙ НАБОР ДАННЫХ: STRUCTURED_POINTS РАЗМЕРЫ 65 501 501 РАЗМЕЩЕНИЕ 1 1 1 ПРОИСХОЖДЕНИЕ 0 0 0 POINT_DATA 16315065 СКАЛЯРЫ скаляры плавают ПРОСМОТР_ТАБЛИЦА по умолчанию А вот код Python, который я использовал для создания файла VTK:
импортировать vtk импортировать netCDF4 импортировать numpy как np nc_file = r"D:\pyCode\xiongan\code\2023072108_merge.nc" nc_ds = netCDF4.Dataset(nc_file) ref = np.array(nc_ds['ref'][:]) data_matrix = np.zeros(ref.shape, dtype=np.float64, order='F') data_matrix = ссылка Nx, Ny, Nz = data_matrix.shape dataImporter = vtk.vtkImageImport() data_string = data_matrix.tostring() dataImporter.CopyImportVoidPointer(data_string, data_matrix.nbytes) dataImporter.SetDataScalarTypeToFloat() dataImporter.SetNumberOfScalarComponents(1) dataImporter.SetDataExtent(0, Nx-1, 0, Ny-1, 0, Nz-1) dataImporter.SetWholeExtent(0, Nx-1, 0, Ny-1, 0, Nz-1) интервал = (0, 0, 0) dataImporter.SetDataSpacing(интервал) писатель = vtk.vtkDataSetWriter() Writer.SetInputConnection(dataImporter.GetOutputPort()) писатель.SetFileName('ref_2023072108.vtk') писатель.SetFileTypeToBinary() писатель.Обновить() писатель.Запись() Можете ли вы дать мне несколько советов, которые помогут мне достичь моей цели? Спасибо большое!
Я только начал изучать OpenGL.
[*]Согласно OpenGL учебник (ссылка), Я реализовал 3D-визуализацию данных метеорологического радара с использованием объема. техника рейкастинг. Однако визуализируемый эффект состоит из регулярно расположенные колонны вместо непрерывных фигур, представляющих метеорологическое эхо. [*]3D-радарное изображение, которое я хочу получить, выглядит следующим образом: громкость метеорологического радара рендеринги. Но эффект я достигнутое выглядит так: мой результат.
Ниже приведен код .frag из справочного руководства:
#версия 130 из vec4 a_color; униформа mat4 ViewMatrix; униформа mat3 NormalMatrix; равномерное плавающее фокусное_длина; равномерное плавающее соотношение сторон; униформа vec2 viewport_size; униформа vec3 ray_origin; униформа vec3 сверху; равномерное дно vec3; униформа vec3 background_color; униформа vec3 Material_color; униформа vec3 Light_position; равномерный плавающий шаг_длины; единый плавающий порог; равномерный объем сэмплера3D; равномерный джиттер сэмплера2D; равномерная плавающая гамма; однородные цвета vec3[255];// Rainbow_r, добавлено новое // Рэй структура Рэй { происхождение vec3; направление vec3; }; // Ограничительная рамка, выровненная по оси структура ААВВ { vec3 сверху; vec3 снизу; }; // Оцениваем нормаль на основе конечно-разностной аппроксимации градиента vec3 нормальный (положение vec3, плавающая интенсивность) { float d = длина_шага; float dx = текстура(объем, позиция + vec3(d,0,0)).r - интенсивность; float dy = текстура(объем, позиция + vec3(0,d,0)).r - интенсивность; float dz = текстура(объем, позиция + vec3(0,0,d)).r - интенсивность; return -normalize(NormalMatrix * vec3(dx, dy, dz)); } // Метод Slab для пересечения лучевого блока void ray_box_intersection(Луч луча, поле AABB, выходное число с плавающей запятой t_0, выходное число с плавающей запятой t_1) { vec3 направление_инв = 1,0/ray.direction; vec3 t_top = Direction_inv * (box.top — ray.origin); vec3 t_bottom = направление_inv * (box.bottom — ray.origin); vec3 t_min = min(t_top, t_bottom); vec2 t = max(t_min.xx, t_min.yz); t_0 = max(0.0, max(t.x, t.y)); vec3 t_max = max(t_top, t_bottom); т = мин(t_max.xx, t_max.yz); t_1 = мин(t.x, t.y); } // Очень простая функция передачи цвета vec4 color_transfer (плавающая интенсивность) { vec3 высокий = vec3(1,0, 0,0, 0,0); vec3 low = vec3(0,0, 0,0, 0,0); vec3 color_new = vec3(0.0, 0.0, 0.0); Плавающий индекс = интенсивность * 255; если(индекс 0 && color.a < 1,0) { интенсивность плавания = текстура (объем, позиция).r; vec4 c = color_transfer (интенсивность); // Альфа-смешивание color.rgb = c.a * c.rgb + (1 - c.a) * color.a * color.rgb; цвет.а = ок.а + (1 - ок.а) * цвет.а; длина_луча -= длина_шага; позиция += Step_vector; } // Смешиваем фон color.rgb = color.a * color.rgb + (1 - color.a) * pow(background_colour, vec3(gamma)).rgb; // Гамма-коррекция a_colour.rgb = pow(color.rgb, vec3(1.0 / гамма)); a_color.a = color.a; } Ниже приведен код привязки текстуры:
glDeleteTextures(1, &m_volume_texture); glGenTextures(1, &m_volume_texture); glBindTexture (GL_TEXTURE_3D, m_volume_texture); glTexParameteri (GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); // Массив на хосте имеет выравнивание по 1 байту glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, m_size.x(), m_size.y(), m_size.z(), 0, GL_RED, GL_UNSIGNED_BYTE, data.data()); glBindTexture (GL_TEXTURE_3D, 0); Ниже приведен параметр raycasting:
m_shaders[shader]->setUniformValue("ViewMatrix", m_viewMatrix); m_shaders[шейдер]->setUniformValue("ModelViewProjectionMatrix", m_modelViewProjectionMatrix); m_shaders[шейдер]->setUniformValue("NormalMatrix", m_normalMatrix); m_shaders[шейдер]->setUniformValue("aspect_ratio", m_aspectRatio); m_shaders[шейдер]->setUniformValue("focal_length", m_focalLength); m_shaders[шейдер]->setUniformValue("viewport_size", m_viewportSize); m_shaders[шейдер]->setUniformValue("ray_origin", m_rayOrigin); m_shaders[shader]->setUniformValue("top", m_raycasting_volume->top()); m_shaders[шейдер]->setUniformValue("дно", m_raycasting_volume->дно()); m_shaders[шейдер]->setUniformValue("background_colour", to_vector3d(m_background)); m_shaders[шейдер]->setUniformValue("light_position", m_lightPosition); m_shaders[шейдер]->setUniformValue("material_colour", m_diffuseMaterial); m_shaders[шейдер]->setUniformValue("step_length", m_stepLength); m_shaders[шейдер]->setUniformValue("порог", m_threshold); m_shaders[шейдер]->setUniformValue("гамма", m_gamma); m_shaders[шейдер]->setUniformValue("объем", 0); m_shaders[шейдер]->setUniformValue("дрожание", 1); m_shaders[шейдер]->setUniformValueArray("colors", m_rainbow_colormap.data(), m_rainbow_colormap.size()); //новое добавленное glClearColor(m_background.redF(), m_background.greenF(), m_background.blueF(), m_background.alphaF()); glClear (GL_COLOR_BUFFER_BIT); m_raycasting_volume->paint(); Ниже приведен заголовок созданного мной файла данных VTK:
# vtk DataFile версии 5.1 выход втк ДВОИЧНЫЙ НАБОР ДАННЫХ: STRUCTURED_POINTS РАЗМЕРЫ 65 501 501 РАЗМЕЩЕНИЕ 1 1 1 ПРОИСХОЖДЕНИЕ 0 0 0 POINT_DATA 16315065 СКАЛЯРЫ скаляры плавают ПРОСМОТР_ТАБЛИЦА по умолчанию А вот код Python, который я использовал для создания файла VTK:
импортировать vtk импортировать netCDF4 импортировать numpy как np nc_file = r"D:\pyCode\xiongan\code\2023072108_merge.nc" nc_ds = netCDF4.Dataset(nc_file) ref = np.array(nc_ds['ref'][:]) data_matrix = np.zeros(ref.shape, dtype=np.float64, order='F') data_matrix = ссылка Nx, Ny, Nz = data_matrix.shape dataImporter = vtk.vtkImageImport() data_string = data_matrix.tostring() dataImporter.CopyImportVoidPointer(data_string, data_matrix.nbytes) dataImporter.SetDataScalarTypeToFloat() dataImporter.SetNumberOfScalarComponents(1) dataImporter.SetDataExtent(0, Nx-1, 0, Ny-1, 0, Nz-1) dataImporter.SetWholeExtent(0, Nx-1, 0, Ny-1, 0, Nz-1) интервал = (0, 0, 0) dataImporter.SetDataSpacing(интервал) писатель = vtk.vtkDataSetWriter() Writer.SetInputConnection(dataImporter.GetOutputPort()) писатель.SetFileName('ref_2023072108.vtk') писатель.SetFileTypeToBinary() писатель.Обновить() писатель.Запись() Можете ли вы дать мне несколько советов, которые помогут мне достичь моей цели? Спасибо большое!
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу генерировать карту плитки из радарных данных Nexrad 3 -го уровня?
Anonymous » » в форуме Python - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как я могу генерировать карту плитки из радарных данных Nexrad 3 -го уровня?
Anonymous » » в форуме Python - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-