欢迎来到【畅哥聊技术】前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注。

写在前面

先说好,今天所说的3D并不是大家惯性思维说3D就想到了WebGL,那么接下来的文章都是基于Canvas2d来模拟3D空间~

那么要模拟3维世界,那么我们不得不提到一个新的名词:第三维度~

第三维度

这个不难理解,我们在Canvas2d中有两个坐标轴,X,Y,那么要模拟3D效果,那么我们就得抽象一个Z 轴出来 ,如上图,这个Z轴是垂直于我们的屏幕。

我们接下来规定,Z轴的正方向是向垂直屏幕向里为,相反则为负方向。

透视图

什么是透视图?一句话概括:近大远小!!!

物体远离视线,那么就会越来越小,直到消失在屏幕上,消失的时候的那一个点我们称之为 消失点

那么怎么在2维空间去模拟3D世界的呢?也就是说我们要把3空间的坐标转换到2d屏幕上来。

原理:

  1. 放大或缩小物体
  2. 让它靠近或者远离消失点

透视图公式如上图

scale = f1 / (f1 + z)

其中f1可以理解为我们的眼睛距离屏幕的距离

z为物体离屏幕的距离。

怎么理解这个公式呢?再来看张图:

假如我们的Z轴为0,小球此时应该在(400,300)的位置,这时候,我们刚好可以看到小球的全部。scale = 200 / (200+0) = 1;

此时,如果我们把小球向Z轴的正方向移动200的时候,那么此时的scale = 200 / (200 + 200) = 0.5; 也就是说,小球的scaleX和scaleY都将变成.5 ,还有小球的xy坐标也将是之前的一半~从图中可以看出来,移动后的小球的坐标是(200,150)

有了上面的基础,接下我们的示例就好展开了。请看~

效果分析:

  • 默认情况下,小球Z轴为0,那么可正常随着鼠标移动
  • 注册键盘事件,按下上方向键的时候,我们不断的放大Z值,那么小球对应的缩小,按方向下键的时候,Z值不断缩小 ,小球变大
  • 当鼠标Z轴不断增大,再去移动鼠标,发现小球和鼠标之间就形成了视差的效果了。

实现过程:

  1. 定义x,yz,默认分别为0,f1 = 200以及消失点坐标(width>>1,height>>1)
  2. 实例化小球。
  3. 注册鼠标事件和键盘事件,并且在键盘事件中处理Z轴的大小来控制小球的位置。

核心代码:

let x =0,y = 0,z = 0;

var hideX = width >> 1,

hideY = height >> 1;

var f1 = 200;

var mouse = {x:0,y:0}

window.addEventListener('keydown',e=>{

if(e.keyCode === 38){

z+=5;

}

if(e.keyCode === 40){

z -=5;

}

});

canvas.onmousemove = e =>{

mouse.x = e.pageX - canvas.offsetLeft;

mouse.y = e.pageY - canvas.offsetTop;

}

在事件循环函数中不停的去计算当前缩放比例scale,将三维坐标映射到二维画布上。

//因为f1+z作了除数,这里记得要作下判断if(f1+z>0){var scale = f1 / (f1 + z);ball.scaleX = ball.scaleY = scale;x = mouse.x - hideX;y = mouse.y - hideY;ball.x = hideX + x * scale;ball.y = hideY + y * scale;ball.render(context);}//将缩放比例分别作用在x.y和缩放小球的属性上~

完整代码:

应用

示例:

在实现这个示例之前,我们还需要对小球类进行一次改造才行。我们依次给小球添加3个属性

小球在3维空间的中xyz坐标this.x3d = 0;this.y3d = 0;this.z3d = 0;//小球z轴的速度this.vz = 0;

接下来我们依然采用了之前的老套路,随机生成200个小球,给他们随机的x和z的位置,y3d为同一值,因为这些小球在同一点落下。

为了更加符合视觉感观,小球的Z轴越大,我们应该要优先绘制,这时候,我们就要对小球依据z3d来进行排序了。

