将斜投影设置为数据可视化

我正在开发一个使用Directx的小应用程序,用于绘制瀑布图中的频谱数据。 它应该是这样的: 瀑布阴谋

到目前为止,我设法创建了大部分图表组件(轴,标题和数据可以绘制成线或切片,如上图所示)。 现在的问题是,我无法创建一个类似于图像中的投影。 我知道图像中显示的投影是“斜投影”,我尝试了几种方法来获得它:

  1. https://www.cs.unm.edu/~angel/CS433/LECTURES/CS433_17.pdf

在这里,作者提出投影matrix为

P = M_orth * H(θ,φ) 

其中M_orth是一个正交投影matrix, H(θ,φ)是一个定义为的剪切matrix

 H(θ,φ) = | 1 0 -cot(θ) 0 | | 0 1 -cot(φ) 0 | | 0 0 1 0 | | 0 0 0 1 | 
  1. 实用C# – 图表和graphics,第5章,第247页

这里,投影matrix被定义为

 P(α,θ) = | 1 0 cos(θ) / tan(α) 0 | | 0 1 sin(θ) / tan(α) 0 | | 0 0 0 0 | | 0 0 0 1 | 

笔者给出了两个特例:

  • 骑士投影:alpha = 45°,30 <= theta <= 45
  • 橱柜投影:α= 63.4°,30 <=θ<= 45

但他们都没有给我很好的结果:

在这里输入图像描述

而我不明白为什么我会得到这个奇怪的结果? 你们中的任何人都知道如何正确设置斜投影?

提前致谢

结果发现,设置斜投影非常简单。 为了使它在D3D11上工作,斜投影应该由两个matrix组成:

 P(α,θ)= S(α,θ)* M_orth

哪里

M_orth是正交投影matrix,而S(α,θ)剪切matrix由下式给出:

 S(α,θ)= |  1 0 0 0 |
          |  0 1 0 0 |
          |  ab 1 0 |
          |  0 0 0 1 |

 a = cos(θ)/ tan(α) 

 b = sin(θ)/ tan(α)

这些是我得到的结果:

倾斜投影