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