WPF 3D model - Sphere, Cone, and Cylinder

WPF 3D开发教程(四) 四、实战:展示一个圆柱体 4.1圆柱体分解 我们知道,3D模型是用三角形表示的,那一个圆该如何表示呢?其实用的就是割圆法,也就是用一个近似的多边形就表示一个圆。下图展示了10、20、50个顶点的正多边形,可以看出,正50边形看上去跟圆已经很接近了。我们的例子就是用正50边形。 切分之后,圆柱体变成了如下所示的三棱体的组合: 我们需要描述这个三棱体的三个面,共4个三角形(侧面是一个... 阅读详情

 

Extending Visual3D - Sphere, Cone, and Cylinder

http://blogs.msdn.com/b/danlehen/archive/2005/10/16/481597.aspx

 

He put together a short sample which derives a Sphere, a Cone, and a Cylinder primitive from ModelVisual3D.  (Source available here.) 

 

You will notice that these primitives are directly usable from Xaml:

<Viewport3D Camera=”{Camera}” >
  <my:Sphere3D Transform=”{XForm1}” Material=”{Azul}” />
  <my:Cone3D Transform=”{XForm2}” Material=”{Tulips}” />
  <my:Cylinder3D Transform=”{XForm3}” Material=”{Autumn}” />
</Viewport3D>

 

 

Perspective : Easy 3D programming with WPF

 

http://www.odewit.net/ArticleContent.aspx?id=Wpf3DIntro&lang=en&format=xaml

 

 

[Lieo原创]圆柱体的三角形剖分——使用WPF 3D绘制圆柱体

  上个学期在做某个软件时需要使用WPF绘制一些基本的三维物体。找了很多资料,发现大多是介绍球体的,因为这些图形的绘制原理基本类似。

  但是在绘制圆柱体时遇到了一个问题,就是不知道空间中任意一个圆的参数方程。凭大学里学的高等数学知识仅能推导出底面与坐标平面平行的圆的参数方程,如果圆与坐标面成任意夹角就无法解决。使用与坐标面平行的圆绘制出的“类圆柱体”已经可以满足我的程序的需求了,但是绘制出来的毕竟不是一个真正的圆柱。向同学请教了参数方程后后,终于解决了这个问题。

  【铺垫:使用WPF 3D绘制三维物体的方法概述】

  与Direct 3D类似,在WPF中,任何三维物体都是由三角形组成的。MeshGeometry3D对象定义组成图像的各个三角形顶点和这些顶点的连接方式。该对象的Positions属性是一个Point3D类型的集合,用户记录三角形的各顶点坐标,TriangleIndices属性则描述这些顶点的链接方式。

  GeometryModel3D对象的Material和BackMaterial属性可以定义三维物体的表面和背面材质。在本程序中,材质只用到了漫反射材质DiffuseMaterial。Geometry属性指定该三维物体的MeshGeometry3D对象。为此,我们可以为每一个原子、键和平面生成各自的GeometryModel3D对象,这样就可以为每一个元素分别进行着色。

  每个GeometryModel3D被承载在一个ModelVisual3D对象中。整个三维场景都被定义在一个Viewport3D对象中。该对象的Children属性是ModelVisual3D的集合。将预先设定的三维物体的ModelVisual3D对象添加到集合中,便可以在Viewport3D视图中显示。

 

  【引子:先了解如何绘制一个球面】

  一个球体可以表示成由经线和纬线组成的网格,我们可以将每个网格近似地看成由两个三角形组成的平面,如下图所示。

  

  为了依次生成球面上离散的各点坐标,需要将球面写成参数形式。设球心在坐标原点,球体半径为R,则其参数方程为:

  

  使用参数方程,用双重循环即可生成球面的点。代码如下:

 

        '将球面进行三角形拆分。设球面的参数方程为:
        ' x = - r * cosφ * sinθ
        ' y = r * sinφ
        ' z = - r * cos φ * cosθ
        '其中,-π/2≤φ≤π/2,-2π≤θ≤2π

        Dim mesh As New MeshGeometry3D

        Dim x, y, z, theta, phi As Double
        Dim normal As Vector3D   '组成球面的某个三角形的法向量

        For i As Integer = 0 To Stacks  '将球面拆分成Stacks个等距离的薄片(纬度,自上向下)
            phi = Math.PI / 2 - i * Math.PI / Stacks   '计算该纬度位置的phi角
            y = R * Math.Sin(phi)  '计算该纬度位置的y轴坐标(假设球心在原点)

            For j As Integer = 0 To Slices  '将球面纵向切成Slices份(经度方向,自西向东)
                theta = j * 2 * Math.PI / Slices     '计算该经度位置的theta角
                '按照参数方程计算出另外两个坐标值
                x = -R * Math.Cos(phi) * Math.Sin(theta)
                z = -R * Math.Cos(phi) * Math.Cos(theta)
                normal = New Vector3D(x, y, z)  '当球心在原点时,某点的法向量就是(x,y,z)
                mesh.Positions.Add(normal + center)  '某点的坐标:指定的球心+当前计算出的坐标
                '计算材质对应的二维坐标,点(j / Slices, i / Stacks)是该点在二维平面展开后对应的坐标
                mesh.TextureCoordinates.Add(New Windows.Point(j / Slices, i / Stacks))
            Next j
        Next i

 

  其中Stacks表示纬度剖分数,Slices为经度拆分数。每计算一个顶点的坐标,便将其添加到Positions集合中。mesh.Normals.Add方法由于指定该点的法向量。该点的法向量方向是球心与该点连线的向量方向,即 ,而该点的坐标为 ,其中c是球心的坐标。

  接下来需要考虑的问题是如何为球面着色。设想球面按球面轴展开,就成了如下图所示的二维平面。

  

  与顶点集合对应的TextureCoordinates集合指定了填充三维对象表面时顶点与二维图像之间的关系。WPF定义与三维物体表面对应的二维填充平面的左上顶点和右下顶点分别为(0,0)和(1,1),如上图所示的(i,j),其对应的二维向量为 。mesh.TextureCoordinates.Add(i/stacks,j/slices)就是指定该顶点与二维填充平面的对应关系。

  顶点和相关集设置好后,需要指定这些顶点如何构成三角形。具体实现方式请参考Lieo3DModel类中GenerateSphereMesh方法。

  【进入正题:圆柱体侧面的三角形剖分】

  与球体类似,圆柱体按照其轴展开后也是一个矩形。

  

  可以想象,设n表示从底面圆心指向顶面圆心的向量,将一个底面圆上的按照圆的参数方程等间隔地生成,那么顶面相对应的顶点的坐标可按照向量n平移得到。将这样的两个点连起来,连线与轴平行。按照这个思路,只需要生成底面圆上各点的坐标,即可按照图将圆柱剖分成三角形。

  空间中任意一个圆的参数方程为:

  
  其中 为圆的法向量。为了计算这两个与法向量相互正交的向量,可以使用向量的叉积运算。

  设M是空间中任意一个不与圆的法向量共线的向量,令 ,这样得到的 就是相互垂直的。将向量归一化后,便得到了参数方程所需要的a,b。

  参照球面生成的代码,生成圆柱的代码能够很容易写出。具体请下列代码:

    ''' <summary>
    ''' 将两底面圆心在 p1、p2 位置,底面半径为 R 的圆柱体进行三角形剖分。
    ''' </summary>
    ''' <param name="p1">圆柱上底面圆心的坐标。</param>
    ''' <param name="p2">圆柱下底面圆心的坐标。</param>
    ''' <param name="R">圆柱的底面半径。</param>
    ''' <returns>返回值:代表该圆柱面的MeshGeometry3D对象。</returns>
    Public Shared Function GenerateCylinderMesh(ByVal p1 As Point3D, ByVal p2 As Point3D, ByVal R As Double) As MeshGeometry3D
        '将圆柱体进行三角形剖分

        '空间中圆的参数方程:(x,y,z) = r*(A*cosθ+B*sinθ)+(x0,y0,z0)   【0≤θ≤2π】
        '  其中 a、b 是单位向量,且满足 A⊥B⊥n(圆的法向量)

        Dim mesh As New MeshGeometry3D
        Dim CircleVector As Vector3D = p2 - p1   '从p1点到p2点的3D向量

        Dim M As New Vector3D(1, 1, 1)

        If Vector3D.AngleBetween(M, CircleVector) < 0.1 Then
            M = New Vector3D(1, 0, 0)
        End If


        Dim A As Vector3D = Vector3D.CrossProduct(CircleVector, M)
        Dim B As Vector3D = Vector3D.CrossProduct(CircleVector, A)

        A.Normalize()
        B.Normalize()

        Dim theta As Double
        Dim Pos1, Pos2 As Point3D

        '设圆与 xz 轴平行
        For i As Integer = 0 To Stacks

            '计算剖分三角形顶点在参数方程中对应的角度
            theta = i / Stacks * Math.PI * 2

            Pos1 = R * (A * Math.Cos(theta) + B * Math.Sin(theta)) + p1
            Pos2 = R * (A * Math.Cos(theta) + B * Math.Sin(theta)) + p2

            mesh.Positions.Add(Pos1)
            mesh.Positions.Add(Pos2)

            mesh.TextureCoordinates.Add(New Windows.Point(i / Stacks, 0))
            mesh.TextureCoordinates.Add(New Windows.Point(i / Stacks, 1))
        Next

        For i As Integer = 0 To Stacks - 1
            mesh.TriangleIndices.Add(i * 2)
            mesh.TriangleIndices.Add(i * 2 + 1)
            mesh.TriangleIndices.Add(i * 2 + 3)

            mesh.TriangleIndices.Add(i * 2)
            mesh.TriangleIndices.Add(i * 2 + 3)
            mesh.TriangleIndices.Add(i * 2 + 2)
        Next

        Return mesh
    End Function

 

WPF 3D 球面导览 基于WPF的3D Sphere实现模式,升级实现了该3D导览Demo。先pose一张demo效果图 所有顶点的坐标来源于足球的顶点。足球整个球面完全由正五边形和正六边形拼成,每条拼缝的长度一致,故知道球体半径后即可设法求出60个顶点的坐标。 具体求法属于数学的立体几何范畴,反正求解时废了我蛮多精力的,完全是工匠精神支撑我求解完成,具体就不做详述了,可参考以下图: 来源... 阅读详情

相关推荐

SkiaSharp中的WPF自绘弹性小球.NET

在本文中,我们使用SkiaSharp和WPF创建了一个具有弹力效果的小球动画。通过自定义控件和绘图方法,我们能够在WPF应用程序中绘制和显示小球,并使用SkiaSharp的功能来实现动画效果。在本文中,我们将探讨如何使用SkiaSharp库和WPF(Windows Presentation Foundation)来实现一个具有弹力效果的小球动画。SkiaSharp是一个.NET平台上的开源2D图形库,它提供了跨平台的绘图功能,而WPF是用于创建Windows桌面应用程序的UI框架。步骤3:创建自定义控件。

YOLOv222的博客 448

WPF的三维图形应用

本主题概述 Windows Presentation Foundation (WPF) 图形系统中的三维功能。通过 WPF 三维实现,开发人员可使用与该平台所提供给二维图形的相同的功能,对标记和过程代码中的三维图形进行绘制、转换和动画处理。 开发人员可以合并二维和三维图形来创建丰富的控件,提供复杂的数据图解,或者增强用户对应用程序界面的体验。WPF 支持三维的设计宗旨不是提供功能齐全...

diemei3272的博客 1007

WPF实现简单的3D图形

它不支持完整的3D游戏开发,但在某种程度上,您可以创建3D图形。通过组合 2D 和 3D 图形,您还可以创建丰富的控件、提供复杂的数据插图或增强应用程序界面的用户体验。“视口3D”元素将 3D 模型托管到我们的 WPF 应用程序中。以下 XAML 代码创建一个 3D 对象和一个滑块。在滑块的帮助下,您可以旋转此 3D 对象。以下 XAML 代码演示如何使用 3D 几何图形创建 2D 对象。运行应用程序时,它将在窗口上生成一个 3D 对象和一个滑块。当您编译并执行上述代码时,它将在3D中生成2D对象。

仰望星空的博客 1550

WPF绘制深度不同颜色的3D模型填充图和线框图

在机械测量过程中,测量的数据需要进行软件处理。通常测量一个零件之后,需要重建零件的3D模型,便于观察测量结果是否与所测工件一致。 重建的3D模型需要以填充图和线框图两种方式切换显示,其中填充图的材质需要根据不同深度进行着色,线框图需要消隐(不能透视)。以圆柱为例,如下图: 由于WPF对DirectX进行了封装,并构建出一套简单的3D绘图框架,因此我们可以快速的创建所需要的3D模型,便于像我

DC的陋室 9354

WPF学习之绘图和动画

如今的软件市场,竞争已经进入白热化阶段,功能强、运算快、界面友好、Bug少、价格低都已经成为了必备条件。这还不算完,随着计算机的多媒体功能越来越强,软件的界面是否色彩亮丽、是否能通过动画、3D等效果是否吸引用户的眼球也已经成为衡量软件的标准。 软件项目成功的三个要素是:资源、成本、时间。无论是为了在竞争中保持不败还是为了激发起用户对软件的兴趣,提高软件界面的美化程度、恰当的将动画和3D等效果引入

星火燎猿 5万+

使用wpf制作3D效果圆柱体

使用wpf制作的3D效果圆柱体,并具有动态指定体高,可用于某事物的动态占用比例显示。

WPF 3D圆锥图形

创建一个新WPF项目: XAML代码: <Grid> <Viewport3D Name="myViewport" > <Viewport3D.Camera> <PerspectiveCamera FarPlaneDistance="20"...

qq_42345466的博客 615

WPF多小球轨迹动画

这是根据WPF编程宝典第15.5例子修改来的~

以WPF绘图简单的圆形

 WPF有非常优异的2D与3D绘图能力,研讨会上许多人看过我Demo的一些WPF动态作品集,在这Show一下WPF绘制三个圆形,并透明重迭  语法如下:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title

软件开发资料汇总 395

WPF加载模型及控件3D化(控件作为纹理)源码

Assimp加载模型,把一个球体模型中贴上mediaplayer播放视频。

A-Level CS 计算机科学 考试知识点——考试介绍&第1章

前言:该系列文章是本人在给学生辅导本课程的过程中结合英文教材所总结的,该系列共分为30章,主要介绍了考试的核心知识点。若需要A-Level CS 计算机科学考试辅导也可以私信我。 目录 关于A-Level CS 计算机科学考试 考试简介 考试内容 考试时间 评分情况 第1章 信息表示 本章学习内容 1.01 数字系统 1.02 数字的内部编码 整数编码(Coding for integers) 二进制编码的十进制(Binary coded decimal——BCD) 1.03.

王俊的博客 6457

SkiaSharp 之 WPF 自绘 弹动小球(案例版)

第一次实现特效,当初学FLash,就见到过很多特效的效果,现在自己用敲出来特效感觉是挺不一样的。

蓝创精英团队 957

Cadence创建异形焊盘教程(详细操作)

背景:一些常见的矩形/圆形焊盘,设置参数就可。碰到非规则的一些焊盘,那只能用Cadence Allegro PCB来画咯。 一、新建图形 【File】——>【New…】 弹出如下窗口,选择绘制的类型Shape symbol、路径,输入名字 二、设置参数 【Setup】——>【Design Parameters…】 Enhanced display modes:增强型显示模型。全部勾选上。 在【Design】设置单位为mm 设置偏移量(-50,-50) 三、绘制图形 1、找到原点,即参考

qq_42057393的博客 2万+

WPF-3D动效-文字球形环绕

费劲写了一个动效,却要被砍掉,心碎.... private List&lt;Point3D&gt; GetBuckyBallPoints() { List&lt;Point3D&gt; ltPoints = new List&lt;Point3D&gt;(); ltPoints.Add(new Point3D(.85065...

DuelCode的博客 2471

手把手教你用C语言给STM32写一个Modbus RTU从机库(含完整项目源码)

在工业自动化领域,Modbus RTU协议因其简单可靠的特点,成为RS485总线通信的事实标准。对于嵌入式开发者而言,为STM32等微控制器实现一个高效的Modbus RTU从机协议栈,是开发智能传感器、执行器等设备的必备技能。Modbus RTU从机的核心是一个状态机,需要处理帧接收、CRC校验、功能码解析和响应生成等环节。工业现场总会遇到意想不到的干扰情况,一个健壮的协议栈应该能够优雅地处理各种异常场景,而不是简单地崩溃或死锁。工业现场环境复杂,协议栈必须具备完善的异常处理机制。

weixin_30561425的博客 516

2019年数学建模美赛经验总结

北京时间2019年1月29号上午9时,数模美赛结束。美赛结束已经10多天了,我在这次竞赛中负责建模和编程,趁现在记忆还比较清晰,写下这篇博客记录第一次参加数学建模美赛的经历。 补更:2019年4月20日公布成绩,笔者最终获得了美赛一等奖 目录 1、基本情况 2、选题 3、分工合作 4、论文写作 5、建模 6、编程 7、入门资源 ...

Smallactive 7万+

WPF基础知识系例

WPF图形与绘图

lingshuangcanxue 2236

AutoSAR开发实战:如何用Matlab/Simulink从零搭建SWC组件(附完整代码示例)

本文详细介绍了使用Matlab/Simulink从零开发AutoSAR SWC组件的全流程,包括环境配置、ARXML文件导入、算法模型开发、代码生成与集成验证等关键步骤。通过实战案例和完整代码示例,帮助开发者掌握AutoSAR标准下的软件开发技术,提升汽车电子系统的开发效率。

weixin_29093017的博客 256

WPF特效-实现3D足球效果

WPF 实现 3D足球效果,效果图如下:  每个面加载不同贴图。&lt;UserControl x:Class="MediaBalll.Model3Ds.BuckyBall"             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"             xmlns:x="http://schema...

DuelCode的博客 3523

立创开源4G+GPS定位系统:基于微信小程序的低成本低功耗追踪方案

本文介绍了一个基于立创开源平台的超小型4G+GPS定位系统方案。该方案采用28mm*28mm主板,集成4G Cat.1通信与GPS定位,通过微信小程序“点灯专家”实现远程追踪管理,具备低成本、低功耗、易于部署的特点,适用于电动车、宠物、资产追踪等多种场景。

weixin_28895791的博客 394

基于Simulink的间接功率控制的矩阵变换器

通过上述步骤,我们成功设计并实现了基于 Simulink 的间接功率控制的矩阵变换器仿真模型。该模型能够通过控制输入电流和输出电压,实现对功率的间接控制,适用于电机驱动、可再生能源系统、电力传输等领域。通过虚拟场景仿真、参数优化和性能评估,验证了系统的稳定性和高效性,并通过调整 PI 控制器参数和优化调制算法,进一步提升了系统的性能。

MHD0815的博客 296
上一篇: WPF线程处理模型
下一篇: Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additio
wmjcom
博客等级 码龄24年 71粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值