У меня есть модель, которую я создал в 3ds Max. Модель представляет собой простой прямоугольник. Его текстура имеет перекрывающиеся координаты текстуры - модель должна отображать правую половину файла изображения дважды, бок о бок. Я экспортировал эту модель как .obj
и преобразовал ее в XAML с помощью Microsoft Expression Blend.
Я взял MeshGeometry3D
из blend и добавил его в Viewport3D
с использованием двух методов:
Viewport2DVisual3D
с меткой Label
в качестве его Visual
. Установите фон Label
на изображение текстуры. Используя этот метод, все работает, как ожидалось. ModelVisual3D
с GeometryModel3D
в качестве его Содержимого
. Установите материал GeometryModel3D
на DiffuseMaterial
, который использует изображение в качестве кисти. При использовании этого метода Координаты текстуры
из MeshGeometry3D
, по-видимому, интерпретируются по-другому. Полный код приведен ниже. Код программной части пуст, за исключением InitializeComponent ()
:
<Window x:Class="TestTextureCoordinates.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<MeshGeometry3D x:Key="geometry"
Normals="0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1"
Positions="113.8997,102.4171,0 148.9045,102.4171,0 148.9045,148.41161,0 113.8997,148.41161,0 184.5722,102.4171,0 184.5722,148.41161,0 148.9045,148.41161,0 148.9045,102.4171,0"
TextureCoordinates="0.50639999,0.9995 1.0065,0.9995 1.0065,0.00050002337 0.50639999,0.00050002337 1.0022,0.9995 1.0022,0.00050002337 0.5,0.00050002337 0.5,0.9995"
TriangleIndices="0 1 2 0 2 3 4 5 6 4 6 7"/>
<ImageBrush x:Key="brush" ImageSource="img/test.jpg" />
</Grid.Resources>
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="195,125,210" LookDirection="0,0,-1" />
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<AmbientLight Color="White" />
</ModelVisual3D.Content>
</ModelVisual3D>
<!-- The first model, using a Viewport2DVisual3D. This works as intended. -->
<Viewport2DVisual3D Geometry="{StaticResource geometry}">
<Viewport2DVisual3D.Visual>
<Label Background="{StaticResource brush}" />
</Viewport2DVisual3D.Visual>
<Viewport2DVisual3D.Material>
<DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" />
</Viewport2DVisual3D.Material>
</Viewport2DVisual3D>
<!-- The second model, using a ModelVisual3D and GeometryModel3D. The TextureCoordinates do not work as intended. -->
<ModelVisual3D>
<!-- We apply a transform to offset this model from the first model. -->
<ModelVisual3D.Transform>
<TranslateTransform3D OffsetX="90" />
</ModelVisual3D.Transform>
<ModelVisual3D.Content>
<GeometryModel3D Geometry="{StaticResource geometry}">
<GeometryModel3D.Material>
<DiffuseMaterial Brush="{StaticResource brush}" />
</GeometryModel3D.Material>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
</Grid>
Вот test.jpg
:
Вот окончательный результат. Слева находится Viewport2DVisual3D
, который выглядит так же, как и в 3ds Max. Справа находится ModelVisual3D
, который, по-видимому, интерпретирует Координаты текстуры
по-другому.
Что здесь происходит? Из-за других требований программного обеспечения, над которым я работаю, я не могу использовать Viewport2DVisual3D
. Как я могу заставить GeometryModel3D
правильно интерпретировать TextureCoordinates
?