javascript - 如何防止这两个立方体同时被拖动?

标签 javascript three.js aframe

以下是拖动示例:https://codepen.io/alexcheninfo/pen/vKkgkE 。如果您将一个立方体放在另一个立方体之上并捕获前面的立方体,则后面的立方体也会被拖动。

完整代码如下:

<script>
  AFRAME.registerComponent('draggable', {
    init() {
      this.mouse = new THREE.Vector2();
      this.scene = this.el.sceneEl;
      this.camera = this.scene.camera;
      this.obj = this.el.object3D;

      this.scene.addEventListener('mousemove', e => {
        this.mouse.x = (e.offsetX / this.scene.canvas.offsetWidth) * 2 - 1;
        this.mouse.y = -(e.offsetY / this.scene.canvas.offsetHeight) * 2 + 1;

        if (this.selected) {
          let r = new THREE.Raycaster();
          r.setFromCamera(this.mouse, this.camera);
          let dist = this.obj.position.distanceTo(this.camera.position);
          let point = r.ray.direction.multiplyScalar(dist);
          this.el.setAttribute('position', `${point.x} ${point.y} ${point.z}`);
        }
      });

      this.scene.addEventListener('mousedown', e => {
        let r = new THREE.Raycaster();
        r.setFromCamera(this.mouse, this.camera);
        let intersected = r.intersectObject(this.el.object3D, true);
        let objPos = this.el.object3D.position;
        let camPos = this.camera.position;
        console.log(objPos.distanceTo(camPos));
        if (intersected.length) this.selected = true;
      });

      this.scene.addEventListener('mouseup', e => {
        this.selected = undefined;
      });
    }
  });
</script>

<a-scene>
  <a-entity camera look-controls></a-entity>
  <a-sky src="https://raw.githubusercontent.com/aframevr/aframe/master/examples/boilerplate/panorama/puydesancy.jpg"></a-sky>
  <a-box color="tomato" position="-3 0 -10" draggable></a-box>
  <a-box draggable position="3 0 -5" draggable></a-box>
</a-scene>

如何防止这种情况发生? (例如只能拖动前面的立方体?)

最佳答案

这是因为您放置控件的位置。您正在执行多个光线转换器到一个摄像机的操作,而不是一个光线转换器到多个对象的操作。如果您有一个光线转换器知道它所相交的所有物体(并且它将返回按距离排序的对象),那就更容易了。 http://threejs.org/docs/api/core/Raycaster.html

我的结构是:

  • 使用内置的光线转换器组件。即将与 0.3.0 一起发布的 master 分支上的 API 得到了改进。 https://aframe.io/docs/master/components/raycaster.html
  • 有一个依赖于光线转换器组件的拖动器组件。
  • 让拖动器组件仅与具有 draggable 的对象相交组件,draggable类,或data-draggable属性。

<a-scene> <a-camera> <a-entity dragger></a-entity> </a-camera> <a-entity draggable></a-entity> </a-scene>

AFRAME.registerComponent('dragger', {
  init: function () {
    // Configure raycaster.
    this.el.setAttribute('raycaster', {
      objects: '[draggable]',
      // ...
    });
  },

  tick: function () {
    // Use this.el.components.raycaster.intersectedEls
  }
});

关于javascript - 如何防止这两个立方体同时被拖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38453010/

相关文章:

javascript - getElementById 无法在 <embed> 的 Google Chrome 扩展中工作

javascript - 大图像和 JavaScript

带有 envmap 的 Aframe gltf-model 演示

javascript - 在 A 形框架中单击时播放声音

javascript - 通过 JavaScript 更新 Facebook Open Graph 元标记

javascript - 提交时禁用 AddEventListener

javascript - 在连接的字符串之间动态添加空格

javascript - Aframe 使用 Three.js 更改对象位置

javascript - 为什么我的 Canvas 元素只显示黑屏?

aframe - 如何在 React VR 中将摄像机更改为第三人称?