四、实战:展示一个圆柱体

4.1 圆柱体分解

我们知道,3D模型是用三角形表示的,那一个圆该如何表示呢?其实用的就是割圆法,也就是用一个近似的多边形就表示一个圆。下图展示了10、20、50个顶点的正多边形,可以看出,正50边形看上去跟圆已经很接近了。我们的例子就是用正50边形。

切分之后,圆柱体变成了如下所示的三棱体的组合:

我们需要描述这个三棱体的三个面,共4个三角形(侧面是一个矩形,需要两个三角形)。

4.2 三角网格构建

这是最重要的一部分。示例代码打算让三个面渲染出不同颜色,所以需要构造三个三角网格。

代码如下:

//底面三角网格
MeshGeometry3D bottom_mesh = new MeshGeometry3D() { Positions = new Point3DCollection(), TriangleIndices = new Int32Collection() };
//顶面三角网格
MeshGeometry3D top_mesh = new MeshGeometry3D() { Positions = new Point3DCollection(), TriangleIndices = new Int32Collection() };
//侧面三角网格
MeshGeometry3D side_mesh = new MeshGeometry3D() { Positions = new Point3DCollection(), TriangleIndices = new Int32Collection() };Point3D bottom_center = new Point3D(0, 0, 0);//底面中心
Point3D top_center = new Point3D(0, 2, 0);//顶面中心
top_mesh.Positions.Add(top_center);
bottom_mesh.Positions.Add(bottom_center);int parts = 50;//把圆切成50份
double angle = Math.PI * 2 / parts;
for (int i = 0; i < parts; i++)
{double x1 = 1 * Math.Cos(angle * i);double z1 = 1 * Math.Sin(angle * i);double x2 = 1 * Math.Cos(angle * (i + 1));double z2 = 1 * Math.Sin(angle * (i + 1));Point3D bottom1 = new Point3D(x1, 0, z1);//底面Point3D bottom2 = new Point3D(x2, 0, z2);Point3D top1 = new Point3D(x1, 2, z1);Point3D top2 = new Point3D(x2, 2, z2);//底面bottom_mesh.Positions.Add(bottom1);bottom_mesh.Positions.Add(bottom2);bottom_mesh.TriangleIndices.Add(i * 2 + 1);bottom_mesh.TriangleIndices.Add(i * 2 + 2);bottom_mesh.TriangleIndices.Add(0);//顶面top_mesh.Positions.Add(top1);top_mesh.Positions.Add(top2);top_mesh.TriangleIndices.Add(i * 2 + 2);top_mesh.TriangleIndices.Add(i * 2 + 1);top_mesh.TriangleIndices.Add(0);//侧面if (i == 0){side_mesh.Positions.Add(bottom1);side_mesh.Positions.Add(top1);}side_mesh.Positions.Add(bottom2);side_mesh.Positions.Add(top2);side_mesh.TriangleIndices.Add(i * 2 + 1);side_mesh.TriangleIndices.Add(i * 2 + 3);side_mesh.TriangleIndices.Add(i * 2 + 2);side_mesh.TriangleIndices.Add(i * 2 + 1);side_mesh.TriangleIndices.Add(i * 2 + 2);side_mesh.TriangleIndices.Add(i * 2 + 0);
}DiffuseMaterial bottom_material = new DiffuseMaterial(Brushes.Green);//底面绿色
DiffuseMaterial top_material = new DiffuseMaterial(Brushes.Blue);//顶面蓝色
DiffuseMaterial side_material = new DiffuseMaterial(Brushes.Red);//侧面红色GeometryModel3D top = new GeometryModel3D(top_mesh, top_material);
GeometryModel3D bottom = new GeometryModel3D(bottom_mesh, bottom_material);
GeometryModel3D side = new GeometryModel3D(side_mesh, side_material);

4.3 相机、光源和其他代码

首先看我们在XAML文件里定义的画布:

<Viewport3D Name="view">
</Viewport3D>

代码是非常简单的。然后我们把定义好的圆柱体三角网格、相机、光源都放进画布中:

//相机
Camera camera = new PerspectiveCamera(new Point3D(3, 6, 10), new Vector3D(-3, -6, -10), new Vector3D(0, 1, 0), 45);
//光源
Light light = new AmbientLight(Colors.White);Model3DGroup group = new Model3DGroup();
group.Children.Add(light);
group.Children.Add(top);
group.Children.Add(bottom);
group.Children.Add(side);ModelVisual3D model = new ModelVisual3D();
model.Content = group;view.Children.Add(model);
view.Camera = camera;

如此一来,圆柱体就能正常显示了,如下图所示:

我们把相机的Position和LookDirection改成如下,从下面瞄一眼:

Camera camera = new PerspectiveCamera(new Point3D(3, -6, 10), new Vector3D(-3, 6, -10), new Vector3D(0, 1, 0), 45);

图像是:

