flash 3d flash3d 研究所 pv3d 共享资源  | 经典范例  | 视频教程  | 友情链接  | 联系我们
登陆 | 注册  flash 3d 研究所
讨论区





最近更新:
● ck47阁下在讨论区里 发表新主题“新手问题...”(07:49:50)
● 无语瓶阁下在教程区里 回复“《超简易papervision3D基础 ...”(18:09:44)
● payday loan阁下在教程区里 回复“《pv3d, sandy, away3d...”(05:56:23)
浏览主题:请问如何让平面能够灵敏而精确响应鼠标单击事件

请问如何让平面能够灵敏而精确响应鼠标单击事件
snyuan (2010-01-26 13:41:12)

各位好,我用PV3D编程,在场景中加入一个平面(Plane),在其上加入一个小平面(也是个Plane),现在要用鼠标点击这个小平面从而调用事件处理函数。我给小平面加入了鼠标事件监听器this.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,objectPressHandler);,
但现在问题是这个鼠标事件经常不能被精确而灵敏地扑捉,导致我用鼠标在小平面上点击,就是不能选中小平面,也就是不能调用objectPressHandler函数。有时候只能让摄像机视角旋转一下,才能选中小平面。请问DDM君,各位大侠,是否碰到这种情况,该如何解决。先谢了。


flash 3d 研究所 DDM君
(2010-01-26 16:20:03)
可以考虑把plane变成layer,然后测试二维sprite的mouseEvent即可

flash 3d 研究所 noxss
(2010-01-27 09:45:09)
是啊,如果只需要点击的话搞成2D事件就可以了~~绝对准确~
如果有3D交互需求(比如需要获得点击位置的UV),可以试试给需要交互的地方分多些面。

flash 3d 研究所 newyaya
(2010-01-27 15:50:11)
恩,是的,能不采用3d的最好不要用,我游戏里原来也有鼠标,但是使用起来不准确,如果你实在想用可以参考以下范例:
sandy写的,用鼠标移动立方体,点击在该位置放置立方体。
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import sandy.core.data.Point3D;
import sandy.core.Scene3D;
import sandy.core.scenegraph.Camera3D;
import sandy.core.scenegraph.Group;
import sandy.events.Shape3DEvent;
import sandy.materials.Appearance;
import sandy.materials.attributes.LightAttributes;
import sandy.materials.attributes.LineAttributes;
import sandy.materials.attributes.MaterialAttributes;
import sandy.materials.ColorMaterial;
import sandy.materials.Material;
import sandy.primitive.Box;
import sandy.primitive.Plane3D;

/**
* ...
* @author Darknet
*/
public class SandyPlaceObjects extends Sprite
{
  public var scene:Scene3D;
  public var camera:Camera3D;
  public var group:Group = new Group('group');
  //public var box:Box = new Box('player', 32, 32, 32);
  public var ground:Plane3D = new Plane3D('bottom', 150, 250, 10, 10, Plane3D.ZX_ALIGNED,'quad');

  public var tmpbox:Box = new Box('tmpbox');
 
  public function SandyPlaceObjects()
  {
  camera = new Camera3D(300, 300);
  camera.y = 100;
  camera.lookAt(0,0,0);
  var root:Group = group;
  scene = new Scene3D( "scene", this, camera, root );
  addEventListener(Event.ENTER_FRAME, enterFrameHandler );
 
 
  var materialAttr:MaterialAttributes = new MaterialAttributes(
      new LineAttributes( 0.5, 0x2111BB, 0.4 ),
      new LightAttributes( true, 0.1)
    );
   
  var material:Material = new ColorMaterial( 0xFFCC33, 1, materialAttr );
  var app:Appearance = new Appearance( material );
  //box.appearance = app;
  //box.useSingleContainer = false;
  //box.enableBackFaceCulling = false;
  ground.appearance = app;
  ground.enableBackFaceCulling = false;
  ground.useSingleContainer = false;
  ground.enableEvents = true;
  ground.addEventListener(MouseEvent.CLICK, placeobject);
  ground.addEventListener(MouseEvent.MOUSE_OVER, updateobjectover);
  ground.addEventListener(MouseEvent.MOUSE_OUT, updateobjectout);
 
  //group.addChild(tmpbox);
  //group.addChild(box);
  group.addChild(ground);
  }
 
  public function placeobject(objectevent:Shape3DEvent):void {
  var placeobject:Box = new Box('boxplace');
  var v:Point3D = objectevent.point;
  placeobject.x = v.x;
  placeobject.y = v.y;
  placeobject.z = v.z;
  group.addChild(placeobject);
  //trace('added...'+"x:"+v.x+"y:"+v.y+"z:"+v.z);
  }
 
  public function updateobjectover(objectevent:Shape3DEvent):void {
  ground.addEventListener(MouseEvent.MOUSE_MOVE, updateobjectposition);
  group.addChild(tmpbox);
  }
 
  public function updateobjectposition(objectevent:Shape3DEvent):void {
  //trace('over');
  var v:Point3D = objectevent.point;
  tmpbox.x = v.x;
  tmpbox.y = v.y;
  tmpbox.z = v.z;
  //trace('added...'+"x:"+v.x+"y:"+v.y+"z:"+v.z);
  }
 
  public function updateobjectout(objectevent:Shape3DEvent):void {
  ground.removeEventListener(MouseEvent.MOUSE_MOVE, updateobjectposition);
  group.removeChildByName(tmpbox.name);
  }
 
  private function enterFrameHandler( event : Event ) : void {
  scene.render();
  }
}

}

flash 3d 研究所 snyuan
(2010-01-29 00:23:25)
谢谢各位,我也想能尽量用二维处理的就不用三维,毕竟二维的效率和精度要高多了。我做了个测试,在3D平面Plane上添加二维上的鼠标处理事件this.addEventListener(MouseEvent.CLICK,mouseClickHandler);
但是这好像根本不起作用。是不是这个二维事件处理函数被PV3D的InteractiveScene3DEvent屏蔽了。
如果如DDM君所说,把plane变成layer,然后测试二维sprite的mouseEvent,我不太清楚到底该怎么建立layer和加测试事件,另外此事件处理函数中怎么知道鼠标是对哪个3D对象进行操作的,麻烦详细介绍一下。多谢

flash 3d 研究所 noxss
(2010-01-29 10:26:08)
这个...要DISPLAYOBJECT才能用二维事件吧...
参考研究所的教程把PLANE放到一个VIEWPORTLAYER中再给这个VIEWPORTLAYER添加3D事件侦听就好了

flash 3d 研究所 noxss
(2010-01-29 11:25:41)
2D侦事件..想太多3D了,呵呵

flash 3d 研究所 snyuan
(2010-02-02 01:54:27)
谢谢noxss君还有各位大侠。VIEWPORTLAYER添加2D事件侦听的方法还是很好用的。

评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了