2011-08-09 7 views
5

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:

  1. utilizar un Viewport2DVisual3D con un Label como su Visual. Establezca el fondo de Label en la imagen de textura. Usando este método, todo funciona como se espera.
  2. Utilice un ModelVisual3D con un GeometryModel3D como Content. Establezca el material GeometryModel3D en un DiffuseMaterial que utiliza la imagen como su pincel. Con este método, el TextureCoordinates del MeshGeometry3D 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:

enter image description here

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.

enter image description here

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?

Respuesta

5

sólo tenía que establecer ViewportUnits en el ImageBrush a Absolute:

<ImageBrush x:Key="brush" ImageSource="img/test.jpg" ViewportUnits="Absolute" /> 

Ver this post desde el blog del equipo de WPF3D:

Si no se establece TileBrush.ViewportUnits a BrushMappingMode.Absolute , sus coordenadas de textura serán relativas al cuadro delimitador de su geometría. Por ejemplo, supongamos que solo quieres que la mitad de tu textura en v se asigne a la malla. En otras API, deberías ubicar tus coordenadas entre 0.0 -> 0.5. Si haces eso en WPF3D sin establecer ViewportUnits en Absolute, seguirá mapeando todo. Esencialmente, en cualquier momento que no quieras una copia de la textura completa, querrás configurar Absoluta.

Cuestiones relacionadas