Viewport2DVisual3D размытый текст на элементах управления WPF - PullRequest
2 голосов
/ 12 ноября 2010

Я пытаюсь разместить форму WPF на поверхности Viewport2DVisual3D. Я настроил камеру так, чтобы элементы управления соответствовали ширине окна. Геометрия по умолчанию отображает всю форму на квадратную грань, поэтому необходимо выполнить какое-то преобразование, чтобы поверхность выглядела как обычная 2d форма и не выглядела растянутой по вертикали. Форма в целом выглядит хорошо, но текст плохо масштабируется, он размытый и блочный и выглядит по-разному от строки к строке. Вот что я пытался установить соотношение сторон:

  • A ScaleTransform3D
  • Настройка сетки для правильного соотношения сторон
  • Установка текстурных координат для правильного соотношения сторон

Первые два дают мне результаты, которые я хочу, за исключением блочного / размытого текста. В этот момент я пришел к выводу, что рендеринг шрифта происходит до того, как изображение формы проецируется на трехмерную поверхность, а затем происходит масштабирование, поэтому оно будет выглядеть плохо, несмотря ни на что. Кто-нибудь знает способ обойти это или настроить его с самого начала? Я не очень разбираюсь в трехмерной графике, просто достаточно математики, чтобы правильно настроить угол обзора камеры и т. Д.

Протестировал на 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 ]

3 голосов
/ 26 апреля 2011

Чтобы избежать размытого текста и других визуальных искажений, сделайте соотношение сторон 3D XY равным соотношению сторон 2D-управления. Это достигается установкой X и Y MeshGeometry3D.Positions. Например, двумерный элемент управления размером 500x700 может быть сопоставлен с прямоугольной трехмерной сеткой без искажений путем назначения позиций

<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>

Изображение 2D-элемента управления, отображаемое в 3D-среде, всегда "растягивается" до размеров сетки.

0 голосов
/ 12 ноября 2010

Вы будете рендерить форму WPF на текстуру на квадрате, а затем отображать квадрат с помощью движка текстур GPU.В зависимости от режима, используемого движком текстур, это может привести к блочности или размытости (так как движок текстур будет пытаться интерполировать текстуру по умолчанию).

Почему вы хотите визуализировать его с использованием трехмерного изображения, а не обычно, если оно предназначено для заполнения экрана?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...