iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >WPF如何实现绘制3D图形
  • 863
分享到

WPF如何实现绘制3D图形

2023-07-05 08:07:06 863人浏览 薄情痞子
摘要

今天小编给大家分享一下WPF如何实现绘制3D图形的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。关键概念视口视口指的是图像要展

今天小编给大家分享一下WPF如何实现绘制3D图形的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

关键概念

视口

视口指的是图像要展示在哪里,可以理解为展示图形的舞台。在WPF中视口使用Viewport3D标签表示。

相机

如果把视口比作舞台,那相机就可以理解为观众的眼睛,不同的眼睛位置会看到不同的角度。

<Viewport3D>    <!--相机-->    <Viewport3D.Camera>        <!--透视相机-->        <PerspectiveCamera Position="8,5,10"                           LookDirection="-7,-2,-10"                           FarPlaneDistance="40"                           NearPlaneDistance="10"                           FieldOfView="60">             <PerspectiveCamera.TransfORM>                <RotateTransform3D CenterX="1.5" CenterY="1" CenterZ="0.5">                    <RotateTransform3D.Rotation>                        <AxisAngleRotation3D Angle="45" Axis="0,1,0"/>                    </RotateTransform3D.Rotation>                </RotateTransform3D>            </PerspectiveCamera.Transform>        </PerspectiveCamera>        <!--正交相机,用法类似-->        <!--<OrthographicCamera/>--></Viewport3D.Camera>

光源

没有光源也就看不到3D对象

<!--光线--><ModelVisual3D>    <ModelVisual3D.Content>        <Model3DGroup>            <!--散射光线-->            <AmbientLight Color="#FFF"/>            <!--平行光-->            <!--<DirectionalLight Color="#FFF" Direction="0,-1,0"/>-->            <!--点光源-->            <!--<PointLight Position="0,0,0"/>-->            <!--锥形辐射光:手电筒-->            <!--<SpotLight Position="0,0,0" Direction="0,0,-3"/>-->        </Model3DGroup>    </ModelVisual3D.Content></ModelVisual3D>

材质

3D几何对象只是将轮廓定义出来,表面是没有定义的,所以需要使用材质来展现出不同的物体表面。也可以理解为3D几何对象只是勾勒出物体的轮廓,而材质则是上颜色。

<ModelUIElement3D >    <ModelUIElement3D.Model>        <GeometryModel3D>            <!--材质-->            <GeometryModel3D.Material>                <!--散射材质-->                <DiffuseMaterial Brush="Blue"/>                <!--镜面材质-->                <!--<SpecularMaterial SpecularPower="1" Brush="Blue"/>-->                <!--自发光材质-->                <!--<EmissiveMaterial Color="Green" />-->            </GeometryModel3D.Material>            <GeometryModel3D.Geometry>                <MeshGeometry3D Positions="0,0,1 0,2,1 3,2,1 3,0,1                                           0,0,0 0,2,0 3,2,0 3,0,0"                                TriangleIndices="2,3,7 7,6,2 1,5,4 0,1,4"/>            </GeometryModel3D.Geometry>        </GeometryModel3D>    </ModelUIElement3D.Model></ModelUIElement3D>

3D对象

3D对象则是具体的对象,在WPF中视口使用<ModelUIElement3D>标签表示。在WPF中,图形是以三角面片作为最基本的展示单元,因为三角形是最稳定的即三个点可以确定出唯一的一个平面,任何复杂的图形都是由多个三角面片组成的。在给TriangleIndices属性赋值时,一定注意三个点的顺序。

命中测试(鼠标交互)

想要使用鼠标点击得到某个图形,可以在具体的某个3D对象中,增加MouseLeftButtonDown事件

<ModelUIElement3D MouseLeftButtonDown="ModelUIElement3D_MouseLeftButtonDown">事件中可以进行改变颜色等操作

private void ModelUIElement3D_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){    ModelUIElement3D mui3d = sender as ModelUIElement3D;    var model = mui3d.Model as GeometryModel3D;    (model.Material as DiffuseMaterial).Brush = Brushes.Orange;}

