Windows Presentation Foundation (WPF) 3D 教程(二)----3D模型基本知识

当我开始WPF的3D图形时,我不知道我在干什么。关于网格(Mesh),三角顶点(triangle index),向量等的意义,我没有任何提示。这是学习3D模型最痛苦的部分,因为只要有一点点的错误理解,WPF就不会显示正确结果(或者你会比较幸运)。总之,你需要真正弄明白什么是网格(mesh),并且它是由什么组成的。


什么是网格(Mesh)?

网格是表面(surface)的基本表征。网格通过点线系统来表征一个表面(surface),点用来描述表面区域的高和低,线连接点确保你从一个点到另外一个点。


一个完整的mesh由以下内容组成:
    网格坐标
    三角索引
    三角向量
 

Mesh坐标


Mesh的坐标就是surface上一个单一的点,点越密集,surface中的Mesh描述的就越精确。

 

Triangle Indeces
三角索引


三角索引就是一个网格坐标,它是网格中一个三角形中三个顶点中的一个。仅仅单单一些网格坐标不能描述网格三角。在坐标添加之后,你需要定义那些坐标定义那些三角形。


在WPF中,加入网格坐标的顺序非常重要。当添加坐标的时候,坐标集合中一个坐标的索引值会被用到。举个例子,假设说你有一个surface由5个坐标组成(p0,p1,p2,p3,p4),如果你想通过p1,p3,p4来定义一个三角形,你需要添加三角索引(triangle indeces)1,3,4(与p1,p3,p4点的索引相同)。如果坐标点的添加顺序是{ p3, p4, p0, p2, p1},并且你想定义一个相同的三角形,你需要加入的三角索引(triangle indeces)就是4,0,1。


添加三角索引的顺序也十分重要,当你定义了一个三角形,你基本上确定了顺时针或者逆时针的点(当然了这取决于你在三角形的那一侧)。它重要的原因是因为它影响三角形的哪一面是可见的。这里所说的“侧”,指的不是三角形三个边的侧面,而是平面的两侧。


假设说你从前面直视一个三角形的表面,如果你按顺时针方向定义它的索引,那么你所看的那一面是不可见的,而相反的一面是可以看到的。如果你按逆时针方向定义三角形索引,你所看的那一面是可见的,相反的一侧不可见。你可以使用“右手定则”去记住它。伸出你的右手,做“牛B”状。手肢卷曲的方向是逆时针,大拇指所指的方向是可见的。
 
我无法精确理解右手法则为什么应用于索引序列。我猜是因为wpf不认为渲染三角形的两个面是必须而且高效的,所以需要选择其中一面。

三角法线


在定义坐标和三角索引之后,你需要对每一个坐标添加一个三角法线。正如你添加到三角索引中的方向决定了三角形的那一面是可见的,wpf中的法线决定光源如何照射表面。


法线是一个垂直于三角形表面的向量。法线用“叉积”计算,两个向量分别是三角形的两个边。如果你通过A, B, 和 C三个点定义了三角形,你可以用AB x AC, BC x BA, 或CB x CA来计算这个法线。这三种方法的结果是一样的。当然了,在这里右手法则同样有效,AB x AC 和AC x AB所得的法线方向刚好相反。
 
通常,你希望你的法线方向和可见方向是相同的。当然,如果法线角度远离垂线方向,表面的三角形会有一个更有趣的光照效果。


网格中的每个坐标应该赋一个法线量,而且每个坐标有且只有一个法向量。你添加坐标的顺序应该和添加法向量的顺序保持一致。换句话说,发向量集中的索引值对应于坐标集中的索引值。


坐标越多,法向量就越多。法向量越多,光线和阴影就越逼真。在网格中,一个单一的点可能是多个三角形的索引。在这种情况下,你可能要使用相同多的多个点坐标,从而实现在该点有多个法向量。拿一个立方体的角来说,它是立方体中三个不同三角形(面)的交点。如果在该点你只用立方体其中的一个坐标来定义由三个面交叉形成的点,那么你只能在此坐标上使用一个法向量,结果,在该位置的另外两个面就不会以应有的方式遮盖。每个三角形应使用它们唯一的电,只有这样你才能在这个交点上使用三个向量,而不是一个。


