WPF:3D立方体

#一、三个重要元素

  • 3D有三个重要元素,模型、灯光、视野。

    那我们现实来对比,我们要看到一个物体,首先这个物体要存在(即要构造一个模型),其次需要有灯光照在这个物体上(即要构造一个灯光,还要将灯光照在这个模型上,不然就看不见模型),然后我们要有视野,要用眼睛去看(就是说我们还要构造一个视野,而且模型要在这个视野中才能看的到)。

  • 而模型则有两部分组成,网格和纹理(附在材质上)。

    网格即为骨架,纹理为皮肤,二者缺一不可。

    网格由许许多多的三角形构成

#二、3D正方体

##1、模型之网格

  • 由12个三角形构成一个立方体网格。
    8个顶点,6个面,每个面2个三角形,共12个三角形。

    MeshGeometry3D meshg = new MeshGeometry3D();
    Point3DCollection pc = new Point3DCollection();
    pc.Add(new Point3D(-10,10,0));pc.Add(new Point3D(10,10,0));pc.Add(new Point3D(10,-10,0));pc.Add(new Point3D(-10,-10,0));
    pc.Add(new Point3D(-10,10,-10));pc.Add(new Point3D(10,10,-10));pc.Add(new Point3D(10,-10,-10));pc.Add(new Point3D(-10,-10,-10));
    meshg.Positions = pc;
    Int32Collection ic = new Int32Collection();
    ic.Add(0);ic.Add(2);ic.Add(1);ic.Add(0);ic.Add(3);ic.Add(2);
    ic.Add(4);ic.Add(6);ic.Add(5);ic.Add(4);ic.Add(7);ic.Add(6);

    ic.Add(4);ic.Add(3);ic.Add(0);ic.Add(4);ic.Add(7);ic.Add(3);
    ic.Add(5);ic.Add(2);ic.Add(1);ic.Add(5);ic.Add(6);ic.Add(2);

    ic.Add(4);ic.Add(1);ic.Add(5);ic.Add(4);ic.Add(0);ic.Add(1);
    ic.Add(7);ic.Add(2);ic.Add(6);ic.Add(7);ic.Add(3);ic.Add(2);
    meshg.TriangleIndices = ic;

##2、材质纹理

  • 我们构造一个材质对象,这里就用一个简单的画刷作为材质的纹理。然后用这个材质和上面构造的网格构造一个3D模型

    DiffuseMaterial dm = new DiffuseMaterial();
    dm.Brush = Brushes.Cyan;

    复制代码
     GeometryModel3D gm = new GeometryModel3D(); 
     gm.Geometry = meshg;
     gm.Material = dm;

##3、灯光

复制代码
DirectionalLight dl = new DirectionalLight ( );
  dl.Color = Colors.Blue;
  dl.Direction = new Vector3D ( 0, 0, -1 );
  • 接下来,将这个模型和灯光都放到一个3D集合中。可以理解成模型和灯光都是实物,这个实物需要有个地方放,于是需要将这个3D集合放到一个空间中,这里是ModelVisual3D。

    Model3DGroup mg = new Model3DGroup();
    mg.Children.Add ( dl );
    mg.Children.Add(gm);
    ModelVisual3D mv = new ModelVisual3D();
    mv.Content = mg;

##4、视野

  • 所有美好的东西都已经弄好了,剩下的就是一双发现美丽的眼睛了。现在,就将这个眼睛加上吧。这样一个完整的视野就构造出来了。

    Viewport3D myViewPort = new Viewport3D ( );
    myViewPort.Children.Add(mv);
    PerspectiveCamera camera = new PerspectiveCamera ( );
    camera.Position = new Point3D ( 0, 0, 80 );
    camera.UpDirection = new Vector3D ( 0, 1, 0 );
    camera.LookDirection = new Vector3D ( 0, 0, -20 );
    myViewPort.Camera = camera;

##5、将 Viewport3D 添加到窗口

复制代码
 this.Content = myViewPort;

#三、窗体代码

复制代码
<Window x:Class="Wpf_3DDemo2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Wpf_3DDemo2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        
    </Grid>
</Window>

#四、源码下载

https://download.csdn.net/download/dalong10/93184240

#五、资料

复制代码
 峰顶飞龙的博客
https://www.cnblogs.com/Fuss/archive/2012/11/29/2794780.html
相关推荐
donk131416 小时前
React Native for OpenHarmony 实战:三方库 react-native-step-indicator 的鸿蒙化适配指南
分布式·react native·react.js·wpf·harmonyos
3D阅阅三维模型轻量化及浏览平台17 小时前
3D 阅阅:机加工与模具厂的智能看图报价实战
3d·机械加工·机加工·钣金加工·模具加工
He BianGu18 小时前
【笔记】WPF中RenderOptions类的详细功能
笔记·wpf
福大大架构师每日一题20 小时前
ComfyUI v0.40.0发布:资产系统、原生 LoRA 堆栈、Qwen 3.5、3D 输出、相机节点与多项合作节点全面更新
数码相机·3d
VidDown21 小时前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码
He BianGu21 小时前
【笔记】WPF中CachingHint的功能
笔记·wpf
LuminWave21 小时前
洛微科技重磅发布DM-Mini 3D ToF相机:以超近距精准感知,赋能机器人灵巧操作
科技·3d·机器人
Mark White21 小时前
ICCV 2019【从颜色科学到相机】06_相机为什么有自己的“味道”?色调映射、3D LUT 与 JPEG
数码相机·3d
He BianGu1 天前
【笔记】在WPF中BitmapScalingMode的作用
笔记·wpf
Jmyd01232 天前
文物3D扫描采集系统选型与集成:固定+手持双链路技术方案
3d·文物修复·文物数字化·文物建模