WPF 3D开发教程(四)相关推荐

  1. WPF 3D开发教程(三)

    三.3D模型 3D模型就是物体,是3D开发中的主角.我们在第一部分提过,使用三角网格法表示面.而三角形由顶点组成,每个面又有一定的材质,这些都是怎么表示的呢?三角形面由Positions和Triang ...

  2. WPF 3D开发教程(一)

    一.3D基础知识 1.1 坐标系 我们知道,在2D平面绘图时,WPF使用的坐标系(其实计算机上的图形处理一般都是这样)是以屏幕左上角为原点,向右为x轴正方向,向下为y轴正方向.而WPF的3D坐标系,取 ...

  3. C#WPF 语音开发教程 TTS中英文语音(男女声音)朗读 源代码下载 csdn tts(text to sound) 一步一步 教你制作语音软件 附图和源代码

    C#WPF  语音开发教程  TTS中文语音朗读 一步一步 教你制作语音软件 附图和源代码 使用时,请确认电脑喇叭打开,并且不是静音额. 效果展示 一 项目准备 1.vs2012开发平台 2.微软的语 ...

  4. 开发教程(四) MIP组件平台使用说明

    组件审核平台用于上传 MIP 组件.经过自动校验之后,提交审核,通过审核的组件会定时推送到线上,供网站使用. 平台地址:https://www.mipengine.org/platform/ 1. 使 ...

  5. ROS1结合自动驾驶数据集Kitti开发教程(四)画出自己车子模型以及照相机视野

    注意: 再学习本系列教程时,应该已经安装过ROS了并且需要有一些ROS的基本知识 ubuntu版本:20.04 ros版本:noetic 课程回顾 ROS1结合自动驾驶数据集Kitti开发教程(一)K ...

  6. 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

     更多微信技术交流,请加QQ群:289709451.287090836     前几章中我讲解了微信开发平台提供第三方平台的好处,和使用流程,如果你看了我的文章相信你对开放平台有了初步的了解,但是在实 ...

  7. IntelliJ IDEA 12详细开发教程(四) 搭建Android应用开发环境与Android项目创建

    今天我要给大家讲的是使用Intellij Idea开发Android应用开发.自我感觉使用Idea来进行Android开发要比在Eclipse下开发简单很多. (一)打开网站:http://devel ...

  8. 安卓USB开发教程 四 安卓 AOA

    Android 开放性配件协议(AOA) Android 开放性配件协议(AOA)支持允许外部 USB 硬件(Android USB 配件)与工作在配件模式下的 Android 设备进行交互.当处于配 ...

  9. Kinect开发教程四:用Kinect控制鼠标玩水果忍者PC版

    最近Kinect连接Xbox玩水果忍者的视频非常红火,可惜小斤只有本本和Kinect,没法玩Xbox上的体感游戏.幸运的是,寻寻觅觅后,小斤发现水果忍者有PC版本,既然上一个教程我们已经可以让Kine ...

最新文章

  1. 概率统计 —— 常犯错误
  2. Java数据结构——有序链表
  3. xfce的面板调节声音大小的按钮不见了。
  4. [健康]女人喝红酒的好处
  5. 使用JavaScript中的示例编号MAX_VALUE属性
  6. powershell自动化操作AD域、Exchange邮箱系列(3)—重要的模块/API介绍Get-Aduser Get-Mailbox
  7. 200 个工具分析机器学习十年:前途未卜、工程师是核心!
  8. 经典卷积神经网络的学习(三)—— Inception Net
  9. 大数据分析需注意什么问题
  10. node socketlog
  11. 图像分类系统之功能实现概要
  12. 工程之星位置服务器,工程之星5.0中求坐标转换参数需要谨记这七大点!
  13. 我行我素购物管理系统
  14. python课设答辩ppt_学生成绩管理系统答辩幻灯片.ppt
  15. python itchat文档_python itchat简介
  16. java加减乘除判断代码_JAVA实现精确的加减乘除代码
  17. mysql按升序创建索引_MySQL 降序索引 (Descending Indexes)
  18. 攻防演练第四年的一些碎碎念
  19. 全志D1-H芯片 如何在tina使用tplayerdemo 进行rtsp拉流说明?
  20. 微信小程序从入坑到放弃二十二:完美兼容安卓和ios手机的底部评论框

热门文章

  1. 山峰和山谷 Ridges and Valleys(bfs)
  2. 经典同步时序逻辑电路分析汇总(第六道)(同步四进制可逆加减法计数器)
  3. 火遍全网的chatGPT(文末有彩蛋)
  4. html怎么导入flash视频,DW如何在网页中插入Flash视频?
  5. 看这里→大数据工程技术人员系列课程—《大数据工程技术人员-大数据基础技术》正式上线!...
  6. 计算机教学能力提升体会,学习《信息技术助力教学能力提高》感悟
  7. android 11.0 12.0USB连接模式默认设为MTP
  8. html中圆角的度,cssli圆角
  9. 《文法俱乐部》读书笔记之动词时态--LG二进制
  10. 机车安装鸿蒙系统,华为鸿蒙系统2.0版本来了:9月11日发布 打通PC、手表、车机等...