3

情况

我正在实现一个高度字段编辑器,有两个视图。主视图以 3D 显示高度字段,启用轨迹球导航。编辑视图将高度字段显示为 2D 图像。
在这个高度场的顶部,可以应用新的图像,改变它的外观(切割孔、降低、升高特定区域)。这称为补丁
高度场和补丁都是一个通道灰度 png 图像。

对于可视化,我使用可视化库框架 (c++) 和 OpenGL 4。

任务
实现一个绘图工具,在 2D 编辑视图(正交投影)中可用,它在运行时创建这个补丁(作为单独的图像)。

重要说明/限制

  • 高度场的图像可以缩放、旋转和转置。
  • 补丁需要与高度场具有相同的比例,因此补丁中的一个像素正好覆盖高度场中的一个像素。
  • 由于缩放,帧缓冲区像素的大小可能大于或小于高度场/补丁图像像素的大小。
  • 场景包含不应出现在补丁中的对象(例如:指向箭头)。

问题 什么是完成这项任务的正确方法?到目前为止,我有以下想法:

  • 使用某种 QT 画布创建补丁,然后将其映射到高度场图像提案并将其保存为新补丁。这将在每次用户开始绘图时完成,这样实现撤消将很容易(删除最后创建的补丁)。
  • 将中性色图像与 textre 缓冲区对象结合使用,自己实现某种画布。这样,每次用户停止绘制画布的内容时,都会将其映射到高度字段并保存为补丁。为下一幅画重置画布。
  • 下面是一些使用帧缓冲区对象的示例。但是我不确定这种方法是否符合我的需求。当我使用 open gl 将子图像绘制到帧缓冲区中时,结果图像是否包含所有数据?
4

1 回答 1

1

这是我最终的结果:

我使用可视化库的 PickIntersector 在编辑视图中再次选择高度场图像。这会产生图像的局部坐标。转换为 uv 坐标,然后转换为像素坐标。这在用户按下鼠标按钮时完成,并且当鼠标移动到图像上方时继续发生。

我有一个 PatchCanvas 类,它收集了所有这些点。在命令上,它使用Anti-Grain Geometry库来精确地光栅化可以从点构造的线。

完成后,光栅化图像被分割成一个固定大小的网格。扫描每块瓷砖的颜色与中性瓷砖不同。仅包含中性色的图块将被丢弃。另一个按照适当的命名模式保存,可以在下一帧中加载。

Agg 支持不同大小的行。这没有实现 jet,但想法是选择屏幕空间中的相邻点,获取这些 uv 坐标,将它们转换为像素并将其用作线条粗细。这应该会导致缩小视图的范围更广。

于 2011-08-19T13:58:03.690 回答