WPF疑难杂症之一(3D场景)
最近2个月一直在学习WPF,在实际的开发中遇到下面一个3D场景有关的问题,我先给出问题代码:
首先是在资源中定义了一个3D变换组:
<Window x:Class="Viewer3D.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Viewer3D"
<Window.Resources>
<!--Add a Transform resource-->
<Transform3DGroup x:Key="Trans3D">
//这里省略若干代码
</Transform3DGroup>
</Window.Resources>
然后建立一个Viewport3D,其中包含有多个的3D模型:(不包括红色代码)
<Viewport3D Name="View3D">
<!-- Add a camera. -->
<Viewport3D.Camera>
<PerspectiveCamera ....../>
</Viewport3D.Camera>
<!-- Add a model. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup Transform="{StaticResource Trans3D}">
<AmbientLight Color="White"/>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-1 -1 0 1 -1 0 1 1 0 -1 1 0"
Normals="0 0 1 0 0 1 0 0 1 0 0 1"
TextureCoordinates="-1 1 0 1 0 0 -1 0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
<!--添加一个3D模型 Material.-->
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="E:\2.jpg"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
</GeometryModel3D>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-0.5 -0.5 0 0.5 -0.5 0 0.5 0.5 0 -0.5 0.5 0"
Normals="0 0 1 0 0 1 0 0 1 0 0 1"
TextureCoordinates="0 0.5 0.5 0.5 0.5 0 0 0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
<!--Add a image material.-->
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="E:\2.jpg"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Transform>
<TranslateTransform3D
OffsetX="-0.2" OffsetY="0.1" OffsetZ="-0.5" >
</TranslateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
我在场景中添加了两个图片,并给ModelGroup应用了资源中的3D变换。最后的效果如下:
但是这个效果图片中出现了一个非常奇怪的问题,大家可以看小图中有向左倾斜的条纹出现。这不是我期望的结果。最后通过多次的试验发现图像的TranslateTransform对此有影响,但是我上面的3D变换中没有用到TranslatsForm,只是使用了旋转变换和坐标大小的映射。最后不得已在GeometryModel3D添加了一个TranslatsForm解决问题(红色显示的代码)。现在感觉仍很是纳闷,真正的原因还有待进一步探索!