javascript 3d网页 示例 ( three.js 初探 七)
1 完整代码下载
https://pan.baidu.com/s/1JJyVcP2KqXsd5G6eaYpgHQ
提取码 3fzt (压缩包名: 2020-4-5-demo.zip)
2 图片展示

3 主要代码
"use strict"
class InitControl{
constructor(View, Three){
this.view = View;
this.three = Three;
this.target = {object: null, isDown: false, isMove: false};
this.dragTarget = {};
this.group = this.add(new THREE.Group(), null, true);
this.setDrag(Three.scene, Three.camera, Three.renderer, this.group.children);
this.setOrbit(Three.scene, Three.camera, Three.renderer);
this.setTransform(Three.scene, Three.camera, Three.renderer);
this.setEvents(View, Three);
this.view.updateLanguage(this.group, "ch");//更改为中文字体
}
add (a, b, c){ // a 添加至-> b, c 如果没有定义,新添加的对象将自动获得焦点
a = this.three.add(a, b);
this.view.addList(a, b);
if(c === undefined) this.setTarget(a, {focusList: true});
return a;
}
remove (a){
this.removeTarget(a);
this.view.removeList(a);
this.three.remove(a);
this.three.update();
}
setDrag(scene, camera, renderer, children){
let drag = new THREE.DragControls(children, camera, renderer.domElement);
drag.addEventListener('hoveron', (e)=>{
this.dragTarget.old = null;
this.dragTarget.now = e.object;
});
drag.addEventListener('hoveroff', (e)=>{
this.dragTarget.now = null;
this.dragTarget.old = e.object;
});
drag.enabled = false;
this.drag = drag;
}
setOrbit(scene, camera, renderer){
let orbit = new THREE.OrbitControls(camera, renderer.domElement);
orbit.target = new THREE.Vector3(0, 0, 0);//控件焦点
//orbit.minPolarAngle = Math.PI * 0.3;//向上最大角度
//orbit.maxPolarAngle = Math.PI * 0.4;//向下最大角度
orbit.minDistance = camera.near;//最小距离
orbit.maxDistance = camera.far;//最大距离
orbit.autoRotateSpeed = 10;//自动旋转速度
//orbit.panSpeed = 100;//鼠标旋转速度
orbit.enableZoom = true;//是否启用缩放
orbit.enableKeys = true;//是否启用键盘
orbit.panSpeed = 1;//鼠标平移速度
orbit.keyPanSpeed = 100;//按键平移的速度
orbit.keys.LEFT = 65;//key a左
orbit.keys.UP = 87;//key w前
orbit.keys.RIGHT = 68;//key d右
orbit.keys.BOTTOM = 83;//key s后
orbit.addEventListener("change", ()=>{renderer.render(scene, camera);});
this.orbit = orbit;
}
setTransform(scene, camera, renderer){
var transform = new THREE.TransformControls(camera, renderer.domElement);
transform.size = 1;
scene.add(transform);
this.transform = transform;
transform.addEventListener( 'dragging-changed', (e)=>{this.orbit.enabled = !e.value;});
transform.addEventListener('change', (e)=>{
let type = transform.getMode(), mesh = this.target.object || e.target.object;
let hc = mesh.WHX.elem.listContent.mesh.object;
switch(type){
case "translate":
hc.position.x = mesh.position.x;
hc.position.y = mesh.position.y;
hc.position.z = mesh.position.z;
break;
case "rotate":
hc.rotation.x = mesh.rotation.x;
hc.rotation.y = mesh.rotation.y;
hc.rotation.z = mesh.rotation.z;
break;
case "scale":
hc.scale.x = mesh.scale.x;
hc.scale.y = mesh.scale.y;
hc.scale.z = mesh.scale.z;
break;
default: break;
}
this.three.boxHelper.update();
renderer.render(scene, camera);
});
}
setTarget(object, param){
this.removeTarget(this.target.object);
if(!object || !object.WHX) return;
param = param || {};
this.three.boxHelper.setFromObject(object);
this.three.boxHelper.visible = true;
this.transform.attach(object);
if(param.focusListStyle === undefined) this.view.focusListStyle(object.WHX.elem.son);
if(param.focusList === true) this.view.focusList(object);
object.WHX.elem.listContent.mesh.father.style.display = "block";//if(param.listContent === undefined) this.view.objectContents(object);
this.target.object = object;
this.three.update();
}
removeTarget(object){
if(!object || !object.WHX) return;
this.three.boxHelper.visible = false;
this.transform.detach(object);
this.view.focusListStyle(object.WHX.elem.son, "remove");
object.WHX.elem.listContent.mesh.father.style.display = "none"; //this.view.objectContents();
this.target.object = null;
this.three.update();
}
setEvents(View, Three){
let _holdGroup = null, getObject = (a)=>{
if(a.WHX_ID === undefined){return;}
let o = Three.scene.getObjectById(a.WHX_ID);
if(o === undefined){console.log("获取对象失败"); return;}
//let object = a.tagName === "SUMMARY" ? o.WHX.backGroup : o;
return o;
}
//scene -> list
let down = ()=>{this.target.isDown = true;}
let move = ()=>{if(this.target.isDown === true && this.target.isMove === false) this.target.isMove = true;}
let up = ()=>{
if(this.target.isMove === false) this.setTarget(this.dragTarget.now, {focusList:true});
this.target.isMove = false;
this.target.isDown = false;
Three.renderer.domElement.removeEventListener("mousedown", down);
Three.renderer.domElement.removeEventListener("mousemove", move);
Three.renderer.domElement.removeEventListener("mouseup", up);
}
View.addEvent(Three.renderer.domElement, "mousedown", down);
View.addEvent(Three.renderer.domElement, "mousemove", move);
View.addEvent(Three.renderer.domElement, "mouseup", up);
//list -> scene
View.targetCallback = (a)=>{
if(a.WHX_control_ID !== undefined){ //WHX_control_ID = 0 删除 1 复制 2 子级
if(_holdGroup !== null) _holdGroup = null;
if(a.WHX_control_ID === 2) a.style.background = "rgba(0, 0, 200, 0.5)";
let o = this.target.object;
switch(a.WHX_control_ID){
case 0: this.remove(o); break;
case 1: this.setTarget(this.add(o.clone(true), o)); break;
case 2: _holdGroup = o; this.setTarget(o); break;
default: break;
}
return;
}
if(_holdGroup !== null){//分组操作
let o = getObject(a);
if(o){
this.remove(o);
this.add(o, _holdGroup);
}
_holdGroup = null;
View.right.t_control[3].style.background = "";
this.setTarget(o); return;
}
this.setTarget(getObject(a));
}
}
}
javascript 3d网页 示例 ( three.js 初探 七)的更多相关文章
- 网页3D效果库Three.js初窥
网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...
- [JS]jQuery,javascript获得网页的高度和宽度
[JS]jQuery,javascript获得网页的高度和宽度网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeigh ...
- Javascript模块化编程:require.js的用法
摘自:http://blog.jobbole.com/30046/ 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库 ...
- Three.js学习笔记 – “我和小伙伴都惊呆了”的特效和Three.js初探
什么是Three.js three.js是JavaScript编写的WebGL第三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包 ...
- JavaScript交互式网页设计 • 【第1章 JavaScript 基本语法】
全部章节 >>>> 本章目录 1.1 JavaScript 概述 1.1.1 JavaScript 简介 1.1.2 JavaScript 的概念和执行原理 1.1.3 J ...
- 将JavaScript 插入网页的方法
将JavaScript 插入网页的方法 使用Javascript代码. 插入JavaScript 与在网页中插入CSS的方式相似.使用下面的代码可以在网页中插入JavaScript: ... 其中的. ...
- [转]backbone.js 初探
本文转自:http://weakfi.iteye.com/blog/1391990 什么是backbone backbone不是脊椎骨,而是帮助开发重量级的javascript应用的框架. 主要提供了 ...
- Javascript调用ActiveX示例
Javascript调用ActiveX示例 写一个ActiveX控件比如叫做MyNameSpace.SecreteInfo,安装在客户机器上,这样可以通过c++获取到机器的几乎任何信息. 在网 ...
- jquery的height()和javascript的height总结,js获取屏幕高度
jquery的height()和javascript的height总结,js获取屏幕高度 2014年9月18日 15048次浏览 引子 今天是九一八事变八十三周年,大家勿忘国耻!加油学习!经济和技术等 ...
随机推荐
- 盘点Linux运维常用工具(二)-web篇之nginx
1.nginx的概述 .nginx是一个开源的.支持高性能.高并发的WWW服务和代理服务软件 .是由俄罗斯人Igor Sysoev开发的,具有高并发.占用系统资源少等特性 .官网:http://ngi ...
- Ubuntu部署Asp.net core网站无法访问
前几天应工作需要,在阿里云上部署一个测试站点.本以为分分钟的事情,没想到打脸了. 当时直接新建一个webapi项目,publish后直接上传到阿里云,随后设置nginx转发网站端口5000. 接着打开 ...
- Redis04——五分钟明白Redis的哨兵模式
和所有的数据库一样,Redis也支持集群化,Redis的集群分为分布式集群和主从集群.大部分公司采取的都是主从集群.所以在本篇文章内,我们将着重介绍Redis的主从集群及哨兵机制. 由于Redis的主 ...
- axios请求拦截器
import axios from 'axios'; // 创建axios实例 let service = null; if (process.env.NODE_ENV === 'deve ...
- 给萌新的 TS custom transformer plugin 教程——TypeScript 自定义转换器插件
xuld/原创 Custom transformer (自定义转换器)是干什么的 简单说,TypeScript 可以将 TS 源码编译成 JS 代码,自定义转换器插件则可以让你定制生成的代码.比如删掉 ...
- 【Weiss】【第03章】练习3.12:单链表倒置
[练习3.12] a.编写一个非递归过程以O(N)时间反转单链表. b.使用常数附加空间编写一个过程以O(N)时间反转单链表. Answer: 这题的b貌似没啥意义,在a小题里直接用头插法,不断地将头 ...
- Linux常用命令总结(一)
一.cd命令 用于切换当前目录,类似与win的命令.它可以切换到绝对路径,也可以是相对路径. cd /root/Doce # 切换到绝对路径/root/Doce目录下 cd ./path # 切 ...
- Block详解二(底层分析)
Block专辑: Block讲解一 MRC-block与ARC-block Block详解一(底层分析) 今天讲述Block的最后一篇,后两篇仅仅是加深1,2篇的理解,废话少说,开始讲解! __blo ...
- IntegerCache缓存占用堆、栈、常量池的问题,自动拆装箱的基本概念,Integer==int时的问题说明
原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 先普及一个基本概念:Java中基本数据类型的装箱和拆箱操作 自动装箱 在JDK5以后,我们 ...
- win 7 系统过期处理办法
超级尴尬,刚装的win7 系统居然过期了.下次再也不装盗版了,吼吼吼 处理方法就是下载oem7F7 软件安装,不用再怎么操作就好了. 就是这么简单,并不用像网上那样找什么激活码.