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圆柱体透视的更多相关文章

  1. WPF 3D 知识点大全以及实例

    引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...

  2. WPF 3D model - Sphere, Cone, and Cylinder

    原文:WPF 3D model - Sphere, Cone, and Cylinder   Extending Visual3D - Sphere, Cone, and Cylinder http: ...

  3. WPF 3D编程介绍

    原文:WPF 3D编程介绍 上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书.今天要来讲一下在WPF如何开展3D编程. 使用的xmal 和C#开发的时候:需要使用如下的关键要素: 1:摄像机 ...

  4. 【CSS3进阶】酷炫的3D旋转透视

    之前学习 react+webpack ,偶然路过 webpack 官网 ,看到顶部的 LOGO ,就很感兴趣. 最近觉得自己 CSS3 过于薄弱,想着深入学习一番,遂以这个 LOGO 为切入口,好好研 ...

  5. 优化WPF 3D性能

    Maximize WPF 3D Performance .NET Framework 4.5   As you use the Windows Presentation Foundation (WPF ...

  6. WPF 3D 小小小小引擎 - ·WPF 3D变换应用

    原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...

  7. WPF 3D 常用类(1)

    原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox MeshGeometry3D Geomet ...

  8. WPF 3D:使用GeometryModel3D的BackMaterial

    原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的 ...

  9. WPF 3D:MeshGeometry3D的定义和光照

    原文 WPF 3D:MeshGeometry3D的定义和光照 由于WPF计算光照会根据整个平面的方向向量,所以如果在不同面上使用同一个点可能会达到不同的光照效果.让我们用不同的定义Mesh的方法来演示 ...

  10. WPF 3D: MeshGeometry3D纹理坐标的正确定义

    原文 WPF 3D: MeshGeometry3D纹理坐标的正确定义 为了使基于2D的纹理显示在3D对象中,我们必须定义3D Mesh对象的纹理贴图坐标.在WPF中,此项功能则通过MeshGeomet ...

随机推荐

  1. JDK源码阅读-Reference

    本文转载自JDK源码阅读-Reference 导语 Java最初只有普通的强引用,只有对象存在引用,则对象就不会被回收,即使内存不足,也是如此,JVM会爆出OOME,也不会去回收存在引用的对象. 如果 ...

  2. 怎么去掉右下角的thinkphp的图标

    关闭thinkphp右下角的trace可以试试以下步骤: 1.在入口文件index.php 加入 define("APP_DEBUG", false); 2.在config.php ...

  3. 前端axios传递一个包含数组的对象到后台,后台可以用String接收,也可以用List集合接收

    前端代码: data() { return { listQuery: { date: [], } }}, //查询列表信息getList() { if (this.listQuery.date == ...

  4. dpi dp px 换算关系

    getResources().getDisplayMetrics().densityDpi 就是屏幕密度.getResources().getDisplayMetrics().density 也可以理 ...

  5. HBase 数据存储结构

    在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下 支持多版本数据 这看着感觉也没有那么太大的区别呀, ...

  6. CSharp使用ANTLR4生成简单计算Parser

    ANTLR简介 ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, pr ...

  7. ElasticSearch 数据建模

    公号:码农充电站pro 主页:https://codeshellme.github.io 通常在使用 ES 构建数据模型时,需要考虑以下几点: 字段类型 是否需要搜索与分词 是否需要聚合与排序 是否需 ...

  8. spring-Cloud初步依赖

    <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...

  9. #progma pack(x)说明

    1.字节对齐(内存相关) 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数 ...

  10. 因MemoryCache闹了个笑话

    前言 是这么一回事: 我正在苦思一个业务逻辑,捋着我还剩不多的秀发,一时陷入冥想中...... 突然聊天图标一顿猛闪,打开一看,有同事语音: 大概意思是:同事把项目中Redis部分缓存换成Memory ...