基于mfc的图形学实例_前端图形学(二十)——退后!!我要开始进入3D世界了...
欢迎来到【畅哥聊技术】前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注。
写在前面
先说好,今天所说的3D并不是大家惯性思维说3D就想到了WebGL,那么接下来的文章都是基于Canvas2d来模拟3D空间~
那么要模拟3维世界,那么我们不得不提到一个新的名词:第三维度~
第三维度
这个不难理解,我们在Canvas2d中有两个坐标轴,X,Y,那么要模拟3D效果,那么我们就得抽象一个Z 轴出来 ,如上图,这个Z轴是垂直于我们的屏幕。
我们接下来规定,Z轴的正方向是向垂直屏幕向里为,相反则为负方向。
透视图
什么是透视图?一句话概括:近大远小!!!
物体远离视线,那么就会越来越小,直到消失在屏幕上,消失的时候的那一个点我们称之为 消失点
那么怎么在2维空间去模拟3D世界的呢?也就是说我们要把3空间的坐标转换到2d屏幕上来。
原理:
- 放大或缩小物体
- 让它靠近或者远离消失点
透视图公式如上图
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轴不断增大,再去移动鼠标,发现小球和鼠标之间就形成了视差的效果了。
实现过程:
- 定义x,yz,默认分别为0,f1 = 200以及消失点坐标(width>>1,height>>1)
- 实例化小球。
- 注册鼠标事件和键盘事件,并且在键盘事件中处理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世界了...相关推荐
- 前端实现可绘制的canvas画布_前端图形学基础(五)——Canvas状态管理
点击右上角的关注,不定期前端干货分享!! 欢迎来到我的前端图形学系列文章: 前端图形学基础(一)--Canvas基础入门 前端图形学基础(二)--Canvas基础 前端图形学基础(三)--Canvas ...
- threejs添加立方体_前端图形学(三十)——从源码去看threejs中的光照模型
欢迎来到[畅哥聊技术]前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注. 上章节回顾 熟悉了threejs中内置的几何图形的渲染原理就是通过顶点渲染 传入自定义顶点渲染自定义的几何图形 本章目 ...
- 前端图片上坐标连线_前端图形学(十三)——弹跳运动的深入之傲娇的小球
欢迎来到[畅哥聊技术]前端图形学相关技术文章,更多精彩内容持续更新中,敬请关注. 前面我们说到了小球的弹跳运动,通过一个方向的加速度和摩擦力去影响小球的动画,其目标点也是一个固定不变的,似乎有些单调. ...
- 吉林大学计算机图形学实验_计算机图形学学习笔记(一):图形学概论
第一章 计算机图形学概论 1.1 全书概述 图形学基本知识 光栅图形学 扫描转换.区域填充.裁减.反走样.消隐 二维.三维图形变换及观察 几何造型 参数曲线曲面基本概念.Bezier曲线曲面.B样条曲 ...
- 基于mfc的图形学实例_给每一位计算机图形学爱好者的儿童节礼物
更新:最新课程内容请见 https://yuanming.taichi.graphics/teaching/2020-games201/ 本帖不再更新. GAMES201线上课程:高级物理引擎实战指南 ...
- 计算机图形学的发展与应用论文,计算机图形学毕业论文_计算机图形学发展趋势_计算机图形学有很多应用...
有什么经典的计算机图形学论文吗? 想看计算机图形学的论文去搜这个方向的顶级会议或期刊,SIGGRAPH,EuroGraphics,TVCG,还有很多,直接搜一下都能知道,读这些顶级会议上的论文可以知道 ...
- mfc获取子窗口句柄_前端设计-JavaScript中父窗口与子窗口间的通信
父窗体与子窗体之间的通信 在之前文章讲解windows程序设计过程中,我们曾描述了windows程序窗口之间通信与控制实现方法与过程,如窗体之间参数传递等.本文主要从Web程序开发前端JavaScri ...
- mfc多线程编程实例_多线程技术的PLC与PC的通讯方式
点击箭头处"工业之家",选择"关注公众号"! 基于多线程技术的PLC与PC的通讯方式 1.系统构成 推进系统中,PC机选用工控计算机.它是整个控制系统的核心, ...
- 基于Ext的开发实例_模拟Windows桌面
模拟Windows桌面 Ext介绍 Ext是一个强大的js类库,以前是基于雅虎UI,现在已经完全独立了. 主要包括data.widget.form.grid.dd.menu,其中最强大的应该算grid ...
最新文章
- java程序a-z b-y_有一行电文,以按下面规律译成密码: A---Z a---z B---Y b---Y C---X c---x …… 即第1个字母编程第26个字...
- 通过页面埋点做监控却不影响性能?解密ARMS前端监控数据上报技术内幕
- 技术分享:看我如何利用Outlook来创建基于电子邮件的持久化后门
- hdu 4419 Colourful Rectangle (离散化扫描线线段树)
- mysql 临时表循环_在游标循环中查询临时表可以,但是结束循环后就无法查询了。...
- 2014-12-01到2014-12-31:学习计划
- 计算机文件不能包含的符号,文件夹的名称不能包括
- 20190901 On Java8 第十五章 异常
- Cisco路由重分发配置(引入路由)
- 面向面试编程-概念之-分布式与集群的区别和联系
- java 解析cron_Quartz 源码解析(六) —— 解析Cron表达式
- TMS320F28374S之X-BAR
- 强烈推荐的程序员键盘--红轴手感好按键压力小写代码更轻松
- 平台如何实现实人认证?
- RADARE2+FRIDA=R2FRIDA Best Dynamic Debugging Tool
- 高质量的视频播放往往只需要一个m3u8文件 视频流搞起来
- c语言星座图原理,通信原理中星座图详解
- 使用kdevelop出现问题及解决
- POI报错_org.apache.xmlbeans.impl.values.XmlValueDisconnectedException
- MBA-day28 数的概念-练习题
热门文章
- VScode使用Git拉取代码到本地提示“在签出前,请清理存储工作树”
- Html显示缩略图点击展示,JS点击缩略图整屏居中放大图片效果
- vector自动扩容如何实现_全自动拉伸膜真空包装机是如何实现全自动化生产的?...
- Oracle dbms_job管理
- mysql5.7.21压缩版_mysql5.7.21解压版安装配置图文
- 电商库存设计mysql redis_基于redis实现的扣减库存
- 计算机存储单位字的英语,计算机存储基本单位,位、字节、字以及KB、MB和GB怎么换算?...
- RabbitMQ 基本使用(注解的方式)
- 向Redis中存入JSON格式数据
- Maven 编译打包时如何忽略测试用例