balls.sort((a,b)=>{//这return b.z3d - a.z3d;})

循环函数中不断的计算scale值,这是核心;

var scale = f1 / (f1 + ball.z3d);

核心代码截图:

完整代码请私信我

总结:

小球在三维空间的中缩放比例的计算公式为:

var scale = f1 / (f1 + z);

其中f1为景深,z为小球的z轴大小。

三维空间的坐标如何映射为2维平面上

ball.x = hideX + x * scale;ball.y = hideY + y * scale;

最后就是一些之前的物理公式的运用了。

以上是今天所有的分享内容。喜欢的请点赞关注,不喜欢的解散~~

这里是【畅哥聊技术】前端图形学相关技术文章,更多精彩内容持续更新中。。。

未完待续。。。

基于mfc的图形学实例_前端图形学(二十)——退后!!我要开始进入3D世界了...相关推荐

  1. 前端实现可绘制的canvas画布_前端图形学基础(五)——Canvas状态管理

    点击右上角的关注,不定期前端干货分享!! 欢迎来到我的前端图形学系列文章: 前端图形学基础(一)--Canvas基础入门 前端图形学基础(二)--Canvas基础 前端图形学基础(三)--Canvas ...

  2. threejs添加立方体_前端图形学(三十)——从源码去看threejs中的光照模型

    欢迎来到[畅哥聊技术]前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注. 上章节回顾 熟悉了threejs中内置的几何图形的渲染原理就是通过顶点渲染 传入自定义顶点渲染自定义的几何图形 本章目 ...

  3. 前端图片上坐标连线_前端图形学(十三)——弹跳运动的深入之傲娇的小球

    欢迎来到[畅哥聊技术]前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注. 前面我们说到了小球的弹跳运动,通过一个方向的加速度和摩擦力去影响小球的动画,其目标点也是一个固定不变的,似乎有些单调. ...

  4. 吉林大学计算机图形学实验_计算机图形学学习笔记(一):图形学概论

    第一章 计算机图形学概论 1.1 全书概述 图形学基本知识 光栅图形学 扫描转换.区域填充.裁减.反走样.消隐 二维.三维图形变换及观察 几何造型 参数曲线曲面基本概念.Bezier曲线曲面.B样条曲 ...

  5. 基于mfc的图形学实例_给每一位计算机图形学爱好者的儿童节礼物

    更新:最新课程内容请见 https://yuanming.taichi.graphics/teaching/2020-games201/ 本帖不再更新. GAMES201线上课程:高级物理引擎实战指南 ...

  6. 计算机图形学的发展与应用论文,计算机图形学毕业论文_计算机图形学发展趋势_计算机图形学有很多应用...

    有什么经典的计算机图形学论文吗? 想看计算机图形学的论文去搜这个方向的顶级会议或期刊,SIGGRAPH,EuroGraphics,TVCG,还有很多,直接搜一下都能知道,读这些顶级会议上的论文可以知道 ...

  7. mfc获取子窗口句柄_前端设计-JavaScript中父窗口与子窗口间的通信

    父窗体与子窗体之间的通信 在之前文章讲解windows程序设计过程中,我们曾描述了windows程序窗口之间通信与控制实现方法与过程,如窗体之间参数传递等.本文主要从Web程序开发前端JavaScri ...

  8. mfc多线程编程实例_多线程技术的PLC与PC的通讯方式

    点击箭头处"工业之家",选择"关注公众号"! 基于多线程技术的PLC与PC的通讯方式 1.系统构成  推进系统中,PC机选用工控计算机.它是整个控制系统的核心, ...

  9. 基于Ext的开发实例_模拟Windows桌面

    模拟Windows桌面 Ext介绍 Ext是一个强大的js类库,以前是基于雅虎UI,现在已经完全独立了. 主要包括data.widget.form.grid.dd.menu,其中最强大的应该算grid ...

最新文章

  1. java程序a-z b-y_有一行电文,以按下面规律译成密码: A---Z a---z B---Y b---Y C---X c---x …… 即第1个字母编程第26个字...
  2. 通过页面埋点做监控却不影响性能?解密ARMS前端监控数据上报技术内幕
  3. 技术分享:看我如何利用Outlook来创建基于电子邮件的持久化后门
  4. hdu 4419 Colourful Rectangle (离散化扫描线线段树)
  5. mysql 临时表循环_在游标循环中查询临时表可以,但是结束循环后就无法查询了。...
  6. 2014-12-01到2014-12-31:学习计划
  7. 计算机文件不能包含的符号,文件夹的名称不能包括
  8. 20190901 On Java8 第十五章 异常
  9. Cisco路由重分发配置(引入路由)
  10. 面向面试编程-概念之-分布式与集群的区别和联系
  11. java 解析cron_Quartz 源码解析(六) —— 解析Cron表达式
  12. TMS320F28374S之X-BAR
  13. 强烈推荐的程序员键盘--红轴手感好按键压力小写代码更轻松
  14. 平台如何实现实人认证?
  15. RADARE2+FRIDA=R2FRIDA Best Dynamic Debugging Tool
  16. 高质量的视频播放往往只需要一个m3u8文件 视频流搞起来
  17. c语言星座图原理,通信原理中星座图详解
  18. 使用kdevelop出现问题及解决
  19. POI报错_org.apache.xmlbeans.impl.values.XmlValueDisconnectedException
  20. MBA-day28 数的概念-练习题

热门文章

  1. VScode使用Git拉取代码到本地提示“在签出前,请清理存储工作树”
  2. Html显示缩略图点击展示,JS点击缩略图整屏居中放大图片效果
  3. vector自动扩容如何实现_全自动拉伸膜真空包装机是如何实现全自动化生产的?...
  4. Oracle dbms_job管理
  5. mysql5.7.21压缩版_mysql5.7.21解压版安装配置图文
  6. 电商库存设计mysql redis_基于redis实现的扣减库存
  7. 计算机存储单位字的英语,计算机存储基本单位,位、字节、字以及KB、MB和GB怎么换算?...
  8. RabbitMQ 基本使用(注解的方式)
  9. 向Redis中存入JSON格式数据
  10. Maven 编译打包时如何忽略测试用例