没有平面也可以添加模型。

This commit is contained in:
tengge1 2019-11-13 21:33:41 +08:00
parent 5b06515dd7
commit ecc641ddf0
3 changed files with 19 additions and 10 deletions

View File

@ -59,7 +59,7 @@ class ModelPanel extends React.Component {
return <div className={classNames('ModelPanel', className)}
style={style}
>
>
<SearchField
data={categoryData}
placeholder={_t('Search Content')}
@ -165,12 +165,8 @@ class ModelPanel extends React.Component {
//
clickSceneToAdd(obj) {
app.toast(_t('Please click an plane in the scene.'));
app.on(`intersect.ModelPanel`, intersect => {
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);
});

View File

@ -78,7 +78,8 @@ var EventList = [
'transformControlsMouseDown', // 变形控件按下鼠标键
'transformControlsMouseUp', // 变形控件抬起鼠标键
'intersect', // 选择模型整体或部分
'raycast', // 光线投射(不碰到模型也会触发)
'intersect', // 碰撞到模型(只有碰撞到模型才会触发)
'beforeRender', // 渲染前执行
'afterRender', // 渲染后执行
'animate', // 进行动画

View File

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