three.js DragControls +TransformControls 实现沿轴线拖拽功能

three.js DragControls +TransformControls 实现沿轴线拖拽功能

DragControls

DragControls 类可以实现对图元的拖拽移动功能,但是移动的方向跟场景的旋转有关,这里加上Transform 类,transform类可以给图元添加一个编辑辅助器,但是拖拽的时候会和场景控制器发生冲突。所以使用DragControls 的开始拖拽和结束拖拽监听取消场景控制器,防止冲突。

// 过滤不是mesh的物体
      let objects = [];
      for (let i = 0; i < this.scene.children.length; i++) {
        if (this.scene.children[i].isMesh) {
          objects.push(this.scene.children[i]);
        }
      }
// 初始化拖拽控件
      let dragControls = new DragControls(
        objects,
        this.camera,
        this.renderer.domElement
      );

      // 鼠标略过事件
      dragControls.addEventListener("hoveron", (e) => {
        // 让变换控件和选中的对象绑定
        transformControls.attach(e.object);
        this.box.setFromObject(e.object);
        this.renderer.render(this.scene, this.camera);
      });

      // 开始拖拽
      dragControls.addEventListener("dragstart", () => {
        this.controls.enabled = false;
        this.renderer.render(this.scene, this.camera);
      });

      // 拖拽结束
      dragControls.addEventListener("dragend", () => {
        this.controls.enabled = true;
        this.renderer.render(this.scene, this.camera);
      });
      dragControls.addEventListener("drag", () => {
        this.renderer.render(this.scene, this.camera);
      });

TransformControls

// 添加平移控件
      let transformControls = new TransformControls(
        this.camera,
        this.renderer.domElement
      );
      this.scene.add(transformControls);
      transformControls.addEventListener("change", () => {
        this.renderer.render(this.scene, this.camera);
      });

注意:DragControls的拖拽实现会影响transformControls 所以需要再修改下DragControls.js的部分代码,注释掉拖拽实现的代码,也可添加个判断的参数按条件忽略这部分代码。

function onPointerMove( event ) {

			if ( scope.enabled === false ) return;

			updatePointer( event );

			_raycaster.setFromCamera( _pointer, _camera );

			if ( _selected ) {

				// if ( _raycaster.ray.intersectPlane( _plane, _intersection ) ) {

				// 	_selected.position.copy( _intersection.sub( _offset ).applyMatrix4( _inverseMatrix ) );

				// }

				// scope.dispatchEvent( { type: 'drag', object: _selected } );

				return;

			}
}

参考

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值