我正在使用Windows.Media.Media3D工具包将一个DirectX应用程序移植到WPF中。它工作得很好,除了模型是完整呈现的,即使它已经获得了所有可能的数据。
我怀疑这是因为DirectX优化并以某种方式平滑或帮助渲染额外的内容,这取决于顶点和索引。
所以我想知道是否有一个选项来改变WPF渲染3D模型的方式?要准确表达我的意思有点困难,但我希望它是可以理解的。
下面是重要的代码:
private void DrawModel()
{
SwordModel swordModel;
string filename = "PG_S8_02";
using(FileStream stream = File.OpenRead(string.Format("Media/Models/{0}.gb", filename)))
using(BinaryReader reader = new BinaryReader(stream))
{
swordModel = new SwordModel(reader);
}
var group = new Model3DGroup();
foreach(var modelMesh in swordModel.Meshes)
{
var mesh3D = new MeshGeometry3D();
// Indices
foreach(var index in modelMesh.Indices)
{
mesh3D.TriangleIndices.Add(index);
}
// Vertices
foreach(var vertex in modelMesh.Vertices)
{
mesh3D.Positions.Add(vertex);
}
// Normals
foreach(var normal in modelMesh.Normals)
{
mesh3D.Normals.Add(normal);
}
// Texture Coordinates
foreach(var vertex in modelMesh.Vertices)
{
mesh3D.TextureCoordinates.Add(new Point(vertex.X, vertex.Y));
}
// Material
var material = new DiffuseMaterial();
var texture = new BitmapImage(new Uri(
string.Format("Media/Textures/{0}.png", filename),
UriKind.RelativeOrAbsolute
));
material.Brush = new ImageBrush(texture);
// Add to View
group.Children.Add(
new GeometryModel3D(mesh3D, material)
);
}
mainViewport.Children.Add(
new ModelVisual3D() { Content = group }
);
}
和XAML:
<Viewport3D Name="mainViewport" ClipToBounds="True">
<Viewport3D.Camera>
<PerspectiveCamera
FarPlaneDistance="100"
LookDirection="-11,-10,-9"
UpDirection="0,1,0"
NearPlaneDistance="1"
Position="11,10,9"
FieldOfView="70" />
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="White" Direction="-2,-3,-1" />
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
发布于 2009-06-03 00:02:27
我能想到的唯一一件事是法线没有被平滑,但是如果没有看到网格的样子,我就不能确定了。
我的意思是,顶点法线与面法线平行,这给了网格一个分面的外观。如果法线是平滑的,那么整个形状看起来都是平滑的。如下所示:
平面着色:
http://www.forman.free-online.co.uk/images/flatshading.png
平滑着色:
http://www.forman.free-online.co.uk/images/smoothshading.png
图片被链接替换,限制我的带宽使用
发布于 2009-06-02 23:51:21
侧向有什么问题吗?默认情况下,我认为WPF呈现的是单面--你不能从“错误”的一面看到它们。
与照明类似,如果你的模型没有从所有方向照明,你可以得到奇怪的效果-尝试放入一个AmbientLight
https://stackoverflow.com/questions/943309
复制