JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var TWO_PI = 2 * Math.PI;

var canvas;

var canvasWidth;

var canvasHeight;

var context;

var globalTime;

var imageData;

function init() {

canvas = document.getElementById('put-stuff-here');

canvasWidth = canvas.width;

canvasHeight = canvas.height;

context = canvas.getContext('2d');

if (!context) {

throw 'Donnie, you are out of your element!';

}

window.addEventListener('resize', resize);

resize();

startAnimation();

}

function startAnimation() {

imageData = context.getImageData(0, 0, canvasWidth, canvasHeight);

var data = imageData.data;

for (var i = 0; i < data.length; i += 4) {

data[i + 3] = 255;

}

globalTime = window.performance.now();

reset();

animate();

}

function reset() {

resize();

}

function animate() {

update();

draw();

requestAnimationFrame(animate);

}

function update() {

globalTime = window.performance.now();

}

function draw() {

var pixel;

var x = 0;

var y = 0;

var uv = [];

var col = [];

var p = [];

var lightDirection = [0.5773, 0.5773, 0.5773];

var data = imageData.data;

for (var i = 0; i < data.length; i += 4) {

uv[0] = x;

uv[1] = y;

p[0] = -1 + 2.0 * (uv[0] / canvasWidth);

p[1] = -1 + 2.0 * (uv[1] / canvasHeight);

var rayOrigin = [0.0, 0.0, 2.0];

var rayDirection = normalize([p[0], p[1], -1.0]);

col[0] = 0.22;

col[1] = 0.22;

col[2] = 0.22;

var h = 1.0;

var t = 0.0;

var tmax = 20.0;

for (var j = 0; j < 32; j++) {

if (h < 0.0001 || t > tmax) {

break;

}

h = map([

rayOrigin[0] + t * rayDirection[0],

rayOrigin[1] + t * rayDirection[1],

rayOrigin[2] + t * rayDirection[2]

]);

t += h;

}

if (t < tmax) {

var pos = [

rayOrigin[0] + t * rayDirection[0],

rayOrigin[1] + t * rayDirection[1] * -1,

rayOrigin[2] + t * rayDirection[2]

];

var norm = calculateNormal(pos);

lightDirection[0] = lightDirection[1] = 0.5773 + (0.6 * Math.sin(0.001 * globalTime)); // animate light direction

lightDirection[2] = 0.5773 + (0.5 * Math.cos(0.001 * globalTime));

var lighting = clamp(dot(norm, lightDirection), 0.0, 1.0);

var downLight = clamp(norm[1], 0.0, 1.0);

col[0] = 1.0 * (1.0 * lighting) + (0.2 * downLight) + 0.1;

col[1] = 1.0 * (0.8 * lighting) + (0.3 * downLight) + 0.1;

col[2] = 1.0 * (0.5 * lighting) + (0.4 * downLight) + 0.1;

}

data[i] = parseInt(255 * col[0]);

data[i + 1] = parseInt(255 * col[1]);

data[i + 2] = parseInt(255 * col[2]);

x += 1;

if (x >= canvasWidth) {

x = 0;

y += 1;

}

}

context.putImageData(imageData, 0, 0);

}

function map(v) {

var d0 = length(v) - 1.0;

return d0;

}

function calculateNormal(v) {

var e = [0.0001, 0.0];

return normalize([

map([

v[0] + e[0],

v[1] + e[1],

v[2] + e[1]

]) - map([

v[0] - e[0],

v[1] - e[1],

v[2] - e[1]

]),

map([

v[0] + e[1],

v[1] + e[0],

v[2] + e[1]

]) - map([

v[0] - e[1],

v[1] - e[0],

v[2] - e[1]

]),

map([

v[0] + e[1],

v[1] + e[1],

v[2] + e[0]

]) - map([

v[0] - e[1],

v[1] - e[1],

v[2] - e[0]

])

]);

}

function normalize(v) {

var len = length(v);

return [v[0] / len, v[1] / len, v[2] / len];

}

function mod(f, m) {

return f % m;

}

function length(v) {

return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);

}

function clamp(val, min, max) {

return Math.min(Math.max(min, val), max);

}

function mix(f0, f1, per) {

return f0 * (1.0 - per) + f1 * per;

}

function dot(v1, v2) {

return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];

}

function resize() {

// var scale = window.innerHeight / canvasHeight;

var scale = 1;

//canvas.style.width = canvasWidth * scale + "px";

//canvas.style.height = window.innerHeight + "px";

canvas.style.left = window.innerWidth * 0.5 - (canvasWidth * scale * 0.5) + "px";

}

init();

