好久没有写博客了,深究动画其实也就是setTimeout setInterval requestAnimationFrame很多人可能不熟悉requestAnimationFrame但是事实上和setTimeout没有区别,setTImeout是 通过定时然后达到循环执行,后者呢比较优雅,动画帧。。。不说了,我也不知道,自己测试一下,程序员是应该有这种一探究竟的精神。

  在实际数据中很可能是没有perspeactive 3d,也没有transition-z的。但是三维的东西其实也就是在电脑屏幕上而已,屏幕没有厚多少多少的说法吧,所以呢,事实上在屏幕上看到的其实也不过是画在一张二维屏幕上的视觉效果图而已。

  先说一个最基本的知识,俗话说的transition3d的3d是关于屏幕的水平方向和竖直方向,还有一个是人和屏幕的垂直距离形成的z轴,这个z轴当然只是伪装的,事实上人和屏幕距离就是那么远,但是为了伪装,我们让离我们近的看起来大点,远的看起来小点。就是传说中的近大远小,也叫作透视。

  现实生活中我们一般没有仔细体验过一种感觉,就是离一个东西越来越远,看它越来越小,慢慢的就会达到一个极限值,此时看东西会变成一个点。加入过一个半径为1的小球,在向后远离1000个单位时,刚好看不到了,我们就假设有一个透视值perspective = 1000 ; 敲代码之前的废话就这么多了,现在我们开始写我们的三维canvas 。

准备工作:

1. 有一个画布供我们玩耍

<body>
<canvas width='1000' height='500' id='3d-canvas' ></canvas>
</body>
// 生产一个画布
var canvas = document.getElementById('3d-canvas');
panel = canvas.getContext('2d');
// 一个画布上画小球的工具
function drawBall(x,y,r,color){
var color = color ? color : '#333' ;
panel.beginPath()
panel.arc(x,y,r,,Math.PI*);
panel.closePath()
panel.fillStyle = color ;
panel.fill()
}

2. 然后要有一个透视,让我们产生3d视觉效果,一个生产小球的机器,我们一般情况会已知小球的x, y, z坐标和他的大小就是半径r。根据这些条件我们去画小球。

var perspective =
// 一个小球的构造函数,可以生产小球
function Ball(x,y,z,r){
this.x = x ;
this.y = y ;
this.z = z ;
this.r = r ;
this.render = function(){
// 根据
}
}

3.最后我们new一个小球,然后渲染出来

// 生产一个小球,然后渲染
var small_ball = new Ball(,,,)
small_ball.render()

好了,现在我们就渲染好了,画出来了。本篇博客到此结束啦

咳咳,好了不开玩笑了,现在我们把任务范围缩小了一下,已知透视值,x,y,z,r画一个小球。就是render方法

最简单的透视计算方法。

perspective= => scale=
perspective= => scale=

这是透视值和比例大小的关系,所以我们就可以得出一个

var scale = this.z/perspective ;
var r = this.r*scale ;

然后我们计算实际视觉上的x和y的坐标

    var x = (this.x-w/)*scale + w/
var y = (this.y-h/)*scale + h/

这个x, y 是什么意思嘛,就是当scale放大一倍的时候,x会相对原来相对相对中线的位置放大scale倍。

现在我们就可以这样写render函数

function Ball(x,y,z,r){
this.x = x ;
this.y = y ;
this.z = z ;
this.r = r ; this.render = function(){
var scale = this.z/perspective
var r = this.r*scale
var x = (this.x-w/)*scale + w/
var y = (this.y-h/)*scale + h/
drawBall(x,y,r)
}
}

现在完成了所有的配置项。就可以构造一个视觉上的3d小球了。

最后贴一个效果图

https://sowhitesocoll.github.io/text-proticle/drawtext.html

这个demo种运用了tween.js算法和canvas得getImageData方法,和上边所谓得3d效果技巧。喜欢的同志们可以点个小星星

