首页 > 其他分享 >WPF绘制3D小demo

WPF绘制3D小demo

时间:2024-06-20 16:54:08浏览次数:26  
标签:Vector3 demo MeshBuilder positions var new WPF AddTriangle 3D

试过了WPF原生3D和HelixToolkit.Wpf,感觉还是SharpDX的效果比较好,所以使用了HelixToolkit.Wpf.SharpDX

初学,仅供参考,没搞懂怎么双面渲染,所以每个面用了2个三角形分别显示正面和反面

 

<Grid>
<hx:Viewport3DX EnableSwapChainRendering="True" FXAALevel="Low" BackgroundColor="White" Name="viewport3DX">

<hx:Viewport3DX.Camera>
<hx:PerspectiveCamera FarPlaneDistance="10000" x:Name="camera" Position="1,1,10" LookDirection="-1,-1,-10" UpDirection="0,1,0" FieldOfView="20" >

</hx:PerspectiveCamera>
</hx:Viewport3DX.Camera>

<hx:AmbientLight3D Color="White" />
<hx:DirectionalLight3D Direction="{Binding ElementName=camera,Path=LookDirection}" Color="White" />

<hx:Viewport3DX.InputBindings>
<MouseBinding Command="hx:ViewportCommands.Rotate" Gesture="LeftClick" />
<MouseBinding Command="hx:ViewportCommands.Zoom" Gesture="MiddleClick" />
<MouseBinding Command="hx:ViewportCommands.Pan" Gesture="RightClick" />
</hx:Viewport3DX.InputBindings>
</hx:Viewport3DX>
</Grid>

 

 

public MainWindow()
{
InitializeComponent();
viewport3DX.EffectsManager = new DefaultEffectsManager();


var MeshBuilder = new MeshBuilder();
var MeshBuilder2 = new MeshBuilder();
var MeshBuilder3 = new MeshBuilder();
Vector3Collection positions = new Vector3Collection()
{
new Vector3(-1,-1,-1),
new Vector3(1,-1,-1),
new Vector3(1,1,-1),
new Vector3(-1,1,-1),
new Vector3(-1,-1,1),
new Vector3(1,-1,1),
new Vector3(1,1,1),
new Vector3(-1,1,1),
};

AddTriangle(MeshBuilder,positions[0], positions[1], positions[2]);
AddTriangle(MeshBuilder, positions[2], positions[3], positions[0]);

AddTriangle(MeshBuilder, positions[4], positions[5], positions[6]);
AddTriangle(MeshBuilder, positions[6], positions[7], positions[4]);

AddTriangle(MeshBuilder, positions[0], positions[1], positions[5]);
AddTriangle(MeshBuilder, positions[5], positions[4], positions[0]);

AddTriangle(MeshBuilder, positions[3], positions[2], positions[6]);//后面
AddTriangle(MeshBuilder, positions[6], positions[7], positions[3]);

AddTriangle(MeshBuilder, positions[3], positions[0], positions[4]);//左面
AddTriangle(MeshBuilder, positions[4], positions[7], positions[3]);

AddTriangle(MeshBuilder, positions[5], positions[6], positions[2]);//右面
AddTriangle(MeshBuilder, positions[2], positions[1], positions[5]);


var geometryModel3D = new MeshGeometryModel3D
{
Geometry = MeshBuilder.ToMesh(),
Material = PhongMaterials.Green,
CullMode=SharpDX.Direct3D11.CullMode.Back//取消背面渲染
};

 //大量三角面渲染测试

//for (int j = 0; j < 500; j++)
//{
// for (int i = 0; i < 500; i++)
// {
// AddTriangle(MeshBuilder, positions[0], positions[1], positions[5], offsetx: 2 * (i + 1), offsetz: 2 * j);
// AddTriangle(MeshBuilder, positions[5], positions[4], positions[0], offsetx: 2 * (i + 1), offsetz: 2 * j);
// }
//}

var model3DGroup = new GroupModel3D();
model3DGroup.Children.Add(geometryModel3D);

viewport3DX.Items.Add(model3DGroup);
}
private void AddTriangle(MeshBuilder MeshBuilder, Vector3 p0, Vector3 p1, Vector3 p2, float offsetx = 0,float offsety=0,float offsetz=0)
{
var m0 = new Vector3(p0.X + offsetx, p0.Y + offsety, p0.Z + offsetz);
var m1 = new Vector3(p1.X + offsetx, p1.Y + offsety, p1.Z + offsetz);
var m2 = new Vector3(p2.X + offsetx, p2.Y + offsety, p2.Z + offsetz);

MeshBuilder.AddTriangle(m0, m1, m2);
MeshBuilder.AddTriangle(m2, m1, m0);
}

 