用java绘制一个光照球体_HTML5 Canvas一个基本光线行进的球体光照效果相关推荐

  1. java绘制聊天气泡代码_封装一个canvas画对话气泡的函数

    quadraticCurveTo(cp1x, cp1y, x, y) 绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点.开始点由moveTo,或者前面一次的结束点作为下次调用的开始点 ...

  2. java canvas添加图片上传_HTML5 canvas画图及图片上传服务器

    上一个教程中我们实现了使用html5 canvas来制作涂鸦画板的效果,在这个教程中,我们将讲解如何将画好的图片上传到服务器上. 最后的效果如下图,当点击"开始画图"按钮,将在ca ...

  3. 用canvas绘制一个圆形,实现绕着一个中心运动

    实现效果 使用canvas绘制一个圆形,实现绕着一个中心,轨迹类似于走一个椭圆的轨迹那样路线,并且实现漂浮的效果. 这里只是一个实例Demo,直接运行就可以,下面附上代码: <!doctype ...

  4. glide加载图片闪烁_html5 canvas绘制图片

    举两个新手(我)比较容易范的错误 1.图片声明了,绘制方法也ok了,但是有的时候就可以显示出来,有的时候就显示不出来 function draw(){var c=document.getElement ...

  5. 用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心)

    活动地址:CSDN21天学习挑战赛 用代码写出浪漫合集(爱心.玫瑰花)       本文目录: ​一.前言 二.用python.matplotlib.Matlab.java绘制爱心 (1)爱心图形1( ...

  6. java k线绘制,用Java绘制K线图[Java编程]

    赞助商链接 本文"用Java绘制K线图[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具 ...

  7. JAVA几何图注水,如何使用java绘制几何形状到图片?

    在Java语言编程中,如何使用Java绘制几何形状到图片? 注意:需要访问网址: , 下载一个OpenCV软件包.这里下载最新版本:opencv-3.2.0-vc14.exe并解压此文件到D:soft ...

  8. java绘制图形_Java绘制图形

    1.了解什么是事件监听 写好一个界面后,我们就会对界面进行一些操作.比如,在输入框中输入数据,点击按钮或者菜单.这些操作我们称之为一个事件. 就比如我们要监视一间房子中会发生什么事情,就会给这间房子装 ...

  9. python自动轨迹绘制七边形_前端系列——canvas实现按住鼠标移动绘制出轨迹

    概要 工作以来,写过vue.react.正则.算法.小程序等知识,唯独没有写过canvas,因为实在不会啊! 2018年,给自己设定一个小目标:学会canvas,达到的效果是能用canvas实现一些c ...

最新文章

  1. 华为的全闪存存储发展历程
  2. SQL Server 的历史与发展方向
  3. mysql插入数据与删除重复记录的几个例子(收藏)
  4. python正则表达式快速入门_Python学习笔记——正则表达式入门
  5. angular 模块构建_通过构建全栈应用程序学习Angular 6
  6. c语言二进制数怎么表示_搞懂这些公式和原理,二级C语言对你来说肯定会简单很多!...
  7. LeetCode MySQL 626. 换座位
  8. javascript使用_用JavaScript唤醒沉睡的城市
  9. oracle完全卸载重装历程
  10. 一个非常标准的Java连接Oracle数据库的示例代码
  11. ubuntu 启动时显示initramfs 无法进入系统
  12. 慎用"加速"一词,可以使用"早日"代替
  13. 基于安卓/android/微信小程序的个人健康打卡系统APP-#计算机毕业设计
  14. “移动办事之城”杭州:超8成个人办理事项凭身份证通办
  15. 从Uber和快的、滴滴、易到App对比看人性
  16. python class类_学习python中的class类
  17. Lombok 的作者,成功讨伐 IntelliJ IDEA!
  18. 耿丹CS16-2班第三次作业汇总
  19. java 写一个quot;HelloJavaWorld你好世界quot;输出到操作系统文件Hello.txt文件中
  20. GetMessagePeekMessage 和SendMessagePostMessage

热门文章

  1. 图解tcmalloc内存分配器
  2. GNOME API 参考
  3. Linux 查看CPU信息
  4. php如何从mongo获取视频文件,使用mongodb对文件(图片、音频、视频)的存储、读取操作...
  5. java query object_java queryforobject
  6. python限制输入数字范围_关于python:如何限制Django模型中数字字段的最大值?
  7. VUE的导入(HelloWord)
  8. easyui加载后台数据 笔记
  9. 多重背包单调队列优化思路_多重背包问题
  10. php mvc登陆注册,Asp.Net MVC 5使用Identity之简单的注册和登陆