至少,一个surface是一个平面。一个平面需要三个点去定义。因此, mesh中最简单的surface可以通过一个三角形(triangles)来描述。原来,Mesh也只能通过三角形来描述,那是因为三角形是最简单,最细化的定义网(Mesh)的方法。很明显,一个大而且复杂的表面(surface)不能用一个三角形来描述。相反,它可以近似的看做由许多小的三角形构成。你可以说你用矩形来定义平面,但是它没有三角形定义详细。你想,一个矩形可以分成两个三角形。两个三角形可以比一个矩形更加精确的描述一个表面。好,已经够了,这点你要清楚:网格通过许多的三角形来表征平面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 很高兴为您解答。WPFWindows Presentation Foundation)是一种用于创建用户界面的技术,可以用来导入3D模型。要实现此功能,可以使用ModelVisual3D类,它提供了一种可视化3D模型的方法,可以将3D模型导入WPF应用程序。 ### 回答2: 在WPF中导入3D模型是一个相对简单的过程。首先,我们需要添加一个`Viewport3D`控件来显示3D模型。然后,我们可以使用`ModelVisual3D`类来创建3D模型的可视化对象,并使用`Model3DGroup`来存储这些对象。 导入3D模型的第一步是创建一个`Model3DGroup`实例。我们可以通过使用`ModelImporter`类来从外部文件中导入3D模型,该类提供了一些方法来读取不同格式的3D文件,如.obj、.3ds等。我们可以根据需要选择合适的方法来导入相应格式的模型文件。 一旦完成导入,我们可以通过将模型对象添加到`Model3DGroup`实例中来汇集所有模型。然后,我们可以通过创建一个`ModelVisual3D`对象,并将`Model3DGroup`实例指定为其Content属性,将模型可视化对象添加到`Viewport3D`控件中。 在导入3D模型之后,我们还可以对其进行一些调整。例如,我们可以改变模型的旋转、平移和缩放等属性。我们可以使用`RotateTransform3D`、`TranslateTransform3D`和`ScaleTransform3D`来实现这些效果,并将其应用于模型的`Transform`属性。 最后,我们需要将`Viewport3D`控件添加到WPF窗口或页面中正确的位置,以便用户可以看到导入的3D模型。我们可以将`Viewport3D`控件的实例直接添加到XAML代码中,或者通过使用代码将其添加到WPF布局容器中。 总的来说,通过使用WPF的`Viewport3D`控件、`Model3DGroup`类和适当的导入器,我们可以相对容易地导入和显示3D模型。通过一些额外的调整,我们甚至可以为导入的3D模型添加一些动画效果和交互性,以给用户带来更丰富的体验。 ### 回答3: 在WPF中,我们可以使用Viewport3D控件来导入和展示3D模型。首先,我们需要将3D模型的文件路径指定给ModelVisual3D对象的Content属性。然后,将ModelVisual3D添加到Viewport3D中。 以下是导入3D模型的步骤: 1. 定义一个Viewport3D控件,用于显示3D图像。 ```XAML <Viewport3D x:Name="myViewport"> <!-- 添加相机和光源 --> <Viewport3D.Camera> <PerspectiveCamera Position="0,0,5" LookDirection="0,0,-1" UpDirection="0,1,0" /> </Viewport3D.Camera> <ModelVisual3D x:Name="myModelVisual3D"> <!-- 添加模型文件路径 --> <ModelVisual3D.Content> <Model3DGroup> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,0,0 1,0,0 1,1,0 0,1,0" TriangleIndices="0 1 2 0 2 3" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial> <DiffuseMaterial.Brush> <SolidColorBrush Color="Yellow" Opacity="0.7" /> </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material> </GeometryModel3D> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D> ``` 2. 创建一个3D模型,并将其添加到ModelVisual3D的Content属性中。在这个例子中,我们创建了一个简单的矩形模型,并将其设置为黄色。 3. 将Viewport3D添加到WPF窗口中。 ```XAML <Window x:Class="WPFApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="800"> <Grid> <!-- 此处添加Viewport3D --> <Viewport3D x:Name="myViewport"> <!-- 添加相机和光源 --> <Viewport3D.Camera> <PerspectiveCamera Position="0,0,5" LookDirection="0,0,-1" UpDirection="0,1,0" /> </Viewport3D.Camera> <ModelVisual3D x:Name="myModelVisual3D"> <!-- 添加模型文件路径 --> <ModelVisual3D.Content> <Model3DGroup> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,0,0 1,0,0 1,1,0 0,1,0" TriangleIndices="0 1 2 0 2 3" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial> <DiffuseMaterial.Brush> <SolidColorBrush Color="Yellow" Opacity="0.7" /> </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material> </GeometryModel3D> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D> </Grid> </Window> ``` 通过以上步骤,我们可以在WPF中成功导入3D模型并显示在窗口中。请根据自己的需求修改模型文件路径和属性来展示你想要的3D模型

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值