Я пытаюсь разместить форму WPF на поверхности Viewport2DVisual3D. Я настроил камеру так, чтобы элементы управления соответствовали ширине окна. По умолчанию геометрия отображает всю форму на квадратную грань, поэтому необходимо сделать какое-то преобразование, чтобы поверхность выглядела как обычная 2d-форма и не выглядела растянутой по вертикали. Форма выглядит нормально, но текст не масштабируется хорошо, он размытый и блочный и выглядит по-разному от линии к строке. Вот что я пытался установить соотношение сторон:Viewport2DVisual3D размытый текст на элементах управления WPF
- ScaleTransform3D
- Установка сетки позиции в правильное соотношение сторон
- Установка TextureCoordinates для правильного соотношения сторон
первые два получить мне результаты, которые я хочу, за исключением блочного/размытого текста. Мой вывод на этом этапе заключается в том, что рендеринг шрифта происходит до того, как изображение формы проецируется на трехмерную поверхность, а затем происходит масштабирование, поэтому оно будет выглядеть плохо, несмотря ни на что. Кто-нибудь знает способ обойти это или установить его с самого начала? Я не знаю много о 3D-графике, достаточно базовой математики, чтобы получить правильные углы камеры и т. Д.
Протестировано на Win 7 и XP.
Некоторые из ресурсов, которые я использовал:
- http://www.codeproject.com/KB/WPF/ContentControl3D.aspx
- http://pavanpodila.spaces.live.com/blog/cns!9C9E888164859398!151.entry
Несколько фрагментов кода:
<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);
Какую версию .NET вы используете? –
Я нахожусь на .NET 4.0. – flatline
Вы пробовали SnapsToDevicePixels = "True" –