用java绘制一个光照球体_HTML5 Canvas一个基本光线行进的球体光照效果
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一个基本光线行进的球体光照效果相关推荐
- java绘制聊天气泡代码_封装一个canvas画对话气泡的函数
quadraticCurveTo(cp1x, cp1y, x, y) 绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点.开始点由moveTo,或者前面一次的结束点作为下次调用的开始点 ...
- java canvas添加图片上传_HTML5 canvas画图及图片上传服务器
上一个教程中我们实现了使用html5 canvas来制作涂鸦画板的效果,在这个教程中,我们将讲解如何将画好的图片上传到服务器上. 最后的效果如下图,当点击"开始画图"按钮,将在ca ...
- 用canvas绘制一个圆形,实现绕着一个中心运动
实现效果 使用canvas绘制一个圆形,实现绕着一个中心,轨迹类似于走一个椭圆的轨迹那样路线,并且实现漂浮的效果. 这里只是一个实例Demo,直接运行就可以,下面附上代码: <!doctype ...
- glide加载图片闪烁_html5 canvas绘制图片
举两个新手(我)比较容易范的错误 1.图片声明了,绘制方法也ok了,但是有的时候就可以显示出来,有的时候就显示不出来 function draw(){var c=document.getElement ...
- 用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心)
活动地址:CSDN21天学习挑战赛 用代码写出浪漫合集(爱心.玫瑰花) 本文目录: 一.前言 二.用python.matplotlib.Matlab.java绘制爱心 (1)爱心图形1( ...
- java k线绘制,用Java绘制K线图[Java编程]
赞助商链接 本文"用Java绘制K线图[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具 ...
- JAVA几何图注水,如何使用java绘制几何形状到图片?
在Java语言编程中,如何使用Java绘制几何形状到图片? 注意:需要访问网址: , 下载一个OpenCV软件包.这里下载最新版本:opencv-3.2.0-vc14.exe并解压此文件到D:soft ...
- java绘制图形_Java绘制图形
1.了解什么是事件监听 写好一个界面后,我们就会对界面进行一些操作.比如,在输入框中输入数据,点击按钮或者菜单.这些操作我们称之为一个事件. 就比如我们要监视一间房子中会发生什么事情,就会给这间房子装 ...
- python自动轨迹绘制七边形_前端系列——canvas实现按住鼠标移动绘制出轨迹
概要 工作以来,写过vue.react.正则.算法.小程序等知识,唯独没有写过canvas,因为实在不会啊! 2018年,给自己设定一个小目标:学会canvas,达到的效果是能用canvas实现一些c ...
最新文章
- 华为的全闪存存储发展历程
- SQL Server 的历史与发展方向
- mysql插入数据与删除重复记录的几个例子(收藏)
- python正则表达式快速入门_Python学习笔记——正则表达式入门
- angular 模块构建_通过构建全栈应用程序学习Angular 6
- c语言二进制数怎么表示_搞懂这些公式和原理,二级C语言对你来说肯定会简单很多!...
- LeetCode MySQL 626. 换座位
- javascript使用_用JavaScript唤醒沉睡的城市
- oracle完全卸载重装历程
- 一个非常标准的Java连接Oracle数据库的示例代码
- ubuntu 启动时显示initramfs 无法进入系统
- 慎用"加速"一词,可以使用"早日"代替
- 基于安卓/android/微信小程序的个人健康打卡系统APP-#计算机毕业设计
- “移动办事之城”杭州:超8成个人办理事项凭身份证通办
- 从Uber和快的、滴滴、易到App对比看人性
- python class类_学习python中的class类
- Lombok 的作者,成功讨伐 IntelliJ IDEA!
- 耿丹CS16-2班第三次作业汇总
- java 写一个quot;HelloJavaWorld你好世界quot;输出到操作系统文件Hello.txt文件中
- GetMessagePeekMessage 和SendMessagePostMessage
热门文章
- 图解tcmalloc内存分配器
- GNOME API 参考
- Linux 查看CPU信息
- php如何从mongo获取视频文件,使用mongodb对文件(图片、音频、视频)的存储、读取操作...
- java query object_java queryforobject
- python限制输入数字范围_关于python:如何限制Django模型中数字字段的最大值?
- VUE的导入(HelloWord)
- easyui加载后台数据 笔记
- 多重背包单调队列优化思路_多重背包问题
- php mvc登陆注册,Asp.Net MVC 5使用Identity之简单的注册和登陆