原文 https://stuff.seans.com/2008/08/13/drawing-a-cube-in-wpf/

是时候使用WPF绘制一个简单的3D对象了。作为WPF中3D图形的快速介绍,让我们只渲染一个最简单的对象 - 一个立方体。

在这个例子中,我将直接在XAML中定义我们需要的所有内容。与WPF中的其他内容一样,我们可以直接在代码中完成所有这些操作。但是在XAML中定义所有内容更加清晰,因为它使对象层次结构更加明显。在实际项目中,您显然会在代码中执行此操作,例如创建或加载3D网格(我们要显示的对象)。

让我们从最终的XAML开始吧。以下是Window1.xaml文件的完整内容:

1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
三十
31
32
33
34
35
36
37
38
<Window x:Class="SimpleCube.Window1"
    Title="Window1" Height="398" Width="608"
    <Grid>
        <Viewport3D Name="viewport3D1">
            <Viewport3D.Camera>
                <PerspectiveCamera x:Name="camMain" Position="6 5 4" LookDirection="-6 -5 -4">
                </PerspectiveCamera>
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight x:Name="dirLightMain" Direction="-1,-1,-1">
                    </DirectionalLight>
                </ModelVisual3D.Content>
            </ModelVisual3D>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D x:Name="meshMain"
                                Positions="0 0 0  1 0 0  0 1 0  1 1 0  0 0 1  1 0 1  0 1 1  1 1 1"
                                TriangleIndices="2 3 1  2 1 0  7 1 3  7 5 1  6 5 7  6 4 5  6 2 0  2 0 4  2 7 3  2 6 7  0 1 5  0 5 4">
                            </MeshGeometry3D>
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>
                            <DiffuseMaterial x:Name="matDiffuseMain">
                                <DiffuseMaterial.Brush>
                                    <SolidColorBrush Color="Red"/>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
    </Grid>
</Window>

这里的基本思想是我们需要一个Viewport3D对象,它包含渲染立方体所需的一切。显示Viewport3D及其子对象的简化结构是:

1
2
3
4
6
7
Viewport3D
    ModelVisual3D   (defines lighting)
        DirectionalLight
    ModelVisual3D   (defines object to render)
        GeometryModel3D
            MeshGeometry3D
            DiffuseMaterial

以下是每个对象负责的内容:

  • Viewport3D - 渲染3D内容的地方
  • ModelVisual3D - 视口包含的3D对象,可以是灯光或几何
  • DirectionalLight - 在特定方向照射的光
  • GeometryModel3D - 一个3D几何对象
  • MeshGeometry3D - 定义3D对象的三角形集
  • DiffuseMaterial - 用于渲染3D对象的材质,例如画笔

也许这些类中最有趣的是MeshGeometry3D。“网格”基本上由一系列三角形组成,通常所有三角形都连接起来形成您想要渲染的3D对象。所述MeshGeometry3D对象通过指定一系列的点,然后三角形的集合定义了一个网格。点集合表示网格中的所有顶点,并由Positions属性定义。存储在TriangleIndices属性中的三角形是根据点使用索引到Positions集合中定义的。

起初这似乎有点奇怪。为什么不定义一组三角形,每个三角形由三个点组成?为什么将点定义为单独的集合,然后通过引用点来定义三角形?答案是该方案允许在多个三角形中重复使用单个点。

在我们的例子中,绘制一个立方体,我们为立方体的八个顶点定义了八个点。下图显示了从0到7编号的点,与我们将它们添加到位置的顺序相匹配。立方体的左后角位于(0,0,0)。

定义点后,我们定义构成表面立方体的12个三角形 - 每个面两个三角形。我们通过仅列出构成三角形的三个点的索引来定义每个三角形。

注意我们列出每个三角形的索引的顺序也很重要。该顺序指示垂直于三角形的向量的方向,该向量指示我们可以看到的三角形的哪一侧。规则是:当您查看三角形的可见面时,逆时针添加顶点。

除了网格,我们还定义了用于渲染立方体的材质。在这种情况下,它是一个DiffuseMaterial,它允许用简单的画笔绘制立方体的表面。

我们还需要在我们的场景中添加一个摄像头,通过指定它的位置以及它所在的方向。为了看到我们的立方体,我们将摄像机置于(6,5,4),然后设置其LookDirection,向量,到(-6,-5,-4),使它回头看原点。

最后,为了看到立方体,我们需要照明。我们定义了一个单独的光源,它是一个DirectionalLight - 一个没有位置但只是在特定方向投射光线的光。

