2010-11-12 2 views
2

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

  • ScaleTransform3D
  • Установка сетки позиции в правильное соотношение сторон
  • Установка TextureCoordinates для правильного соотношения сторон

первые два получить мне результаты, которые я хочу, за исключением блочного/размытого текста. Мой вывод на этом этапе заключается в том, что рендеринг шрифта происходит до того, как изображение формы проецируется на трехмерную поверхность, а затем происходит масштабирование, поэтому оно будет выглядеть плохо, несмотря ни на что. Кто-нибудь знает способ обойти это или установить его с самого начала? Я не знаю много о 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

Какую версию .NET вы используете? –

+0

Я нахожусь на .NET 4.0. – flatline

+0

Вы пробовали SnapsToDevicePixels = "True" –

ответ

0

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

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

+0

Я хотел выполнить 3d-переходы между двумя формами.В частности, я намерен перевернуть форму по оси Y (при условии, что ось z обращена к вам), чтобы показать другую форму на оборотной стороне. 3D-материал, запеченный в WPF, сделал это на удивление легким с первого раза, я просто хотел бы выглядеть немного чище с масштабированием. – flatline

+0

Отображение формы обычно, просто используя 3D для перехода. –

3

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

Изображения контроля 2D отображаемого в среде 3D всегда «растянутые» до размеров меша.

Смежные вопросы