canvas用2d渲染出3d的感觉的更多相关文章

  1. 2D图形如何运动模拟出3D效果

    一.先看看实现效果图 (左边的2d图片如何运动出右边3d的效果)                                      引言: 对于这个题目,真的很尴尬,不知道取啥,就想了这个题目 ...

  2. 2d游戏和 3d游戏的区别

    2D游戏和3D游戏的主要区别 一.总结 一句话总结:2D中的单位就是贴图,3D中的单位还有高 1. 3D 和 2D 游戏的区别主要体现在呈现画面和文件体积上: 2. 借助 3D 引擎可以提升 2D 游 ...

  3. 在DirectX 中进行2D渲染

    http://flcstudio.blog.163.com/blog/static/756035392008115111123672/ 最近,我看到很多关于DirectX8在最新的API中摒弃Dire ...

  4. 2D游戏与3D游戏的区别 原文:https://zhidao.baidu.com/question/588490865.html

    2D和3D间有哪些不同点呢? 让我们来比较一下,共同找出它俩之间的不同点. 对玩家来说,2D技术和3D技术只是显示数据的方式而已,玩家都是通过二 维的平面显示器来观看它们.对制作者来说,二者的不同之处 ...

  5. .NET实时2D渲染入门·动态时钟

    .NET实时2D渲染入门·动态时钟 从小以来"坦克大战"."魂斗罗"等游戏总令我魂牵梦绕.这些游戏的基础就是2D实时渲染,以前没意识,直到后来找到了Direct ...

  6. canvas基础[一]探究出初中数学知识

    何时用SVG何时用canvas SVG 矢量图,视觉清晰,文件小 <svg viewBox="0 0 100 100"> <circle cx="50& ...

  7. CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎

    CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5  2D 渲染引擎,可以用于游戏开发.它是开源的,跨平台的,与现代的浏览器和移动设备兼容.CutJS 提供了一个类似 DOM 树的 ...

  8. canvas代替img渲染图片

    移动端用canvas代替img渲染图片,可以提高性能 var oImg = new Image(); oImg.src = url; oImg.onload = function(){ var cvs ...

  9. html5 canvas移动设备渲染测试

    最近项目闲着没什么事,又想起了canvas, 针对移动端设备默认浏览器,做了点渲染方面效率的测试,手头设备不多(有一些低端机型和pc chrome做对比),现将测试数据分享给大家吧,本想和css3 a ...

随机推荐

  1. mac brew 安装 php 环境

    548  brew search php 549  brew tap homebrew/dupes 550  brew tap josegonzalez/homebrew-php 551  brew ...

  2. Caffe系列4——基于Caffe的MNIST数据集训练与测试(手把手教你使用Lenet识别手写字体)

    基于Caffe的MNIST数据集训练与测试 原创:转载请注明https://www.cnblogs.com/xiaoboge/p/10688926.html  摘要 在前面的博文中,我详细介绍了Caf ...

  3. golang 高效字符串拼接

    https://blog.csdn.net/u012210379/article/details/45110705 虽然方便,但是使用+=操作符并不是在一个循环中往字符串末尾追加字符串最有效的方式,一 ...

  4. python中用json存储列表字典等文件操作

    JSON字符串用json.dumps, json.loads JSON文件名用json.dump, json.load 由于需要在脚本重启后依旧能够记住之前所使用的列表内容, 故采用json存储列表文 ...

  5. 廖雪峰Java13网络编程-2Email编程-1发送email

    1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件 ...

  6. HashMap数据结构

    2.1 HashMap 2.1.1 HashMap介绍 先看看HashMap类头部的源码: public class HashMap<K,V> extends AbstractMap< ...

  7. KMP算法简明法则

    KMP算法也算是相当经典,但是对于初学者来说确实有点绕,大学时候弄明白过后来几年不看又忘记了,然后再弄明白过了两年又忘记了,好在之前理解到了关键点,看了一遍马上又能理解上来.关于这个算法的详解网上文章 ...

  8. 【转载】gdb基本命令总结

    本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介]  ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 U ...

  9. Ionic3 demo TallyBook 实例2

    1.添加插件 2.相关页面 消费页面: <ion-header> <ion-navbar> <ion-title> 消费记录 </ion-title> ...

  10. Mac系统下安装Vue-cli详细步骤

    Vue-cli安装 因为是mac系统,所以和视频里老师讲的有些许不同. 1.首先打开终端 按照老师的操作,首先检查node版本 下面是我的操作 打开终端,输入命令 node -v 我去,找不到node ...