标签:Vector3,demo,MeshBuilder,positions,var,new,WPF,AddTriangle,3D
From: https://www.cnblogs.com/QJZY/p/18258990

相关文章

  • WPF支持任意快捷键+鼠标组合的绑定类
    publicinterfaceIInputSignal{boolIsMatch(InputEventArgsargs);}publicclassKeyDownSignal:KeySignal{publicKeyDownSignal(Keykey):base(key){}publicoverrideboolIsMatch(InputEve......
  • DEMO_02:随机数获取;数组集合遍历;整型与字符串转换;字符串字符遍历;数组/集合排序
    /***考核点:随机数获取;数组集合遍历;整型与字符串转换;字符串字符遍历;数组/集合排序*<p>*题目:*1.使用while循环获取20个五位数随机数并打印;*2.遍历20个数,筛选出随机数中3的倍数,并统计个数;*3.符合2的数中,找出五位数中3的倍数和位置*4.符合2的数中,把这五位数......
  • H5移动端加载预览pdf文件——demo
    前言:正常情况下需要在HTML中嵌入本地docx或pdf文件时,我们会有以下解决办法:1.使用<iframe>标签2.使用<embed>标签3.使用<object>标签4.使用第三方库(如PDF.js)当实际操作时,会发现前三种方式在pc端支持,但在移动端不支持,因为这些标签在移动端浏览器中的支持并不统一。为了兼容移......
  • 演示:WPF开发的Diagram自动化流程图应用
    一、目的:演示Diaram应用功能二、预览三、功能列表功能模块通用测试流程图仪器仪表机器人网络通信测试PLC测试轮毂生产线流程测试 图像处理目标检测绘图思维导图图表流程图功能模板管理工程管理模块许可管理工具栏开始停止删除清......
  • 硬件开发笔记(二十):AD21导入外部下载的元器件原理图库、封装库和3D模型
    前言  在硬件设计的过程中,会遇到一些元器件,这些元器件在本地已有的库里面没有,但是可以从外部下载或者获取到对应的。  本篇就是引入TPS54331D电源芯片作为示例,详细描述整个过程。 创建TPS54331D步骤一:下载TPS54331D模型  云汉芯城  注意:无需注册登录,搜索到......
  • DEMO_01:List数据存储,回调函数,集合转字符串,元素去重
    *题目:*1.构建属性结构List<DemoNode>data,根据本包的data.png中数据结构图将数据存入data中(字就是nodeName)*2.将树形结构List<DemoNode>里面的元素全部遍历出来存放到List<String>list中,输出结果转换成字符串:粉粉碎机被粉碎机粉碎了怎么办*3.将list里元素去重后......
  • DevExpress WPF中文教程:Grid - 如何将更改发布到数据库(设计时)?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • WPF/C#:在DataGrid中显示选择框
    前言在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求,今天跟大家分享一下,在自己的项目中是如何实现的。整体实现效果如下:如果对此感兴趣,可以接下来看具体实现部分。实践假设数据库中的模型如下:publicclassPerson{publicintId......
  • 【C#】WPF 使用Storyboard故事板做动画效果
    <Stylex:Key="ButtonAnimationBlueStyle"BasedOn="{x:Null}"TargetType="{x:TypeButton}"><SetterProperty="Template"><Setter.Value><ControlTem......
  • 3dmax怎么渲染又快又清晰?
    在3dsMax中,追求快速且清晰的渲染效果是每个设计师的目标。云渲染技术的出现,为这一目标提供了强大的支持。通过云渲染,设计师能够利用远程服务器的强大计算能力,实现快速渲染,同时保持图像的高清晰度。一、3dmax怎么渲染清晰第一步:打开渲染设置点击公用部分,输出图片大小,网上用的3......