我正在尝试在Viewport2DVisual3D表面上托管WPF表单。我已经设置了相机,使控件适合窗口的宽度。默认几何体将整个表单映射到正方形面上,因此有必要进行某种转换以使表面看起来像常规的2d形式,并且不会显示为垂直拉伸。整体表格看起来还不错,但是文字不能很好地扩展,它模糊不清,并且在不同行间看起来很糟糕。以下是我尝试设置宽高比的方法:
前两个得到了我想要的结果,除了块状/模糊文本。我在这一点上得出的结论是,在将表格图像投影到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);
答案 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视觉渲染它,而不是通常用于填充屏幕?