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. Java并发包源码学习系列:同步组件CyclicBarrier源码解析

    目录 CyclicBarrier概述 案例学习 类图结构及重要字段 内部类Generation及相关方法 void reset() void breakBarrier() void nextGener ...

  2. 模拟web服务器 (小项目) 搭建+部署

    模拟web服务器:可以从浏览器中访问到自己编写的服务器中的资源,将其资源显示在浏览器中. 技术选型: corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会像服务端发送数据, 服务器像 ...

  3. 几个小实践带你快速上手MindSpore

    摘要:本文将带大家通过几个小实践快速上手MindSpore,其中包括MindSpore端边云统一格式及华为智慧终端背后的黑科技. MindSpore介绍 MindSpore是一种适用于端边云场景的新型 ...

  4. Vue学习笔记-django-cors-headers安装解决跨域问题

    一  使用环境: windows 7 64位操作系统 二  jango-cors-headers安装解决跨域问题(后端解决方案) 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的 ...

  5. Java常用类:Scanner类

    一.简介 java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入. 二.创建对象 示例: Scanner scanner = new Scanner(Sy ...

  6. TcaplusDB服务体系揭秘

    导言 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研.具备缓存+落地融合架构.PB级存储.毫秒级时延.无损水平扩展和复杂数据结构等特性.同时具备丰富的生态.便捷的迁移. ...

  7. go mod管理 init 和 包导入的关系

    你创建了一个文件的名字为:lisi001 如果你初始化项目名字为lisi, go mod init lisi 那么你导包的时候就得也用lisi import ( "lisi/path&quo ...

  8. 13. Vue CLI脚手架

    一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...

  9. Java 常见对象 01

    常见对象·Object类 Object类的概述 * A:Object 类概述 * 类层次结构的根类 * 所有类都直接或间接地继承自该类 * B:构造方法 * public Object() * 回想为 ...

  10. JVM 中的异常

    StackOverflowError 在 JVM 的栈中,如果线程要创建的栈帧大小大于栈容量的大小时,就会抛出 java.lang.StackOverflowError.比如下面的代码 public ...