首页 > 其他分享 >35 Three.js的融合材质

35 Three.js的融合材质

时间:2023-01-30 17:01:40浏览次数:37  
标签:THREE 35 Three window mesh var new js Math


简介

在上一节,使用three.js的60版本,我们成功的实现了THREE.MeshDepthMaterial的案例。但是,我们没有办法修改它的材质的颜色。而一切都是由材质的默认属性决定的,但是Three.js库可以通过联合材质创建出新的效果(这也是材质融合起作用的地方)。

案例实现

所以,我们就需要从THREE.MeshDepthMaterial对象获得亮度,并且从THREE.MeshBasicMaterial对象获得颜色。
首先,我们需要创建两种材质对象:

var cubeMaterial = new THREE.MeshDepthMaterial();
var colorMaterial = new THREE.MeshBasicMaterial({color: 0x00ff00, transparent: true, blending: THREE.MultiplyBlending});

THREE.MeshDepthMaterial对象没有什么好设置的。而对于THREE.MeshBasicMaterial,要把transparent属性设置为true,并且指定一个融合模式。如果不将transparent属性设置为true,就只会得到绿色的物体,three.js不会执行融合操作。如果将transparent属性设置为true,three.js就会检查blending属性,以查看这个绿色的THREE.MeshBasicMaterial材质如何与背景相互作用。
在这个案例里面我们融合模式使用的THREE.MultiplyBlending对象。这种模式就是会把前景色和背景色相乘,得到想要的结果。
然后我们就调用THREE.SceneUtils.createMultiMaterialObject()方法实例化,进行融合:

var mesh = new THREE.SceneUtils.createMultiMaterialObject(cube, [colorMaterial, cubeMaterial]);
mesh.children[1].scale.set(0.97, 0.97, 0.97);

当使用THREE.SceneUtils.createMultiMaterialObject()创建网格的时候,几何体会被复制,返回一个网格组,里面的两个网格完全相同。正因为两个网格是重合相同的,所以如果立方体动起来就会发现立方体会有闪烁的效果,这是因为当渲染的物体有重合的时候,就会出现这种效果,这种情况,我们就需要设置一些偏差处理这个问题,所以我们缩小了THREE.MeshDepthMaterial网格的大小,来实现了目的。

案例代码

35 Three.js的融合材质_three-js


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
html, body {
margin: 0;
height: 100%;
}

canvas {
display: block;
}

</style>
</head>
<body onl oad="draw();">

</body>
<script src="https://johnson2heng.github.io/three.js-demo/lib/three-v60.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/controls/OrbitControls.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/stats.min.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/dat.gui.min.js"></script>
<script>
var renderer;

function initRender() {
renderer = new THREE.WebGLRenderer({antialias: true,alpha:true});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0x000000);
document.body.appendChild(renderer.domElement);
}

var camera;

function initCamera() {
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 40, 100);
camera.lookAt(new THREE.Vector3(0, 0, 0));
}

var scene;

function initScene() {
scene = new THREE.Scene();
}

function initModel() {

//辅助工具
var helper = new THREE.AxisHelper(10);
scene.add(helper);

var s = 25;

var cube = new THREE.CubeGeometry(s, s, s);
var cubeMaterial = new THREE.MeshDepthMaterial();
var colorMaterial = new THREE.MeshBasicMaterial({color: 0x00ff00, transparent: true, blending: THREE.MultiplyBlending});

for (var i = 0; i < 3000; i++) {

var mesh = new THREE.SceneUtils.createMultiMaterialObject(cube, [colorMaterial, cubeMaterial]);
mesh.children[1].scale.set(0.97, 0.97, 0.97);

mesh.position.x = 800 * ( 2.0 * Math.random() - 1.0 );
mesh.position.y = 800 * ( 2.0 * Math.random() - 1.0 );
mesh.position.z = 800 * ( 2.0 * Math.random() - 1.0 );

mesh.rotation.x = Math.random() * Math.PI;
mesh.rotation.y = Math.random() * Math.PI;
mesh.rotation.z = Math.random() * Math.PI;

mesh.updateMatrix();

scene.add(mesh);

}

}


//初始化性能插件
var stats;

function initStats() {
stats = new Stats();
document.body.appendChild(stats.dom);
}

function render() {
renderer.render(scene, camera);
}

//窗口变动触发的函数
function onWindowResize() {

camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
render();
renderer.setSize(window.innerWidth, window.innerHeight);

}

function animate() {
//更新控制器
render();

//更新性能插件
stats.update();

//让立方体动起来
for(var i=0; i<scene.children.length; i++){
scene.children[i].rotation.x += 0.02;
scene.children[i].rotation.y += 0.02;
scene.children[i].rotation.z += 0.02;
}

//controls.update();

requestAnimationFrame(animate);
}

function draw() {
initRender();
initScene();
initCamera();
initModel();
initStats();

animate();
window.onresize = onWindowResize;
}
</script>
</html>


标签:THREE,35,Three,window,mesh,var,new,js,Math
From: https://blog.51cto.com/u_15948039/6027351

相关文章

  • JSP 前端大文件上传
    ​ 4GB以上超大文件上传和断点续传服务器的实现随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。但是在......
  • 接口自动化框架两大神器-正则提取器和Jsonpath提取器
    一接口自动化框架一框架结构二结构说明-API用于封装被测系统的接口(用request模块封装的请求方法)-TestCase将一个或多个接口封装成测试用例,并使用UnitTest管理......
  • JSP案列_改造Cookie案例
    <%@pageimport="java.net.URLDecoder"%><%@pageimport="java.util.Date"%><%@pageimport="java.text.SimpleDateFormat"%><%@pageimport="java.net.URLEnco......
  • ThreeJs入门概要
    ThreeJs入门概念及使用整理  ThreeJs用于浏览器3D图形的渲染,基于WebGL封装,本身是Javascript语言开发的。尝试基于threeJs开发手写手绘小程序,因此整理了相关的基础技......
  • JSP脚本和JSP入门学习
    JSP的脚本:JSP定义java代码的方式1.<%代码%>:定义的java代码,在service方法中。Service方法可以定义什么,该脚本中就可以定义什么。2.<%!代码%>:定义的java代......
  • cube.js 一些变动
    cube.js整体的机制是没有调整的,但是目前从官方介绍可以看出,已经从以前的无头bi调整为了语义层了,这个也说明了cube.js在数据处理能力上更加强大了一张参考图  说明目前c......
  • js对象
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>xxx</title></head><body><p>创建JavaScript对象。</p><pid="demo"></p><script>varperson={fir......
  • js实现自定义网络拓扑图-实战记录
    首先推荐工具库JTopo: jtopo一个好用的交互式HTML5图形库其他的看官方文档            三、基础讲解jtopo的核心对象有Stage、Layer、Canv......
  • 如何从json数据中提取数据
        //将数据解析成json格式var data=JSON.parse(responseBody);//获取id值var procInstId=data.data.id; var workId=data.data.works[0].id;pm.envir......
  • 用html2canvas.js 将前端HTML页面生成图片
    首先去html2canvas官网下载html2canvas.js文件html2canvas官网地址:http://html2canvas.hertzen.com/HTML<divid="host_file"class="container"><divid="view"c......