5

3dsMaxで作成したモデルがあります。モデルは単純な長方形です。そのテクスチャには重複するテクスチャ座標があります。モデルは、画像ファイルの右半分を2回並べて表示する必要があります。このモデルをとしてエクスポートし、.objMicrosoftExpressionBlendを使用してXAMLに変換しました。

MeshGeometry3Dfromブレンドを取得し、Viewport3D2つの方法を使用してに追加しました。

  1. としてaViewport2DVisual3Dを使用します。の背景をテクスチャ画像に設定します。この方法を使用すると、すべてが期待どおりに機能します。LabelVisualLabel
  2. としてaModelVisual3Dを使用します。のマテリアルを、画像をブラシとして使用するに設定します。この方法を使用すると、のは異なって解釈されるように見えます。GeometryModel3DContentGeometryModel3DDiffuseMaterialTextureCoordinatesMeshGeometry3D

完全なコードを以下に示します。コードビハインドは、以下を除いて空です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ます:

ここに画像の説明を入力してください

これが最終結果です。左側は、Viewport2DVisual3D3dsMaxの場合と同じように見えます。右側は、とは異なるModelVisual3D解釈をしているように見えるです。TextureCoordinates

ここに画像の説明を入力してください

何が起きてる?私が取り組んでいるソフトウェアの他の要件のため、私はを使用できませんViewport2DVisual3D。どうすれば正しくGeometryModel3D解釈できますか?TextureCoordinates

4

1 に答える 1

7

私はただに設定ViewportUnitsする必要がありImageBrushましたAbsolute

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

WPF3Dチームのブログからこの投稿を参照してください。

TileBrush.ViewportUnitsをBrushMappingMode.Absoluteに設定しない場合、テクスチャ座標はジオメトリのバウンディングボックスを基準にします。たとえば、vのテクスチャの半分だけをメッシュにマッピングするとします。他のAPIでは、座標を0.0->0.5の範囲にするだけです。ViewportUnitsをAbsoluteに設定せずにWPF3Dでこれを行った場合でも、全体がマップされます。基本的に、テクスチャ全体のコピーが1つ必要ない場合は、絶対値を設定する必要があります。

于 2011-08-10T19:03:59.963 に答える