视口2dVisual3D WPF控件上的模糊文本

视口2dVisual3D WPF控件上的模糊文本,wpf,3d,Wpf,3d,我正在尝试在Viewport2DVisual3D曲面上承载WPF表单。我已经设置好照相机,使控制装置与窗口的宽度相适应。默认几何图形将整个形状映射到一个方形面上,因此需要进行某种变换,以使曲面看起来像常规二维形状,而不是垂直拉伸。表单整体上看起来不错,但文本缩放不好,它模糊、块状,从一行到另一行的方式都不一样。以下是我尝试设置纵横比的内容: ScaleTransform3D 将网格位置设置为适当的纵横比 将纹理坐标设置为适当的纵横比 前两个可以得到我想要的结果,除了块状/模糊的文本。在这一点

我正在尝试在Viewport2DVisual3D曲面上承载WPF表单。我已经设置好照相机,使控制装置与窗口的宽度相适应。默认几何图形将整个形状映射到一个方形面上,因此需要进行某种变换,以使曲面看起来像常规二维形状,而不是垂直拉伸。表单整体上看起来不错,但文本缩放不好,它模糊、块状,从一行到另一行的方式都不一样。以下是我尝试设置纵横比的内容:

  • ScaleTransform3D
  • 将网格位置设置为适当的纵横比
  • 将纹理坐标设置为适当的纵横比
前两个可以得到我想要的结果,除了块状/模糊的文本。在这一点上,我的结论是,字体渲染是在表单图像投影到3d曲面上之前发生的,然后发生缩放,因此无论发生什么情况,它看起来都很糟糕。有没有人知道如何解决这个问题,或者从一开始就设置它?我对3d图形了解不多,只知道足够的基本数学知识来确定相机的角度,等等

已经在Win7和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>

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


如果要填充屏幕,为什么要使用三维视觉渲染而不是正常渲染?

为了避免文本模糊和其他视觉扭曲,请使三维XY纵横比等于二维控制纵横比。这是通过设置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控件的图像始终“拉伸”到网格的尺寸。

您使用的是哪个版本的.NET?是否尝试了SnapsToDevicePixels=“True”我想在两个窗体之间执行3D转换。具体来说,我的意图是翻转y轴上的形状(假设z轴面向您),以显示背面的另一个形状。在WPF中烘焙的3d元素使这一点乍一看非常简单,我只是希望它在缩放时看起来更干净一些。正常显示表单,只是使用3d进行转换。
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);
<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>