需求:

拖动场景内的模型

方案:

增加控制器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控制器的更多相关文章

  1. [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作

    [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...

  2. JS实现拖动div层移动

    JS实现拖动div层移动 在谈到拖动div层之前,我们有必要来了解下 下面JS几个属性的区别----  pageX,pageY,layerX,layerY,clientX,clientY,screen ...

  3. MVC(Model(模型) View(视图) Controller(控制器))

    复习 1.      商品表 增删改查 index.php  add.php   view.php   edit.php   action.php 2.      MVC(Model(模型)  Vie ...

  4. 深入理解模型,视图和控制器(C#)

    这篇文章向你提供ASP.NET MVC 模型,视图和控制的高度概览.换句话说,解释一下ASP.NET MVC中的 ‘M’, ‘V’, 和 ‘C’. 看完这篇文章以后,你应该就能理解ASP.NET MV ...

  5. 原生JS实现拖动滑块验证登录效果

    ♀分享一组利用原生JS实现拖动滑块验证效果 ♀在这个组代码中涉及三个方面的知识: ⑴事件处理 ⑵添加验证标记 ⑶选择器的封装   代码如下: <!DOCTYPE html> <htm ...

  6. angular.js 中的作用域 数据模型 控制器

    1.angular.js 作为后起之秀的前端mvc框架,他于传统的前端框架都不同,我们再也不需要在html中嵌入脚本来操作对象了.它抽象出了数据模型,控制器及视图. 成功解耦了应用逻辑,数据模型,视图 ...

  7. three.js模型

    Three.js有一系列导入外部文件的辅助函数,是在three.js之外的,使用前需要额外下载, 在https://github.com/mrdoob/three.js/tree/master/exa ...

  8. js实现拖动验证码

    效果图: Index.html <!DOCTYPE html> <html lang="en"> <head> <meta http-eq ...

  9. js窗口拖动 模版

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

随机推荐

  1. NOIP 模拟 $26\; \rm 幻魔皇$

    题解 \(by\;zj\varphi\) 观察可发现一个点向它的子树走能到的白点,黑点数是一个斐波那契数列. 对于白色点对,可以分成两种情况: 两个白点的 \(lca\) 是其中一个白点 两个白点的 ...

  2. windows上解决git每次重复输入账号密码

    win7电脑: 1.在 C:\Users\Administrator 下 编辑 .gitconfig文件 2.在原有内容下添加一行(此行作用为自动保存,保存修改后再使用一次GIT,输入账号密码后下次即 ...

  3. tomcat Debug 启动

    eclipse有web工程,将打包为war包(export -> War file) 将打包好的war 包放在tomcat 的webapps下面: 配置debug: 参考来自 http://bl ...

  4. 阿里云(CentOS)搭建MediaWiki

    搭建环境 系统:CentOS 7.3 PHP:5.4.16 Mysql:maria MediaWiki:1.26.4(更高版本不再支持PHP5.4) 下面我们开始安装LAMP环境: 1.安装Apach ...

  5. 项目中经常用到的sass语法汇总

    1.定义变量 使用:$(符号定义变量) 注意:使用时要带有'$'符号,定义变量的方式与PHP相同 $变量:数值; $color_r : red; div{ color:$color_r; } 2.if ...

  6. Mysql 日期格式化 复杂日期区间查询

    前言 最近在做项目涉及到Mysql的复杂日期查询,日期查询其实在数据库中查询其实还是用的挺多的,比如查询开始日期到结束日期的区间信息,查询日期小于有效日期的信息,查询当天的日期,明天的日期,做比较等. ...

  7. jmeter实际场景应用之测试上传excel文件

    日常工作上测试的时候,会有一些场景是导入/上传文件.我们系统多是excel文件,这里就用excel文件为例,详述一下此次测试遇到的坑.最终结果是成功的,请看到最后! 1.获取接口的一些参数信息 先按F ...

  8. Layui引起的对前端的一次记录

    前言 首先会做这次记录,也是因为自己也是第一次去接触这个框架,以前总是听说,并没有去用过.这次出于实习的原因,去学习了一下Layui这个"面向后端开发者的框架".其次,此篇记录仅供 ...

  9. VS Code 1.60 发布!竟然可以自动检测编程语言了!

    北京时间 2021 年 9 月 3 日凌晨,微软正式发布 2021 年 8 月版的 Visual Studio Code.希望您会喜欢此版本中的许多更新与改进,以下是其中的一些亮点: * 自动语言检测 ...

  10. Python文件(File)及读写操作及生成器yield

    open函数在内存中创建缓存区,将磁盘上的内容复制到此处.文件内容读入到文件对象缓冲区后,文件对象将缓冲区视为非常大的列表,其中每个元素都有一个索引.文件对象按字节(大约每个字符)来对文件对象缓冲区索 ...