核心提示:鼠标点击的屏幕坐标转换到视点坐标系var me = this, view = this.getView(), viewModel = this.getViewModel(); var text = v...
鼠标点击的屏幕坐标转换到视点坐标系
var me = this, view = this.getView(), viewModel = this.getViewModel(); var text = view.down(‘[name=Pickuppos]’).getText(); if (me._object) { if (text == “拾取”) { view.down(‘[name=Pickuppos]’).setText(“完成”); me.Pickuppos = true; var sceneview = Ext.getCmp(‘scene’); var sceneviewcontroller = Ext.getCmp(‘scene’).getController(); var camera = “”; //设置球体的值 var radius = 0.5, segemnt = 16, rings = 16; var sphereMaterial = new THREE.MeshLambertMaterial({ color: 0xCC0000 }); var sphere = new THREE.Mesh( new THREE.SphereGeometry(radius, segemnt, rings), sphereMaterial ); sphere.geometry.verticesNeedUpdate = true; sphere.geometry.normalsNeedUpdate = true; me._scene.add(sphere); sceneview.getEl().on(‘click’, function () { if (!me.Pickuppos) { return; } var coordinate = { x: event.pageX, y: event.pageY }; me._mouse = { x: (coordinate.x / sceneview.getWidth()) * 2 - 1, y: -(coordinate.y / sceneview.getHeight()) * 2 + 1 }; me.raycaster.setFromCamera(me._mouse, me._camera); //鼠标点击的屏幕坐标转换到视点坐标系 var vector = new THREE.Vector3(mouse.x, mouse.y, 1).unproject(me._camera); //在视点坐标系中形成射线 me.raycaster.set(me._camera.position, vector.sub(me._camera.position).normalize()); //射线和模型求交,选中一系列直线 var intersects = me.raycaster.intersectObjects(me._scene.children, true); console.log(intersects); if (intersects) { var tag = “”; for (var i = 0; i < intersects.length; i++) { if (intersects[i].object.userData.type) { console.log(); tag = intersects[i]; break; } } //把球设为可见,并且位置移到鼠标点击的屏幕位置 sphere.position.copy(intersects[0].point); me._object.position.copy(tag.point); } }, this); } else { view.down(‘[name=Pickuppos]’).setText(“拾取”); me.Pickuppos = false; var sceneController = Ext.getCmp(‘scene’).getController(); sceneController.transformControl.detach(); me._object = null; return; }} else { Ext.Msg.alert(‘提示’, ‘先选择一个物体再点击拾取功能!’); }