JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

window.addEventListener("DOMContentLoaded", app);

function app() {

var form = document.querySelector("form"),

imgUpload = document.getElementsByName("img_upload")[0],

imgName = document.getElementsByName("img_name")[0],

canvas = document.createElement("canvas"),

c = canvas.getContext("2d"),

scene,

camera,

renderer,

textureLoader = new THREE.TextureLoader(),

pinGeo = new THREE.Geometry(),

pinMat = new THREE.PointsMaterial({

map: textureLoader.load("/uploads/1911/pin.png"),

size: 1.5,

transparent: true

}),

img = null,

pinsPerSide = 100,

pinsShouldMove = false,

pinZPositions = [],

adjustWindow = () => {

camera.aspect = window.innerWidth / window.innerHeight;

camera.updateProjectionMatrix();

renderer.setSize(window.innerWidth, window.innerHeight);

},

getLightness = (R, G, B) => {

let r = R / 255,

g = G / 255,

b = B / 255,

cmin = Math.min(r, g, b),

cmax = Math.max(r, g, b),

light = (cmax + cmin) / 2;

light = Math.round(light * 100);

return light;

},

handleImgUpload = e => {

return new Promise((resolve, reject) => {

let target = !e ? imgUpload : e.target;

if (target.files.length) {

let reader = new FileReader();

reader.onload = e2 => {

img = new Image();

img.src = e2.target.result;

img.onload = () => {

resolve();

};

img.onerror = () => {

img = null;

reject("Image nullified due to file corruption or non-image upload");

};

imgName.placeholder = target.files[0].name;

};

reader.readAsDataURL(target.files[0]);

}

});

},

imgUploadValid = () => {

let files = imgUpload.files,

fileIsThere = files.length > 0,

isImage = files[0].type.match("image.*"),

valid = fileIsThere && isImage;

return valid;

},

init = () => {

// setup

scene = new THREE.Scene();

camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);

renderer = new THREE.WebGLRenderer();

renderer.setClearColor(new THREE.Color(0x000000));

renderer.setSize(window.innerWidth, window.innerHeight);

renderer.shadowMap.enabled = true;

let camControls = new THREE.OrbitControls(camera, renderer.domElement);

// pins

for (let y = pinsPerSide - 1; y >= 0; --y) {

for (let x = 0; x < pinsPerSide; ++x) {

let center = pinsPerSide / 2 - 0.5,

pin = new THREE.Vector3();

pin.x = x - center;

pin.y = y - center;

if (x % 2 == 1)

pin.y += 0.5;

pinGeo.vertices.push(pin);

pinZPositions.push(0);

}

}

let pins = new THREE.Points(pinGeo, pinMat);

pins.name = "Pins";

scene.add(pins);

// camera

camera.position.set(45, 0, 105);

camera.lookAt(scene.position);

// render

let body = document.body;

body.insertBefore(renderer.domElement, body.childNodes[4]);

renderScene();

// deal with preserved input

if (imgUpload.value != "")

renderPromise();

},

movePins = () => {

pinZPositions.forEach((zPos, i) => {

let vertex = pinGeo.vertices[i];

if (vertex.z > zPos) {

--vertex.z;

if (vertex.z <= zPos)

vertex.z = zPos;

} else if (vertex.z < zPos) {

++vertex.z;

if (vertex.z >= zPos)

vertex.z = zPos;

}

});

pinGeo.verticesNeedUpdate = true;

// stop moving pins when all are in their new positions

if (pinZPositions.every((z, i) => z == pinGeo.vertices[i].z))

pinsShouldMove = false;

},

renderPromise = e => {

handleImgUpload(e).then(() => {

if (imgUploadValid()) {

updateCanvas();

updateImg();

setTimeout(() => {

pinsShouldMove = true;

}, 300);

}

}).catch(msg => {

console.log(msg);

});

},

renderScene = () => {

if (pinsShouldMove)

movePins();

renderer.render(scene, camera);

requestAnimationFrame(renderScene);

},

updateCanvas = () => {

// restrict image size, keep it proportional

let imgWidth = img.width,

imgHeight = img.height;

if (imgWidth >= imgHeight) {

if (imgWidth >= pinsPerSide) {

imgWidth = pinsPerSide;

imgHeight = imgWidth * (img.height / img.width);

}

} else {

if (imgHeight >= pinsPerSide) {

imgHeight = pinsPerSide;

imgWidth = imgHeight * (img.width / img.height);

}

}

// update canvas

c.clearRect(0, 0, pinsPerSide, pinsPerSide);

let imgX = pinsPerSide / 2 - imgWidth / 2,

imgY = pinsPerSide / 2 - imgHeight / 2;

c.drawImage(img, imgX, imgY, imgWidth, imgHeight);

},