如果有很多3D对象,在每个具体的对象上面增加事件会很麻烦,也可以直接在Viewport3D中增加事件

<Viewport3D MouseLeftButtonDown="Viewport3D_MouseLeftButtonDown">在时间中急性转换处理

private void Viewport3D_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){    Viewport3D viewport3D=sender as Viewport3D;     Point location=e.GetPosition(viewport3D);    HitTestResult hitTestResult=VisualTreeHelper.HitTest(viewport3D, location);    if (hitTestResult != null)    {        ...//具体操作    }}

3D对象中2D控件渲染

如果要在3D对象中增加控件,可以使用Viewport2DVisual3D标签,实现如下图所示的效果。

WPF如何实现绘制3D图形

<Viewport3D> <Viewport2DVisual3D>    <Viewport2DVisual3D.Geometry>        <MeshGeometry3D Positions="0,0,1 0,2,1 3,2,1 3,0,1                       0,0,0 0,2,0 3,2,0 3,0,0"            TriangleIndices="0,2,1 0,3,2 6,4,5 6,7,4"            TextureCoordinates="0,1 0,0 1,0 1,1"/>        <!--TextureCoordinates:表示的二维平面坐标,原点:左上角-->    </Viewport2DVisual3D.Geometry>    <Viewport2DVisual3D.Material>        <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/>    </Viewport2DVisual3D.Material>    <Viewport2DVisual3D.Visual>    <Border BorderThickness="1" BorderBrush="Yellow">        <StackPanel>            <TextBlock Text="Hello World" Foreground="Green" />            <Button Content="Button" Click="Button_Click"/>        </StackPanel>    </Border>    </Viewport2DVisual3D.Visual> </Viewport2DVisual3D><Viewport3D>

外部导入3D模型

在wpf中绘制3D模型还是非常麻烦的,在实际工作中用的比较多的是从外部导入已有的3d模型。推荐一个比较好的第三方库HelixToolKit

WPF如何实现绘制3D图形

<Window x:Class="WpfApp2.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:WpfApp2"        xmlns:helix="http://helix-toolkit.org/wpf"        mc:Ignorable="d"        Title="MainWindow" Height="450" Width="800">    <Grid>        <helix:HelixViewport3D  Name="viewPort3d"                                ShowViewCube="True"            ViewCubeBackText="后" ViewCubeFrontText="前" ViewCubeHeight="100" ViewCubeWidth="100"             ViewCubeVerticalPosition="Bottom"            ViewCubeHorizontalPosition="Right"                        ShowCoordinateSystem="True"            CoordinateSystemLabelForeground="Red"            CoordinateSystemHorizontalPosition="Left"            CoordinateSystemVerticalPosition="Bottom"                        ShowFrameRate="True"                        IsViewCubeEdgeClicksEnabled="False">            <helix:HelixViewport3D.Camera>                <PerspectiveCamera FieldOfView="45"                                     LookDirection="0,0,-414.387754871885"                                    FarPlaneDistance="30000"                                   NearPlaneDistance="0.1"                                    Position="9.9475983006414E-14,91.037123633789,414.387754871885"                                    UpDirection="0,1,0"/>            </helix:HelixViewport3D.Camera>            <helix:HelixViewport3D.Background>                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">                    <GradientStop Color="#444" Offset="0"/>                    <GradientStop Color="#EEE" Offset="1"/>                </LinearGradientBrush>            </helix:HelixViewport3D.Background>            <helix:GridLinesVisual3D Width="16000" Length="16000" Thickness="2" MinorDistance="500" MajorDistance="500" Fill="Gray" />            <!--很重要,没有灯光场景是黑的-->            <helix:DefaultLights/>            <ModelVisual3D x:Name="model"></ModelVisual3D>        </helix:HelixViewport3D>    </Grid></Window>
namespace WpfApp2{    public partial class MainWindow : Window    {        List<string> modelPaths = new List<string>();        string basePath = AppDomain.CurrentDomain.BaseDirectory + "\\ModelFiles\\";        public MainWindow()        {            InitializeComponent();            modelPaths.Add("IRB4600_20kg-250_LINK1_CAD_rev04.stl");            modelPaths.Add("IRB4600_20kg-250_LINK2_CAD_rev04.stl");            modelPaths.Add("IRB4600_20kg-250_LINK3_CAD_rev005.stl");            modelPaths.Add("IRB4600_20kg-250_LINK4_CAD_rev04.stl");            modelPaths.Add("IRB4600_20kg-250_LINK5_CAD_rev04.stl");            modelPaths.Add("IRB4600_20kg-250_LINK6_CAD_rev04.stl");            modelPaths.Add("IRB4600_20kg-250_LINK3_CAD_rev04.stl");            modelPaths.Add("IRB4600_20kg-250_CABLES_LINK1_rev03.stl");            modelPaths.Add("IRB4600_20kg-250_CABLES_LINK2_rev03.stl");            modelPaths.Add("IRB4600_20kg-250_CABLES_LINK3_rev03.stl");            modelPaths.Add("IRB4600_20kg-250_BASE_CAD_rev04.stl");            this.Loaded += MainWindow_Loaded;            viewPort3d.RotateGesture = new MouseGesture(MouseAction.RightClick);            viewPort3d.PanGesture = new MouseGesture(MouseAction.LeftClick);        }        private void MainWindow_Loaded(object sender, RoutedEventArgs e)        {            viewPort3d.Camera.LookDirection = new Vector3D(2038, -5200, -2930);            viewPort3d.Camera.UpDirection = new Vector3D(-0.145, 0.372, 0.917);            viewPort3d.Camera.Position = new Point3D(-1571, 4801, 3774);            this.model.Content = InitializeModels(this.modelPaths);        }        private Model3DGroup InitializeModels(List<string> modelsNames)        {            Model3DGroup group = new Model3DGroup();            try            {                ModelImporter import = new ModelImporter();                foreach (string modelName in modelsNames)                {                    var materialGroup = new MaterialGroup();                    Color mainColor = Colors.White;                    //EmissiveMaterial emiSSMat = new EmissiveMaterial(new SolidColorBrush(mainColor));                    DiffuseMaterial diffMat = new DiffuseMaterial(new SolidColorBrush(mainColor));                    //SpecularMaterial specMat = new SpecularMaterial(new SolidColorBrush(mainColor), 2000);                    //materialGroup.Children.Add(emissMat);                    materialGroup.Children.Add(diffMat);                    //materialGroup.Children.Add(specMat);                    var link = import.Load(basePath + modelName);                    GeometryModel3D model = link.Children[0] as GeometryModel3D;                    model.Material = materialGroup;                    model.BackMaterial = materialGroup;                    group.Children.Add(link);                }            }            catch (Exception e)            {                MessageBox.Show("未知异常:" + e.StackTrace);            }            return group;        }    }}

以上就是“WPF如何实现绘制3D图形”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: WPF如何实现绘制3D图形

本文链接: https://www.lsjlt.com/news/350567.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • WPF如何实现绘制3D图形
    今天小编给大家分享一下WPF如何实现绘制3D图形的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。关键概念视口视口指的是图像要展...
    99+
    2023-07-05
  • WPF实现绘制3D图形的示例代码
    目录关键概念视口相机光源材质3D对象命中测试(鼠标交互)3D对象中2D控件渲染外部导入3D模型WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D...
    99+
    2023-03-02
    WPF绘制3D图形 WPF 3D图形 WPF 3D
  • CSS绘制:如何实现简单的3D图形效果
    CSS绘制:如何实现简单的3D图形效果在现代网页设计中,要给页面增加一些动态和立体感,常常需要用到3D图形效果。虽然在过去,实现3D效果可能需要使用JavaScript或者专业的3D引擎,但是现在CSS已经足够强大,可以实现一些简单的3D图...
    99+
    2023-11-21
    简单 图形效果 CSSD
  • WPF使用Geometry绘制几何图形
    在WPF的DrawingContext对象中,提供了基本的绘制椭圆和矩形的API:DrawEllipse和DrawRectangle。但是,这些是远远不够用的,我们在日常应用中,更多...
    99+
    2024-04-02
  • Python matplotlib如何实现图形绘制
    本篇内容主要讲解“Python matplotlib如何实现图形绘制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python matplotlib如何实现图形绘制”吧!1....
    99+
    2023-06-21
  • WPF实现绘制扇形统计图的示例代码
    扇形统计图 绘制一个扇形原理也是基于Canvas进行绘制;ArcSegment[1]绘制弧形;绘制指示线;绘制文本;鼠标移入动画;显示详情Popup;源码Github[2] ...
    99+
    2024-04-02
  • Python如果实现图形绘制
    这篇文章主要介绍Python如果实现图形绘制,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、画第一个图形第一个图形从简单的开始。1.1 代码# importing the requir...
    99+
    2023-06-22
  • PHP中Grafika如何实现图形绘制
    这篇文章主要介绍了PHP中Grafika如何实现图形绘制,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、绘制贝塞尔曲线贝塞尔曲线绘制,需要两个端点,一头一尾,还有两个控制点...
    99+
    2023-06-17
  • C++ opencv如何实现几何图形绘制
    这篇“C++ opencv如何实现几何图形绘制”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++ op...
    99+
    2023-06-30
  • WPF基于物理像素绘制图形
    WPF中有一个DrawingContext类,该类提供了很多画法方法,例如DrawLine,DrawText,DrawRectangle等。开发者使用它们可以方便地进行图形绘制。不过...
    99+
    2024-04-02
  • WPF仿LiveCharts实现饼图的绘制
    目录前言 一、PieControl.cs二、App.xaml三、MainWindow.xaml四、MainWindow.xaml.cs每日一笑 下班和实习生一起回家,公交站...
    99+
    2024-04-02
  • C++ opencv实现几何图形绘制
    目录1.矩形 rectangle()2. 圆 circle()3.椭圆 elliple()在学习过程中,我们可以在图像中绘制一些几何图形,比如矩形,椭圆,线段,填充多边形等,这些函数...
    99+
    2024-04-02
  • Qt如何实现实时鼠标绘制图形
    小编给大家分享一下Qt如何实现实时鼠标绘制图形,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!展示效果功能实现想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件:按下、移动、释放那么具体实现实时绘制矩形框的核心流程是什么呢?鼠...
    99+
    2023-06-29
  • html5如何绘制图形
    这篇文章主要介绍了html5如何绘制图形,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。html5中是怎么实现绘制图形?html5中可以实现绘...
    99+
    2024-04-02
  • Python中Matplotlib如何实现3D绘图
    小编给大家分享一下Python中Matplotlib如何实现3D绘图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mpl_toolkits 是 Matplotli...
    99+
    2023-06-21
  • VB.NET如何绘制图形
    这篇文章主要介绍VB.NET如何绘制图形,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.创建Graphics对象VB.NET绘制图形需要指定绘图表面。其中,窗体和所有具有Text属性的控件都可以作为绘制图形的表面。...
    99+
    2023-06-17
  • 如何使用css实现圆角图形绘制
    本篇内容介绍了“如何使用css实现圆角图形绘制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!htmlXML...
    99+
    2024-04-02
  • WPF基于物理像素怎么绘制图形
    本文小编为大家详细介绍“WPF基于物理像素怎么绘制图形”,内容详细,步骤清晰,细节处理妥当,希望这篇“WPF基于物理像素怎么绘制图形”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。从一个例子:从FrameworkE...
    99+
    2023-07-02
  • WPF+ASP.NETSignalR实现动态折线图的绘制
    目录什么是SignalRSignalR做了什么封装与集成SignalR用途官方网址和源码示例截图服务端项目创建SignalR服务端业务集成SignalR服务端配置客户端项目创建客户端...
    99+
    2023-01-03
    WPF 动态折线图 WPF 折线图 WPF SignalR 折线图
  • vue如何实现3D环形图效果
    这篇文章主要介绍“vue如何实现3D环形图效果”,在日常操作中,相信很多人在vue如何实现3D环形图效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何实现3D环形图效果”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作