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); } };