我認爲最簡單的方法就是使用WPF 3D。只需設置一個帶有透視投影的視口,並在內容被轉換的地方放置一個四邊形,GPU就會完成剩下的工作。
WPF有一個非常不錯的MatrixTransform類,它提供幾乎任何東西的GPU加速轉換(及其衍生物,它簡化了旋轉轉換的應用)。可悲的是,梯形變換不可能用簡單的矩陣變換,它們在數學上限於縮放,剪切和旋轉(及其組合)。
編輯:你也可以看到一些例子here,3D在WPF中確實微不足道。
編輯2:
這裏是代碼,其顯示在透視圖中顯示的普通按鈕。不要試圖與它互動,谷歌「WPF Interactive3D」,如果你想。
如果您只希望在3D視圖中顯示圖像,則不必使用VisualBrush。
此外,如果您確實希望映射的內容適合視口的邊緣,則必須修正座標,您可能必須進行大量試驗或計算座標。如果你得到了一些好的東西(如清理代碼後,我只是編輯了一個我在某處找到的示例),則可以發佈結果。
你現在正式欠我你的靈魂:d
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<Viewport3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-0.5 0.5 -0.5, 0.5 0.5 -0.5,
-0.5 0 0.5, 0.5 0 0.5"
TriangleIndices=" 0 2 1, 1 2 3"
TextureCoordinates="0 0, 1 0, 0 1, 1 1" />
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<VisualBrush>
<VisualBrush.Visual>
<Button>Hi</Button>
</VisualBrush.Visual>
</VisualBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<!-- Non-Affine Matrix Transform. -->
<GeometryModel3D.Transform>
<MatrixTransform3D>
</MatrixTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
<!-- Light sources. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<AmbientLight Color="#404040" />
<DirectionalLight Color="#C0C0C0" Direction="0 -2 -1" />
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
<!-- Camera. -->
<Viewport3D.Camera>
<PerspectiveCamera Position="0 0.2 1"
LookDirection="0 0 -1.5"
UpDirection="0 1 0"
FieldOfView="100">
</PerspectiveCamera>
</Viewport3D.Camera>
</Viewport3D>
</DockPanel>
</Window>
謝謝,我看這一點。我的最終目標是將3D Matrix變換應用於圖像並將其顯示在2D空間中。我還需要使用視口嗎? – 2011-03-08 20:35:19
@Greg也許有一些庫(它是有道理的),這樣的UserControl可能很簡單。但是你不能用MatrixTransform類來做到這一點,它只是2D。也許如果你沒有找到任何東西並自己創建,你可以發佈它。我至少在SO之前看過這個問題(但無法找到它),所以人們對此感興趣。 – 2011-03-08 20:46:33
得到一個真實的樣品會很棒,因爲這些東西都不是我正在尋找的東西。由於它不是一個直接的應用程序,所以很難將一個工作演示放在一起。 – 2011-03-09 15:07:00