2011-08-09 7 views
5

Mam model, który utworzyłem w 3ds Max. Model jest prostym prostokątem. Tekstura ma nakładające się współrzędne tekstury - model powinien wyświetlać prawą połowę pliku obrazu dwa razy obok siebie. Wyeksportowałem ten model jako .obj i przekonwertowałem go na XAML przy użyciu narzędzia Microsoft Expression Blend.Dlaczego TextureCoordinates działa zgodnie z oczekiwaniami dla Viewport2DVisual3D, ale nie dla GeometryModel3D?

Wziąłem MeshGeometry3D z mieszaniny i dodaje się go do Viewport3D za pomocą dwóch metod:

  1. użyć Viewport2DVisual3D z Label jako jego Visual. Ustaw tło Label na obraz tekstury. Dzięki tej metodzie wszystko działa zgodnie z oczekiwaniami.
  2. Użyj ModelVisual3D z GeometryModel3D jako jego Content. Ustaw materiał GeometryModel3D na DiffuseMaterial, który wykorzystuje obraz jako pędzel. Przy użyciu tej metody, TextureCoordinates z MeshGeometry3D wydaje się być interpretowane inaczej.

Pełny kod znajduje się poniżej. Kod-tył jest pusty z wyjątkiem 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> 

Oto test.jpg:

enter image description here

Oto wynik końcowy. Po lewej stronie znajduje się Viewport2DVisual3D, który wygląda tak samo, jak w 3ds Max. Po prawej stronie znajduje się ModelVisual3D, który wydaje się różnie interpretować TextureCoordinates.

enter image description here

Co tu się dzieje? Ze względu na inne wymagania oprogramowania, nad którym pracuję, nie mogę korzystać z Viewport2DVisual3D. W jaki sposób mogę poprawnie interpretować GeometryModel3D dla ?

Odpowiedz

5

miałem tylko ustawić ViewportUnits na ImageBrush do Absolute:

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

Zobacz this post z bloga zespołu WPF3D:

Jeśli nie ustawić TileBrush.ViewportUnits do BrushMappingMode.Absolute , twoje współrzędne tekstury będą relatywne do obwiedni twojej geometrii. Na przykład, powiedzmy, że chcesz tylko połowę twojej tekstury w v, aby ją zmapować do siatki. W innych interfejsach API po prostu zakresujesz współrzędne od 0,0 do 0,5. Jeśli zrobisz to w WPF3D bez ustawienia ViewportUnits na Absolute, nadal będzie mapować całą rzecz. Zasadniczo za każdym razem, gdy nie chcesz jednej kopii całej tekstury, którą chcesz ustawić Absolute.

Powiązane problemy