2011-08-09 12 views
5

मेरे पास एक मॉडल है जिसे मैंने 3 डीएस मैक्स में बनाया है। मॉडल एक साधारण आयताकार है। इसकी बनावट बनावट कोऑर्डिनेट्स ओवरलैप कर रही है - मॉडल को छवि फ़ाइल का दायां आधा दो बार, साइड-बाय-साइड प्रदर्शित करना चाहिए। मैंने इस मॉडल को .obj के रूप में निर्यात किया, और इसे माइक्रोसॉफ्ट एक्सप्रेशन ब्लेंड का उपयोग करके एक्सएएमएल में परिवर्तित कर दिया।TextureCordordates एक Viewport2DVisual3D के लिए अपेक्षित काम क्यों करता है, लेकिन GeometryModel3D के लिए नहीं?

मैं मिश्रण से MeshGeometry3D ले लिया, और एक Viewport3D में जोड़ा दो तरीकों का उपयोग कर:

  1. अपने Visual के रूप में एक Label के साथ एक Viewport2DVisual3D का प्रयोग करें। बनावट छवि में Label की पृष्ठभूमि सेट करें। इस विधि का उपयोग करके, सबकुछ अपेक्षित काम करता है।
  2. ModelVisual3DGeometryModel3D के साथ Content के रूप में उपयोग करें। GeometryModel3D की सामग्री को DiffuseMaterial पर सेट करें जो छवि को उसके ब्रश के रूप में उपयोग करता है। इस विधि का उपयोग करते हुए, के TextureCoordinates को अलग-अलग व्याख्या किया जाना प्रतीत होता है।

पूरा कोड नीचे प्रदान किया गया है। कोड-पीछे 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 है:

enter image description here

यहाँ अंतिम परिणाम है। बाईं ओर Viewport2DVisual3D है, जो 3 डीएस मैक्स में समान दिखता है। दाईं ओर ModelVisual3D है, जो TextureCoordinates को अलग-अलग समझाने वाला प्रतीत होता है।

enter image description here

क्या यहाँ हो रहा है? सॉफ़्टवेयर की अन्य आवश्यकताओं के कारण मैं काम कर रहा हूं, मैं Viewport2DVisual3D का उपयोग नहीं कर सकता। मैं GeometryModel3D को TextureCoordinates सही तरीके से कैसे समझा सकता हूं?

उत्तर

5

मैं बस पर ViewportUnits स्थापित करने के लिए किया था ImageBrushAbsolute रहे हैं:

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

WPF3D टीम ब्लॉग से this post देखें:

आप BrushMappingMode.Absolute को TileBrush.ViewportUnits निर्धारित नहीं करते हैं , आपके बनावट निर्देशांक आपकी ज्यामिति के बाध्यकारी बॉक्स के सापेक्ष होंगे। उदाहरण के लिए, मान लें कि आप केवल आधे बनावट को जाल में मैप करने के लिए चाहते हैं। अन्य एपीआई में, आप बस अपने समन्वय को 0.0 -> 0.5 से लेकर सीमित करेंगे। यदि आप व्यूपोर्ट यूनिट्स को पूर्ण करने के बिना WPF3D में ऐसा करते हैं, तो यह अभी भी पूरी चीज़ को मानचित्र करेगा। अनिवार्य रूप से जब भी आप पूरे बनावट की एक प्रति नहीं चाहते हैं तो आप पूर्ण सेट करना चाहते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे