WPF控件上的Viewport2DVisual3D模糊文本

时间:2010-11-12 16:52:49

标签: wpf 3d

我正在尝试在Viewport2DVisual3D表面上托管WPF表单。我已经设置了相机,使控件适合窗口的宽度。默认几何体将整个表单映射到正方形面上,因此有必要进行某种转换以使表面看起来像常规的2d形式,并且不会显示为垂直拉伸。整体表格看起来还不错,但是文字不能很好地扩展,它模糊不清,并且在不同行间看起来很糟糕。以下是我尝试设置宽高比的方法:

  • ScaleTransform3D
  • 将网格位置设置为适当的宽高比
  • 将TextureCoordinates设置为适当的宽高比

前两个得到了我想要的结果,除了块状/模糊文本。我在这一点上得出的结论是,在将表格图像投影到3d表面上然后进行缩放之前,字体渲染就会发生,因此无论如何都会看起来很糟糕。有没有人知道解决这个问题的方法或从一开始就设置它?我不太了解3D图形,只是足够的基本数学来使摄像机角度正确等等。

已在Win 7和XP上测试过。

我使用过的一些资源:

代码的几个片段:

<Viewport2DVisual3D.Geometry>
    <MeshGeometry3D x:Name="FrontFaceGeometry"                            
        Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
        TextureCoordinates="0,0 0,1 1,1 1,0" 
        TriangleIndices="0 1 2 0 2 3"/>
</Viewport2DVisual3D.Geometry>

...

<Grid Width="500" x:Name="FrontFaceGrid">

然后在Window_Loaded例程中,例如

var aRatio = FrontFaceGrid.ActualHeight / FrontFaceGrid.ActualWidth;
FrontFaceGeometry.Positions[0] = new System.Windows.Media.Media3D.Point3D(-1, aRatio, 0);
FrontFaceGeometry.Positions[1] = new System.Windows.Media.Media3D.Point3D(-1, -aRatio, 0);
FrontFaceGeometry.Positions[2] = new System.Windows.Media.Media3D.Point3D(1, -aRatio, 0);
FrontFaceGeometry.Positions[3] = new System.Windows.Media.Media3D.Point3D(1, aRatio, 0);

2 个答案:

答案 0 :(得分:3)

为避免模糊文本和其他视觉扭曲,使3D XY纵横比等于2D控制纵横比。这是通过设置X和Y MeshGeometry3D.Positions来实现的。例如,通过分配位置,可以将尺寸为500x700的2D控件映射到矩形3D网格而不会失真

<Viewport2DVisual3D.Geometry>
    <MeshGeometry3D x:Name="FrontFaceGeometry"                            
        Positions="-2.5,3.5,0 -2.5,-3.5,0 2.5,-3.5,0 2.5,3.5,0"
        TextureCoordinates="0,0 0,1 1,1 1,0" 
        TriangleIndices="0 1 2 0 2 3"/>
</Viewport2DVisual3D.Geometry>

3D环境中显示的2D控件的图像始终“拉伸”到网格的尺寸。

答案 1 :(得分:0)

您将WPF表单渲染到正方形上的纹理上,然后使用GPU的纹理引擎显示正方形。根据纹理引擎使用的模式,这可能会导致阻塞或模糊(因为纹理引擎默认会尝试插入纹理)。

为什么要使用3D视觉渲染它,而不是通常用于填充屏幕?