Tengo un modelo que creé en 3ds Max. El modelo es un rectángulo simple. Su textura tiene coordenadas de textura superpuestas: el modelo debe mostrar la mitad derecha del archivo de imagen dos veces, una al lado de la otra. Exporté este modelo como .obj
y lo convertí a XAML usando Microsoft Expression Blend.¿Por qué TextureCoordinates funciona como se espera para Viewport2DVisual3D, pero no para GeometryModel3D?
que tomaron la MeshGeometry3D
de mezcla, y se añade a una Viewport3D
utilizando dos métodos:
- utilizar un
Viewport2DVisual3D
con unLabel
como suVisual
. Establezca el fondo deLabel
en la imagen de textura. Usando este método, todo funciona como se espera. - Utilice un
ModelVisual3D
con unGeometryModel3D
comoContent
. Establezca el materialGeometryModel3D
en unDiffuseMaterial
que utiliza la imagen como su pincel. Con este método, elTextureCoordinates
delMeshGeometry3D
parece interpretarse de manera diferente.
El código completo se proporciona a continuación. El código subyacente está vacía a excepción de 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>
Aquí es test.jpg
:
Este es el resultado final. A la izquierda está el Viewport2DVisual3D
, que tiene el mismo aspecto que en 3ds Max. A la derecha está el ModelVisual3D
, que parece interpretar el TextureCoordinates
de manera diferente.
lo que está pasando aquí? Debido a otros requisitos del software en el que estoy trabajando, no puedo usar un Viewport2DVisual3D
. ¿Cómo puedo hacer que GeometryModel3D
interprete correctamente el TextureCoordinates
?