WPF-3D圆柱体透视
3D圆柱体透视效果
总效果
原理:
3D面+面在摄像机方向上的2D投影点的集合
3D面效果:
2D线:
画线时需要注意两个点:
1 在圆柱体上下两个圆之间有两条竖着的棱边代表圆柱体边缘
2 被遮盖的圆面后半面显示为虚线
1 如何确定两条棱边的位置
我们需要确定上下两个圆面最左边和最右边的点。
随着摄像机的移动,上面的左右两个点和下面的左右两个点也随之变化
点的变化和Y轴无关,所以我们可以把它看作是个2维关系。
其中直线是摄像机位置视角与面中心的连线,两个红点则是这个面最左边的点和最右边的点。
即问题转变为:求一条过圆心的点直线的垂线与圆的交点。
即:
Point3D cameraRealPosition = transform.Transform(carema.Position);
Point caremaRealPoint = new Point(cameraRealPosition.X, cameraRealPosition.Z);
var l1 = caremaRealPoint.X - center.X;
var l2 = caremaRealPoint.Y - center.Y;
var l3 = Math.Sqrt(l1 * l1 + l2 * l2);
var sinb = l2 / l3;
var cosb = l1 / l3;
var x1 = r * sinb + center.X;
var y1 = -r * cosb + center.Y;
var x2 = -r * sinb + center.X;
var y2 = r * cosb + center.Y;
此时我们求出一个面的点(x1,y1)(x2,y2)
在三维中,y是z轴,则点为
new Point3D(x1, pointTopCenter.Y, y1)
new Point3D(x2, pointTopCenter.Y, y2)
new Point3D(x1, pointBottomCenter.Y, y1)
new Point3D(x2, pointBottomCenter.Y, y2)
上下点连线则为圆柱体的侧边。
2 如何确定虚线位置。
2.1分离实线点和虚线点
我们可以发现虚线与实线是以(x1,y1)(x2,y2)分离的。
由于线是以投影点的集合组合而成。
我们可以根据每个点在(x1,y1)-(x2,y2)这条直线的左边还是右边把这个集合分成两部分。
根据向量叉乘来判断在左边还是右边。
bool IsPointOnLineLeftOrRight(Point a, Point b, Point p)
{
Vector pa = new Vector(a.X - p.X, a.Y - p.Y);
Vector pb = new Vector(b.X - p.X, b.Y - p.Y);
return Vector.CrossProduct(pa, pb) < 0;
}
其中ab为分别为x1y1左边两个点。
2.2确定上面存在虚线还是下面存在虚线
思路:从四个集合中选取位置相同四个点,通过和摄像机的距离比较来判断哪个集合是虚线集合
1 通过上下面相同位置的点F1,F2的距离,判断是上面存在被遮盖的面还是下面存在被遮盖的面。
如图:
DistanceF2ToCamera>DistanceF1ToCamera
则虚线应该在下边这个圆上。
2.3 确定面左边集合是虚线还是右边集合
同样DistanceF3ToCamera>DistanceF4ToCamera
所以F3所在的集合是虚线点集
由此就可以判断虚线点集了。
3 点集的顺序一致性。
我们画的是开放的半圆,在画2D半圆线的时候,我们需要保证从左边第一个点开始画,画到最右边的点,
如果是从中间开始画,那么就会是个封闭的半圆了。
开放的半圆:
封闭的半圆:
所以我们要保证点集的顺序是从左到右的:
正常视角:
那我们存在两种情况:
若以A为起点,则按顺序有三个点集:A1,B,A2
则
点集A=A2+A1
点集B=B
若以A为起点,则按顺序有三个点集:A1,B,A2
则
点集A=A2+A1
点集B=B
两种情况统一:
我们需要注意的是A=A2+A1
两个集合添加的时候顺序要变一下。
WPF-3D圆柱体透视的更多相关文章
- WPF 3D 知识点大全以及实例
引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...
- WPF 3D model - Sphere, Cone, and Cylinder
原文:WPF 3D model - Sphere, Cone, and Cylinder Extending Visual3D - Sphere, Cone, and Cylinder http: ...
- WPF 3D编程介绍
原文:WPF 3D编程介绍 上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书.今天要来讲一下在WPF如何开展3D编程. 使用的xmal 和C#开发的时候:需要使用如下的关键要素: 1:摄像机 ...
- 【CSS3进阶】酷炫的3D旋转透视
之前学习 react+webpack ,偶然路过 webpack 官网 ,看到顶部的 LOGO ,就很感兴趣. 最近觉得自己 CSS3 过于薄弱,想着深入学习一番,遂以这个 LOGO 为切入口,好好研 ...
- 优化WPF 3D性能
Maximize WPF 3D Performance .NET Framework 4.5 As you use the Windows Presentation Foundation (WPF ...
- WPF 3D 小小小小引擎 - ·WPF 3D变换应用
原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...
- WPF 3D 常用类(1)
原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox MeshGeometry3D Geomet ...
- WPF 3D:使用GeometryModel3D的BackMaterial
原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的 ...
- WPF 3D:MeshGeometry3D的定义和光照
原文 WPF 3D:MeshGeometry3D的定义和光照 由于WPF计算光照会根据整个平面的方向向量,所以如果在不同面上使用同一个点可能会达到不同的光照效果.让我们用不同的定义Mesh的方法来演示 ...
- WPF 3D: MeshGeometry3D纹理坐标的正确定义
原文 WPF 3D: MeshGeometry3D纹理坐标的正确定义 为了使基于2D的纹理显示在3D对象中,我们必须定义3D Mesh对象的纹理贴图坐标.在WPF中,此项功能则通过MeshGeomet ...
随机推荐
- Java并发包源码学习系列:同步组件CyclicBarrier源码解析
目录 CyclicBarrier概述 案例学习 类图结构及重要字段 内部类Generation及相关方法 void reset() void breakBarrier() void nextGener ...
- 模拟web服务器 (小项目) 搭建+部署
模拟web服务器:可以从浏览器中访问到自己编写的服务器中的资源,将其资源显示在浏览器中. 技术选型: corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会像服务端发送数据, 服务器像 ...
- 几个小实践带你快速上手MindSpore
摘要:本文将带大家通过几个小实践快速上手MindSpore,其中包括MindSpore端边云统一格式及华为智慧终端背后的黑科技. MindSpore介绍 MindSpore是一种适用于端边云场景的新型 ...
- Vue学习笔记-django-cors-headers安装解决跨域问题
一 使用环境: windows 7 64位操作系统 二 jango-cors-headers安装解决跨域问题(后端解决方案) 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的 ...
- Java常用类:Scanner类
一.简介 java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入. 二.创建对象 示例: Scanner scanner = new Scanner(Sy ...
- TcaplusDB服务体系揭秘
导言 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研.具备缓存+落地融合架构.PB级存储.毫秒级时延.无损水平扩展和复杂数据结构等特性.同时具备丰富的生态.便捷的迁移. ...
- go mod管理 init 和 包导入的关系
你创建了一个文件的名字为:lisi001 如果你初始化项目名字为lisi, go mod init lisi 那么你导包的时候就得也用lisi import ( "lisi/path&quo ...
- 13. Vue CLI脚手架
一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...
- Java 常见对象 01
常见对象·Object类 Object类的概述 * A:Object 类概述 * 类层次结构的根类 * 所有类都直接或间接地继承自该类 * B:构造方法 * public Object() * 回想为 ...
- JVM 中的异常
StackOverflowError 在 JVM 的栈中,如果线程要创建的栈帧大小大于栈容量的大小时,就会抛出 java.lang.StackOverflowError.比如下面的代码 public ...