最终结果是一个简单的红色立方体。

在WPF中绘制多维数据集的更多相关文章

  1. 【C#】第3章补充(一)如何在WPF中绘制正弦曲线

    分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.要点 本例子提前使用了教材第13章介绍的基本知识. 二 ...

  2. occ 中绘制二维矩形

    在屏幕上绘制一个二级矩形 #include <Visual3d_Layer.hxx> #include <V3d_LayerMgr.hxx> #include <Visu ...

  3. 用OxyPlot在WPF中演示正演磁异常的变化规律

    为了在展示实验成果时动态演示理论球体磁异常随其埋深.磁化倾角的变化规律,我用WPF写了一个小程序来作演示. MatLab计算磁异常数据 首先是计算理论球体磁异常数据,在Matlab中可以很方便地计算. ...

  4. BI之SSAS完整实战教程3 -- 创建第一个多维数据集

    上一篇我们已经完成了数据源的准备工作,现在我们就开始动手,创建第一个多维数据集(Cube). 文章提纲 使用多维数据集向导创建多维数据集 总结Cube设计器简介 维度细化 总结 一.使用向导创建多维数 ...

  5. 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换

    原文:二维图形的矩阵变换(三)--在WPF中的应用矩阵变换 UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Vis ...

  6. 二维图形的矩阵变换(二)——WPF中的矩阵变换基础

    原文:二维图形的矩阵变换(二)--WPF中的矩阵变换基础 在前文二维图形的矩阵变换(一)——基本概念中已经介绍过二维图像矩阵变换的一些基础知识,本文中主要介绍一下如何在WPF中进行矩阵变换. Matr ...

  7. WPF中如何使用图像API进行绘制

    首先,由于WPF中不象GDI+中有Graphics对象,因此你无法使用Graphics进行绘图了,取而代之的是:DrawingContext:类似地,GDI+中的OnPaint已被OnRender取代 ...

  8. 在WPF中自定义你的绘制(五)

    原文:在WPF中自定义你的绘制(五) 在WPF中自定义你的绘制(五)                                                                   ...

  9. 在WPF中自定义你的绘制(三)

    原文:在WPF中自定义你的绘制(三) 在WPF中自定义你的绘制(三)                                                                  ...

随机推荐

  1. 容斥原理学习(Hdu 4135,Hdu 1796)

    题目链接Hdu4135 Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HTML连载58-绝对定位的参考点以及注意事项

    一.绝对定位参考点 1.规律: (1)默认情况下所有的绝对定位的元素,无论有没有祖先元素,都会以body作为参考点. <style> .box1{ width: 300px; height ...

  3. file.length()方法返回0字节

    本地调试ok 扔到服务器上就返回0 初步估测是因为使用jnotify监控文件修改事件的时候,刚好文件被重命名了(下载完成后xxx.tmp,被改成正确的后缀名) 2019-7-20:不是上边说的那个亚子 ...

  4. ModelAndView返回mav时,报404

    报404的可能性太多了 简单来看,404后边有信息,说明请已经分配到了控制器 经过调试发现,mav已经分配到了页面 原因,modelandview的包导入错误,正确的包是 import org.spr ...

  5. 2019.8.5 NOIP模拟测试13 反思总结【已更新完毕】

    还没改完题,先留个坑. 放一下AC了的代码,其他东西之后说… 改完了 快下课了先扔代码 跑了跑了 思路慢慢写 来补完了[x 刚刚才发现自己打错了标题 这次考试挺爆炸的XD除了T3老老实实打暴力拿了52 ...

  6. python实例 字典

    #! /usr/bin/python x={'a':'aaa','b':'bbb','c':12} print (x['a']) print (x['b']) print (x['c']) for k ...

  7. 【二次元的CSS】—— 用 DIV + CSS3 画咸蛋超人(详解步骤)

    [二次元的CSS]—— 用 DIV + CSS3 画咸蛋超人(详解步骤) 2016-05-17 HTML5cn 仅仅使用div作为身体的布局,用css3的各种transform和圆角属性来绘制各部位的 ...

  8. etcd使用

    下载: https://github.com/etcd-io/etcd/releases/tag/v3.3.13 tar -zxvf   etcd-v3.3.13-linux-amd64.tar.gz ...

  9. 一些windows server的操作

    windows server2008R2的一些操作和arcgis9.3 服务和arcgis9.3安装 1.在虚拟机中安装: https://jingyan.baidu.com/article/0eb4 ...

  10. web标准中定义id与class有什么区别吗

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x ...