2011-08-09 16 views
5

Tôi có một mô hình mà tôi đã tạo trong 3ds Max. Mô hình là một hình chữ nhật đơn giản. Kết cấu của nó có các tọa độ kết cấu chồng chéo - mô hình sẽ hiển thị nửa bên phải của tệp hình ảnh hai lần, cạnh nhau. Tôi đã xuất mô hình này dưới dạng .obj và chuyển đổi mô hình này thành XAML bằng cách sử dụng Microsoft Expression Blend.Tại sao TextureCoordinates hoạt động như mong đợi cho một Viewport2DVisual3D, nhưng không phải cho một GeometryModel3D?

Tôi đã MeshGeometry3D từ sự pha trộn, và thêm nó vào một Viewport3D sử dụng hai phương pháp:

  1. Sử dụng một Viewport2DVisual3D với một Label như Visual của nó. Đặt nền của Label thành hình ảnh kết cấu. Sử dụng phương pháp này, mọi thứ hoạt động như mong đợi.
  2. Sử dụng ModelVisual3D với GeometryModel3D làm Content. Đặt tài liệu của GeometryModel3D thành DiffuseMaterial sử dụng hình ảnh làm bút vẽ. Sử dụng phương pháp này, TextureCoordinates của số MeshGeometry3D có vẻ được diễn giải khác nhau.

Mã đầy đủ được cung cấp bên dưới. Code-behind rỗng trừ 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> 

Đây là test.jpg:

enter image description here

Dưới đây là kết quả cuối cùng. Ở bên trái là Viewport2DVisual3D, trông giống như trong 3ds Max. Ở bên phải là ModelVisual3D, dường như diễn giải một cách khác nhau là TextureCoordinates.

enter image description here

Điều gì đang xảy ra ở đây? Do các yêu cầu khác của phần mềm tôi đang làm việc, tôi không thể sử dụng Viewport2DVisual3D. Làm cách nào để tạo GeometryModel3D giải thích chính xác TextureCoordinates?

Trả lời

5

Tôi chỉ phải thiết lập ViewportUnits trên ImageBrush để Absolute:

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

Xem this post từ nhóm WPF3D blog:

Nếu bạn không đặt TileBrush.ViewportUnits để BrushMappingMode.Absolute , tọa độ kết cấu của bạn sẽ tương ứng với hộp giới hạn của hình học của bạn. Ví dụ, giả sử bạn chỉ muốn một nửa kết cấu của bạn trong v được ánh xạ tới lưới. Trong các API khác, bạn chỉ cần sắp xếp tọa độ của mình từ 0,0 -> 0,5. Nếu bạn làm điều đó trong WPF3D mà không cần thiết lập ViewportUnits to Absolute, nó vẫn sẽ vẽ toàn bộ đồ vật. Về cơ bản bất cứ lúc nào bạn không muốn một bản sao của toàn bộ texture bạn sẽ muốn thiết lập Absolute.

Các vấn đề liên quan