updateImg = () => {

let imgData = c.getImageData(0, 0, pinsPerSide, pinsPerSide),

data = imgData.data;

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

let lightness = getLightness(data[i], data[i + 1], data[i + 2]),

pinDistance = lightness / 5;

pinZPositions[i / 4] = pinDistance;

}

};

init();

imgUpload.addEventListener("change", renderPromise);

window.addEventListener("resize", adjustWindow);

}

matlab转化图片点云,three.js把图片转换成3D点云图特效相关推荐

  1. JavaScript 逼真图片倒计时实现代码 js时间图片倒计时

    JavaScript 逼真图片倒计时实现代码   js时间图片倒计时 效果图: <!doctype html> <html> <head> <meta cha ...

  2. js 中日期 转换成时间戳 例如2013-08-30 转换为时间戳

    js 中日期 转换成时间戳 例如2013-08-30 转换为时间戳 热心网友  2018-11-18 js字符串转化时间戳可以使用自带函数 Date(要转化的时间字符串)先转化为Date类型,之后再将 ...

  3. 如何用js将日期转换成时间戳

    一.日期转换成时间戳 js字符串转化成时间戳可以使用自带函数Date(要转化的时间字符串)先转化为Date类型,之后再将Date类型转化为时间戳类型,其中时间字符串有要求,形式必须是yyyy-MM-d ...

  4. 在WPF中将图片转换成3D图像并可以旋转

    原文:在WPF中将图片转换成3D图像并可以旋转 时光偷走的,永远都是我们眼皮底下看不见的珍贵. https://pan.baidu.com/s/14dk-OU2SR0nxXj2bL4bVpQ 首先先看 ...

  5. js中将字符串转换成json的三种方式

    ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法. 1,eval方式解析,恐 ...

  6. js将阿拉伯数字转换成中文的大写数字

    js将阿拉伯数字转换成中文的大写数字 export const numberToChinese = (num) => {var AA = new Array("零", &qu ...

  7. js将数字转换成万、亿、万亿

    // js将数字转换成万.亿.万亿 export const numberFormat = (value)=> {var param = {};var k = 10000,sizes = ['' ...

  8. 用原生js把数字转换成货币人民币表示带逗号表示方法

    用原生js把数字转换成货币人民币表示带逗号表示方法 function rmb(str){let strArr = String( parseFloat(str).toFixed(2) ).split( ...

  9. js将秒转换成几天几小时几分几秒,每秒刷新

    //js将秒转换成几天几小时几分几秒function getDuration(second) {var days = Math.floor(second / 86400);var hours = Ma ...

最新文章

  1. jfinal为weebox弹出框传递参数
  2. 全球及中国植物脂肪酸行业供给前景与需求规模预测报告2022版
  3. C语言 | 编程实现4
  4. 将dataGridView数据转成DataTable
  5. 每扇区2048字节的U盘乱码的数据恢复
  6. Docker学习总结(22)——Docke run命令详解
  7. 一文读懂架构师都不知道的isinstance检查机制
  8. 在线sql服务器,SQL Server链接服务器
  9. Excel的设置 .net
  10. php mysql多条件查询界面_PHP组合查询多条件查询实例代码
  11. mac 生成公钥和私钥
  12. 贵州省中职学校计算机教材电子版,中职计算机基础课件贵州省中职学校计算机应用基础教学工作计划.doc...
  13. git整理——廖雪峰教程笔记
  14. 主控芯片成功案例:搭载北京君正X1000芯片,收款计算合二为一
  15. 什么是大数据与智能数据?什么是惯性测量单元与GNSS?
  16. C.I.刘易斯的学术之路--- 刘易斯逻辑之十二尾篇
  17. 信息与计算机科学讲座,【创新创业 计科在行动】2015级信息与计算科学专业大学生创新讲座、专业教育讲座暨学术前沿讲座专题报道...
  18. 阿里云服务器CPU Intel Xeon Platinum 8269CY和8163处理器区别
  19. Android开发新技术
  20. 开源视频平台 Kaltura

热门文章

  1. android动画影子效果,Android实现阴影效果的三种方式
  2. 全网首次解密600多个AI工具汇总(三)
  3. Python 风格规范(Google)
  4. 基于时间的访问控制列表ACL
  5. “祖尔谈软件”——过时的悲叹?
  6. 8 进制和16进制快速转换为2进制
  7. 基于Python的人脸识别 附带说明文档
  8. ArcGIS实验教程——实验二十四:人口密度制图
  9. windows11直接关闭显示器快捷键
  10. Ubuntu下如何关闭笔记本显示器但是不断网,可以继续远程连接