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