08-THREE.JS 点面创建物体,克隆物体,多材质物体
- <!DOCTYPE html>
- <html>
- <head>
- <title></title>
- < <script src="https://cdn.bootcss.com/three.js/r67/three.js"></script>
- <script src="https://cdn.bootcss.com/stats.js/r10/Stats.min.js"></script>
- <script type="text/javascript" src="https://cdn.bootcss.com/dat-gui/0.7.3/dat.gui.js"></script>
- <style>
- body {
- margin: 0;
- overflow: hidden;
- }
- </style>
- </head>
- <body>
- <div id="Stats-output">
- </div>
- <div id="WebGL-output">
- </div>
- <script type="text/javascript">
- // 初始化
- function init() {
- var stats = initStats();
- // 创建一个场景
- var scene = new THREE.Scene();
- // 创建一个相机
- var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
- // 创建一个渲染器
- var renderer = new THREE.WebGLRenderer();
- renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));
- renderer.setSize(window.innerWidth, window.innerHeight);
- renderer.shadowMapEnabled = true;
- // 创建一个地板
- var planeGeometry = new THREE.PlaneGeometry(60, 40, 1, 1);
- var planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff});
- var plane = new THREE.Mesh(planeGeometry, planeMaterial);
- plane.receiveShadow = true;
- // 旋转地板到水平位置
- plane.rotation.x = -0.5 * Math.PI;
- plane.position.x = 0;
- plane.position.y = 0;
- plane.position.z = 0;
- // 将地板添加到场景中去
- scene.add(plane);
- // 旋转相机对准 new THREE.Vector3(5, 0, 0)
- camera.position.x = -20;
- camera.position.y = 25;
- camera.position.z = 20;
- camera.lookAt(new THREE.Vector3(5, 0, 0));
- // 添加聚光灯
- var spotLight = new THREE.SpotLight(0xffffff);
- spotLight.position.set(-40, 60, 10);
- spotLight.castShadow = true;
- scene.add(spotLight);
- // 渲染成功后添加到DOM元素中去
- document.getElementById("WebGL-output").appendChild(renderer.domElement);
- var step = 0;
- //利用点 和面创建物体
- var vertices = [
- new THREE.Vector3(1, 3, 1),
- new THREE.Vector3(1, 3, -1),
- new THREE.Vector3(1, -1, 1),
- new THREE.Vector3(1, -1, -1),
- new THREE.Vector3(-1, 3, -1),
- new THREE.Vector3(-1, 3, 1),
- new THREE.Vector3(-1, -1, -1),
- new THREE.Vector3(-1, -1, 1)
- ];
- //three里面的正方体 12 个面 把每个面分成两个三角形
- var faces = [
- new THREE.Face3(0, 2, 1),
- new THREE.Face3(2, 3, 1),
- new THREE.Face3(4, 6, 5),
- new THREE.Face3(6, 7, 5),
- new THREE.Face3(4, 5, 1),
- new THREE.Face3(5, 0, 1),
- new THREE.Face3(7, 6, 2),
- new THREE.Face3(6, 3, 2),
- new THREE.Face3(5, 7, 0),
- new THREE.Face3(7, 2, 0),
- new THREE.Face3(1, 3, 4),
- new THREE.Face3(3, 6, 4),
- ];
- var geom = new THREE.Geometry();
- geom.vertices = vertices;
- geom.faces = faces;
- //computeFaceNormals方法重新计算三角面对象的法线向量,计算法线向量,影响的是face数组中每个元素的normal属性,一个face只有1个
- geom.computeFaceNormals();
- var materials = [
- new THREE.MeshLambertMaterial({opacity: 0.6, color: 0x44ff44, transparent: true}),
- new THREE.MeshBasicMaterial({color: 0x000000, wireframe: true})
- ];
- // THREE.SceneUtils创建一个多材质对象
- var mesh = THREE.SceneUtils.createMultiMaterialObject(geom, materials);
- mesh.children.forEach(function (e) {
- e.castShadow = true
- });
- // mesh.children[0].translateX(0.5);
- // mesh.children[0].translateZ(0.5);
- scene.add(mesh);
- //添加控制
- function addControl(x, y, z) {
- var controls = new function () {
- this.x = x;
- this.y = y;
- this.z = z;
- };
- return controls;
- }
- //多个控制点
- var controlPoints = [];
- controlPoints.push(addControl(3, 5, 3));
- controlPoints.push(addControl(3, 5, 0));
- controlPoints.push(addControl(3, 0, 3));
- controlPoints.push(addControl(3, 0, 0));
- controlPoints.push(addControl(0, 5, 0));
- controlPoints.push(addControl(0, 5, 3));
- controlPoints.push(addControl(0, 0, 0));
- controlPoints.push(addControl(0, 0, 3));
- var gui = new dat.GUI();
- gui.add(new function () {
- //克隆物体
- this.clone = function () {
- var clonedGeometry = mesh.children[0].geometry.clone();
- var materials = [
- new THREE.MeshLambertMaterial({opacity: 0.6, color: 0xff44ff, transparent: true}),
- new THREE.MeshBasicMaterial({color: 0x000000, wireframe: true})
- ];
- var mesh2 = THREE.SceneUtils.createMultiMaterialObject(clonedGeometry, materials);
- mesh2.children.forEach(function (e) {
- e.castShadow = true
- });
- mesh2.translateX(5);
- mesh2.translateZ(5);
- mesh2.name = "clone";
- scene.remove(scene.getChildByName("clone"));
- scene.add(mesh2);
- }
- }, 'clone');
- for (var i = 0; i < 8; i++) {
- f1 = gui.addFolder('Vertices ' + (i + 1));
- f1.add(controlPoints[i], 'x', -10, 10);
- f1.add(controlPoints[i], 'y', -10, 10);
- f1.add(controlPoints[i], 'z', -10, 10);
- }
- render();
- function addCube() {
- }
- function render() {
- stats.update();
- var vertices = [];
- for (var i = 0; i < 8; i++) {
- vertices.push(new THREE.Vector3(controlPoints[i].x, controlPoints[i].y, controlPoints[i].z));
- }
- mesh.children.forEach(function (e) {
- e.geometry.vertices = vertices;
- e.geometry.verticesNeedUpdate = true;
- e.geometry.computeFaceNormals();
- });
- requestAnimationFrame(render);
- renderer.render(scene, camera);
- }
- function initStats() {
- var stats = new Stats();
- stats.setMode(0); // 0: fps, 1: ms
- stats.domElement.style.position = 'absolute';
- stats.domElement.style.left = '0px';
- stats.domElement.style.top = '0px';
- document.getElementById("Stats-output").appendChild(stats.domElement);
- return stats;
- }
- }
- window.onload = init
- </script>
- </body>
- </html>
08-THREE.JS 点面创建物体,克隆物体,多材质物体的更多相关文章
- JavaScript DOM实战:创建和克隆元素
DOM来创建和克隆元素. createElement()和createTextNode() createElement()和createTextNode()做的事情正如它们的名字所说的那样.最常见的J ...
- js函数的创建
1.js 函数的创建有几种方式: 1.1 直接声明 1.2 创建匿名函数,然后赋值 1.3 声明函数,然后赋值给变量 1.4 使用1.3 得到的变量再赋值给变量 1.5 使用函数对象创建函数 < ...
- js如何动态创建表格(两种方法)
js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...
- Gerrit 服务器入门使用-项目的创建与克隆
Gerrit 服务器入门使用-项目的创建与克隆 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.创建克隆项目 1>.点击"BROWSE" 2>.点 ...
- react快速上手一(使用js语法,创建虚拟DOM元素)
1.装包,引包 首先需要安装两个包 react ,react-dom cnpm i react react-dom 介绍下这两个包: react:专门用来创建React组件,组件生命周期等这些东西. ...
- 本页面用来演示如何通过JS SDK,创建完整的QQ登录流程,并调用openapi接口
QQ登录将用户信息存储在cookie中,命名为__qc__k ,请不要占用 __qc__k : 1) :: 在页面顶部引入JS SDK库: 将“js?”后面的appid参数(示例代码中的:100229 ...
- JAVA 对象的创建与克隆
目录 一.对象的4种创建方式 二.通过new创建对象 三.反射 四.克隆对象 浅拷贝 深拷贝 五.反序列化 六.补充 一.对象的4种创建方式 new 创建 反射 克隆 反序列化 二.通过new创建对象 ...
- javascript多物体运动案例:多物体淡入淡出
javascript多物体运动案例:多物体淡入淡出 任务描述: 补充代码,当鼠标移入红色区域时,该区域透明度逐渐增加至不透明;当鼠标移出该红色区域时,该区域透明度逐渐恢复至初始程度. 效果图: < ...
- Three.js开发指南---创建,加载高级网格和几何体(第八章)
本章的主要内容: 一, 通过Three.js自带的功能来组合和合并已有的几何体,创建出新的几何体 二, 从外部资源中加载网格和几何体 1 前面的章节中,我们学习到,一个几何体创建的网格,想使用多个材质 ...
随机推荐
- Hexo+yilia添加helper-live2d插件宠物动画,很好玩的哦~~
个人主页:https://www.yuehan.online 现在博客:www.wangyurui.top 安装模块: 博客根目录选择cmd命令窗口或者git bash 输入以下代码,安装插件 操作: ...
- Numpy用于数组的文件输入输出
这一章比较简单,内容也比较少.而且对于文件的读写,还是使用pandas比较好.numpy主要是读写文本数据和二进制数据的. 将数组以二进制的格式保存到硬盘上 主要的函数有numpy.save和nump ...
- 流量分析系统----讲解-echarts模拟迁移(结合china.js)
百度 Echarts 地图->模拟迁徙,实现自动切换地图 小航哥注释: 1.本文主要是把模拟迁移的流程讲了一遍,讲的很好.具体实现参考航哥这篇随笔“流量分析系统----实现-echarts模拟迁 ...
- 如何成为专业的PHP开发者
如何才能成为一名专业的PHP开发者?资深Web开发者Bruno Skvorc在其博客上分享了一些心得. 当阅读各种和PHP相关的博客.Quora问题.Google+社区.资讯和杂志的时候,Bruno ...
- IBM的SOA方法论之一——五个切入点和八个场景
一.什么是SOA: 面向服务的体系结构(Service-Oriented Architecture,SOA)是一种 IT 体系结构风格,支持将您的业务转换为一组相互链接的服务或可重复业务任务,可在需要 ...
- flex label 换行
Flex中label换行有两种情况 在AS中赋值: label.text="Online\r\nResources" 在mxml中赋值: text="Online Res ...
- SpringBoot整合集成redis
Redis安装:https://www.cnblogs.com/zwcry/p/9505949.html 1.pom.xml <project xmlns="http://maven. ...
- 主攻ASP.NET MVC4.0之重生:使用反射获取Controller的ActionResult
示例代码 public ActionResult TypeOfForName() { Type typeinfo = typeof(CustomerClassController); //typeof ...
- 超酷Loading进度条
在线演示 本地下载
- 使用awk来提取内容
1.提取gff文件中的HLA基因的相关bed文件. gff的格式: zcat *gz|gawk 'BGIN{FS="\t";OFS="\t"}$3==" ...