three.js 模型拖动之DragControls控制器
需求:
拖动场景内的模型
方案:
增加控制器DragControls
1、引入控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { TransformControls } from "three/examples/jsm/controls/TransformControls";
import { DragControls } from "three/examples/jsm/controls/DragControls";
2、加载控制器
获取场景内模型列表 ——》
var objects = [];
for (let i = 0; i < this.scene.children.length; i++) {
if (this.scene.children[i].isMesh) {
objects.push(this.scene.children[i]);
}
}
加载控制器TransformControls ——》
加载控制器DragControls ——》
this.transformControls = new TransformControls(this.camera, this.renderer.domElement);
this.scene.add(this.transformControls)
this.dragControls = new DragControls(objects, this.camera, this.renderer.domElement);
3、更改模型位置 ——》
可选监听:
dragstart 开始移动
drag
dragend 结束移动
hoveron 鼠标进入模型
hoveroff 鼠标离开模型
this.dragControls.addEventListener('hoveron', function( event ){
self.orbitControls.enabled = false
self.changeMaterial(event.object)
console.log(event.object)
self.transformControls.attach(event.object);
self.transformControls.setSize(0.4);
});
createevent() {
// 事件管理、操作控制器 ,旋转控件
this.orbitControls = new OrbitControls(
this.camera,
this.renderer.domElement
);
// this.controls = new TrackballControls(this.camera, this.renderer.domElement); // 轨迹球控件
// // controls.noRotate = true;
// this.controls.noPan = true;
// // 视角最小距离
// this.controls.minDistance = 1000;
// // 视角最远距离
// this.controls.maxDistance = 5000;
this.orbitControls.enableDamping = true;
this.orbitControls.maxDistance = 1000;
this.orbitControls.minDistance = 1;
this.transformControls = new TransformControls(this.camera, this.renderer.domElement);
this.scene.add(this.transformControls)
var objects = [];
for (let i = 0; i < this.scene.children.length; i++) {
if (this.scene.children[i].isMesh) {
objects.push(this.scene.children[i]);
}
}
this.dragControls = new DragControls(objects, this.camera, this.renderer.domElement);
var self = this
this.dragControls.addEventListener('dragstart', function (event) { //
// this.controls.enabled = false;
});
// 拖拽结束
this. dragControls.addEventListener('dragend', function (event) {
// this.controls.enabled = true;
});
this.dragControls.addEventListener('hoveron', function( event ){ //选中模型
self.orbitControls.enabled = false // 关闭orbitControls 控制器
self.changeMaterial(event.object)
console.log(event.object)
self.transformControls.attach(event.object);
self.transformControls.setSize(0.4);
});
this.dragControls.addEventListener('hoveroff',function(event){ 离开模型
self.modelnumber = event.object.position
self.orbitControls.enabled = true //启动orbitControls 控制器
}) },
three.js 模型拖动之DragControls控制器的更多相关文章
- [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作
[.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...
- JS实现拖动div层移动
JS实现拖动div层移动 在谈到拖动div层之前,我们有必要来了解下 下面JS几个属性的区别---- pageX,pageY,layerX,layerY,clientX,clientY,screen ...
- MVC(Model(模型) View(视图) Controller(控制器))
复习 1. 商品表 增删改查 index.php add.php view.php edit.php action.php 2. MVC(Model(模型) Vie ...
- 深入理解模型,视图和控制器(C#)
这篇文章向你提供ASP.NET MVC 模型,视图和控制的高度概览.换句话说,解释一下ASP.NET MVC中的 ‘M’, ‘V’, 和 ‘C’. 看完这篇文章以后,你应该就能理解ASP.NET MV ...
- 原生JS实现拖动滑块验证登录效果
♀分享一组利用原生JS实现拖动滑块验证效果 ♀在这个组代码中涉及三个方面的知识: ⑴事件处理 ⑵添加验证标记 ⑶选择器的封装 代码如下: <!DOCTYPE html> <htm ...
- angular.js 中的作用域 数据模型 控制器
1.angular.js 作为后起之秀的前端mvc框架,他于传统的前端框架都不同,我们再也不需要在html中嵌入脚本来操作对象了.它抽象出了数据模型,控制器及视图. 成功解耦了应用逻辑,数据模型,视图 ...
- three.js模型
Three.js有一系列导入外部文件的辅助函数,是在three.js之外的,使用前需要额外下载, 在https://github.com/mrdoob/three.js/tree/master/exa ...
- js实现拖动验证码
效果图: Index.html <!DOCTYPE html> <html lang="en"> <head> <meta http-eq ...
- js窗口拖动 模版
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
随机推荐
- SpringBoot中Jackson的过滤使用
在接口的返回对象中,可能会有一些属性为null或者需要禁止某些字段返回给客户端. 在SpringBoot中可使用内置了Jackson实现这个需求 1. 过滤为null字段 在实体类中使用@JsonIn ...
- NOIP 模拟 $13\; \text{玄学题}$
题解 题如其名,是挺玄学的. 我们发现每个值是 \(-1\) 还是 \(1\) 只与它的次数是奇是偶有关,而 \(\sum_j^{j\le m}d(i×j)\) 又只与其中有多少个奇数有关 对于 \( ...
- mysql如何查看是32位还是64位?
mysql如何查看是32位还是64位? 1. mysql -V或mysql --version 或者 2. 进入mysql,输入命令:show variables like '%version_%';
- adobe cc 系列产品更改默认安装路径方法
通过Adobe Creative Cloud 修改 1.在开始菜单中找到图下程序点开,并进行如下操作: 2.点击Apps位置 等待加载出软件,如图下所示. 点击右上角图标,会弹出以下窗口,点击首选项 ...
- 实现动态加载一个 JavaScript 资源
var script = document.createElement("script"); var head = document.getElementsByTagName(&q ...
- 2014 12 27 bestcoder 第一题
水的不行不行的一道题 也是自己做的第一道题 纪念下 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h ...
- nginx《一安装》
linux上nginx相关 wget https://nginx.org/download/nginx-1.14.1.tar.gz tar -zxvf nginx-1.14.1.tar.gz ./co ...
- MySQL之连接查询和子查询
多表连接的基本语法 多表连接,就是将几张表拼接为一张表,然后进行查询 select 字段1, 字段2, ... from 表1 {inner|lift|right} join 表2 on 连接条件; ...
- Python语法之选择和循环(if、while)
前言:在程序开发中,一共有三种流程方式: 顺序:从上向下,顺序执行代码 分支:根据条件判断,决定执行代码的分支 循环:让特定代码重复执行(解决程序员重复工作) 1.判断的定义: 如果条件满足,才能做某 ...
- vue js 手写 正则判断 手机号码 和 密码
const phoneOrEmails = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/ if(this.ruleForms.phoneOrEmail == ...