array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 图形学入门:坐标变换 - 爱码网

在几何阶段,我们不妨想象这样一个过程:我们在真实世界中,是如何拍照的呢?
1,寻找拍摄对象(模型变换)
2,摆放相机(相机变换)
3,调节相机参数(投影变换)
4,拍照(视口变换)->光栅化(下一阶段)
图形学入门:坐标变换
首先看一下坐标变换的原理:
蓝色坐标系在红色坐标系中的表示:
首先由于蓝色坐标系跟红色坐标系的坐标方向是相反的,所以在矩阵中,单位向量的值为负值。
图形学入门:坐标变换
模型变换
将本地坐标变换为世界坐标:比如我想要将一个模型导入UE4,这个模型本身是有形状的,它各个顶点的相对位置都是固定的,所以有一个本地的坐标。而我要将这个模型导入世界,它在世界中就要有自己的坐标,这个过程就是模型变换。
这个过程里,矩阵是四维的。(三维的单位向量+一个相对坐标值)

图形学入门:坐标变换
具体的变换过程如图:要得到本地模型在世界中的坐标,首先要有一个模型变换矩阵,这个矩阵就是M。
M相对世界的偏移是(0,0,-5),那么模型变换矩阵就是一个单位矩阵+偏移量。本地坐标P是(0,3,0),而其
向量对应就是(0,3,0,1),1代表它是一个点。世界坐标就是MP。

相机变换
比如相机坐标的偏移是(0,0,5),那么相机坐标系就是单位矩阵+偏移量。那么相机坐标是否就是Mview*Mmode呢?
图形学入门:坐标变换
答案是错;
要得到相机坐标下的位置,首先要把相机坐标系移动到世界坐标系中,即相机坐标系的逆变换。
图形学入门:坐标变换
所以相机坐标系就如上图所示

正交投影变换
图形学入门:坐标变换

正交投影:设置相机时会设置一个视锥体,那么从相机的位置看来,其他的坐标就已经固定好了。
图形学入门:坐标变换
步骤如下:
1,移动视锥体到相机坐标的中心。
2,归一化,将边的大小缩放到-1到1之间。
3,Z的方向要反向,z本来是默认指向屏幕外的方向,但这并不是相机拍摄的方向。

1,位移矩阵
图形学入门:坐标变换
图形学入门:坐标变换
最后就是,相机会从视锥体的中心向外看。

2,缩放矩阵
图形学入门:坐标变换
图形学入门:坐标变换
3,Z反向矩阵
只把Z轴的单位向量取反即可
图形学入门:坐标变换

最后,矩阵运算
图形学入门:坐标变换
这里注意,最先运算的放在最右边,最晚运算的放在最左边,这是矩阵乘法的性质。因为矩阵乘法对顺序敏感。

最后合成的正交变换投影矩阵就是这个。
图形学入门:坐标变换
所需参数:6个。即近平面和远平面的两个点,是一个对角线。Xmax,Ymax,Zmaxa,Xmin,Ymin,Zmin。将这两个点的值代入,即可得到矩阵。

透视投影
符合近大远小原理的投影
图形学入门:坐标变换
图形学入门:坐标变换
上图的左图就是原始图的俯视图,右图是从x轴负方向看过去的图。可以看出Znear/Z=Xp/X;
图形学入门:坐标变换
Z值为了符合习惯,要乘以-1取反方向,上下同乘以一个z,再经过变化,可以得到右侧的矩阵。
然后对应平面上的所有点乘以这个矩阵,就会得到投射的对应点。

视口变换
将(-1,1)范围转换到屏幕坐标,深度值从(-1,1)转换到(0,1),缩放2倍
1,缩放
2,移动
合成到一起之后就变成了了下图的公式;(左侧移动,右侧缩放):
移动:(Xmin+Xmax)/2,(Ymax+Ymin)/2,1/2;
缩放:(Xmax-Xmin)/2,(Ymax-Ymin)/2,1/2;
图形学入门:坐标变换

相关文章: