2011-03-08 106 views
8

我有一张图片,我想通过WPF中的梯形进行缩放/拉伸。有没有一个简单的方法来做到这一点?我想实现3D效果/透视/弯曲。基本上采用2D图像并在3D空间中弯曲。梯形上的C#/ WPF图像转换

这是我想要完成的任务:

original:   new: 

* *    * * 

* *    *  * 

另外要注意的,我想这能非常快的发生。我尝试使用此代码,并且性能无法使用:http://www.vcskicks.com/image-distortion.php

任何帮助将不胜感激。提前感谢!

回答

10

我认为最简单的方法就是使用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> 
+0

谢谢,我看这一点。我的最终目标是将3D Matrix变换应用于图像并将其显示在2D空间中。我还需要使用视口吗? – 2011-03-08 20:35:19

+0

@Greg也许有一些库(它是有道理的),这样的UserControl可能很简单。但是你不能用MatrixTransform类来做到这一点,它只是2D。也许如果你没有找到任何东西并自己创建,你可以发布它。我至少在SO之前看过这个问题(但无法找到它),所以人们对此感兴趣。 – 2011-03-08 20:46:33

+0

得到一个真实的样品会很棒,因为这些东西都不是我正在寻找的东西。由于它不是一个直接的应用程序,所以很难将一个工作演示放在一起。 – 2011-03-09 15:07:00