From ecc641ddf0931fd5deb6c1857fed3a314a4e3943 Mon Sep 17 00:00:00 2001 From: tengge1 <930372551@qq.com> Date: Wed, 13 Nov 2019 21:33:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=B9=B3=E9=9D=A2=E4=B9=9F?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9E=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/editor/assets/ModelPanel.jsx | 10 +++------- ShadowEditor.Web/src/event/EventList.js | 3 ++- ShadowEditor.Web/src/event/RaycastEvent.js | 16 ++++++++++++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ShadowEditor.Web/src/editor/assets/ModelPanel.jsx b/ShadowEditor.Web/src/editor/assets/ModelPanel.jsx index 3899a862..541ecbf1 100644 --- a/ShadowEditor.Web/src/editor/assets/ModelPanel.jsx +++ b/ShadowEditor.Web/src/editor/assets/ModelPanel.jsx @@ -59,7 +59,7 @@ class ModelPanel extends React.Component { return
+ > { - if (!intersect) { - return; - } - app.on(`intersect.ModelPanel`, null); + app.on(`raycast.ModelPanel`, (intersect, event) => { + app.on(`raycast.ModelPanel`, null); obj.position.copy(intersect.point); this.addToCenter(obj); }); diff --git a/ShadowEditor.Web/src/event/EventList.js b/ShadowEditor.Web/src/event/EventList.js index b7f4a21b..411b175b 100644 --- a/ShadowEditor.Web/src/event/EventList.js +++ b/ShadowEditor.Web/src/event/EventList.js @@ -78,7 +78,8 @@ var EventList = [ 'transformControlsMouseDown', // 变形控件按下鼠标键 'transformControlsMouseUp', // 变形控件抬起鼠标键 - 'intersect', // 选择模型整体或部分 + 'raycast', // 光线投射(不碰到模型也会触发) + 'intersect', // 碰撞到模型(只有碰撞到模型才会触发) 'beforeRender', // 渲染前执行 'afterRender', // 渲染后执行 'animate', // 进行动画 diff --git a/ShadowEditor.Web/src/event/RaycastEvent.js b/ShadowEditor.Web/src/event/RaycastEvent.js index e509ddf0..4c8a18c5 100644 --- a/ShadowEditor.Web/src/event/RaycastEvent.js +++ b/ShadowEditor.Web/src/event/RaycastEvent.js @@ -44,17 +44,29 @@ RaycastEvent.prototype.onMouseUp = function (event) { return; } - var domElement = app.editor.renderer.domElement; + let domElement = app.editor.renderer.domElement; this.mouse.x = event.offsetX / domElement.clientWidth * 2 - 1; this.mouse.y = -event.offsetY / domElement.clientHeight * 2 + 1; this.raycaster.setFromCamera(this.mouse, app.editor.view === 'perspective' ? app.editor.camera : app.editor.orthCamera); - var intersects = this.raycaster.intersectObjects(app.editor.scene.children, true); + let intersects = this.raycaster.intersectObjects(app.editor.scene.children, true); if (intersects.length > 0) { + app.call('raycast', this, intersects[0], event); app.call('intersect', this, intersects[0], event, intersects); + } else { + // 没有碰撞到任何物体,则跟y=0的平面碰撞 + let plane = new THREE.Plane().setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3()); + let target = new THREE.Vector3(); + this.raycaster.ray.intersectPlane(plane, target); + + app.call('raycast', this, { + point: target, + distance: this.raycaster.ray.distanceSqToPoint(target), + object: null + }, event); } };