快速导航:   教程资源  | 经典范例  | 友情链接  | 联系我们  | 官方微博
登陆 | 注册

 flash 3d 研究所
flash3d 研究所 pv3d 教程 研究所小贴士: flash11图形效率已经和单机无异了,所以不要再用pv3d、










最近更新:
● Aberumnomug阁下在讨论区里 发表新主题“Казино Онлайн Честно...”(18:31:07)
● DonaldHaing阁下在讨论区里 发表新主题“Бк Фонбет зеркало са...”(13:47:47)
● Aberumnomug阁下在讨论区里 发表新主题“Играть В Крейзи Манк...”(05:48:59)
浏览主题:《鼠标获取空间坐标的基础 射线和平面相交》

《鼠标获取空间坐标的基础 射线和平面相交》
DDM君 (2012-03-16 05:50:40)

DDM君,Flab3D.com (允许转载,转载请注明)



如何用只有x,y轴的二维鼠标,尽量精准的取得x,y,z三维空间的位置,是一个从三维出现就一直被讨论的主题。即使在图形技术如此发达的今天,三维空间的点击仍然只能说"大概准确"。
我们今次就来讨论,如何返回鼠标在一个给定平面上的三维点数据。
Flash3d的数学类通常都有平面数学。Pv3d里面描述一个无限大的三维平面,及其相关运算,是使用Plane3D这个类。
想了解更多其他数学类,可以参考《pv3d, sandy, away3d的三维数学运算类》

申明如下:
var plane3d:Plane3D=new Plane3D();
plane3d.setNormalAndPoint(法线向量,点);
然后用方法setNormalAndPoint()来描述这个平面,它必须接受两个参数:
1 法线向量,是一个三维数Number3D,比如一个XZ的平面的法线描述方法就是new Number3D(0,1,0)
2平面上的某个点,也是一个三维数Number3D,比如原点坐标就是new Number3D(0,0,0);


鼠标点击来确定三维空间的位置和摄像机的关系非常大。所以Pv3d的摄像机里也为我们准备了相关的功能,unproject()

使用法如下:
摄像机.unproject()
它接受两个参数,分别是鼠标点击的x,和y坐标,通常情况下我们用下面两个参数。
viewport.containerSprite.mouseX
viewport.containerSprite.mouseY
viewport是我们的pv3d视窗。
如不记得什么是视窗,可以参考《超简易papervision3D基础 第一篇 人人都能PV3D》

摄像机.unproject()会返回一个三维数Number3D,所以我们需要一个Number3D来获得返回的值。写法如下:
var p1:Number3D=摄像机.unproject(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);

但是这个三维数并非我们直接可以使用的世界坐标数据。所以我们必须把这个三维数向量相加本来摄像机(也需要声明成一个Number3D)的坐标。
p1=Number3D.add(p1,摄像机位置);
Number3D和AS3的Math一样使用法,add就是三维数的加法运算。
这里不需要再多加一个三维数来获取add,add自动就把p1的值变更了。
这时的p1就是世界坐标中的三维数据。


接下来,我们需要从‘摄像机的位置’到p1生成一条射线,并获得这条射线和最开始我们生成的平面plane3d的交点。
数学不好的朋友别着急,因为这个功能pv3d也为我们准备好了。用plane3d里的.getIntersectionLineNumbers()方法就可以了。这个方法会返回一个三维数,所以我们需要再声明一个三维数来获取它。
使用方法如下:
var inters:Number3D=new Number3D();
inters=plane3d.getIntersectionLineNumbers(p1,摄像机位置);
getIntersectionLineNumbers接受两个参数,就是射线上的任意两个三维点,我们这里的情况就是摄像机位置和鼠标点击位置p1。


之后返回来的inter这个三维数的inter.x, inter.y,inter.z既是我们鼠标点击在这个平面plane3d上反映出来的大概空间位置了。


当然,如果我们要每祯获取这个坐标,必须把除了声明和初始化的其他所有代码写入onEnterFrame的方法里面。


这是一个很经典的获取三维空间坐标的思路,也是以后对付更复杂获取情况的基础。
如果能找到一些几何书籍更好,射线和平面,三角形相交是处理‘交互触摸’,‘射击游戏’,甚至‘光线追踪渲染’的必要知识。
多看几遍好好理解起来,坚持努力,慢慢就会成为大师。继续加油。



DDM君
Flab3D.com






flash 3d 研究所
(2008-12-10 09:45:44)
我用的方法和这个思路一样,
可是总是有随机误差,
汗~


flash 3d 研究所
(2008-12-10 10:25:47)
的确 和鼠标实际点击的地方有区别 一般使用这个方法的时候都要把默认鼠标图标隐藏掉


flash 3d 研究所
(2008-12-10 10:48:12)
多谢
提醒了我,搞定了 哈哈
DDM速度发给“寻路”的方法上来啊,辛苦哦


flash 3d 研究所
(2008-12-10 17:06:06)
这几天我们还在攻坚IK中呢
三维寻路麻烦的有个Y的上下,如果只是在平面上走 用二维寻路就可以了


flash 3d 研究所
(2008-12-11 10:02:05)
我想要三维寻路的哦
你们加油,不急,嘿


flash 3d 研究所
(2009-01-12 19:36:42)
原来这么复杂,不看这个教程,根本看不懂源代码!
多谢!


flash 3d 研究所
(2009-07-08 15:19:39)
DM君大哥
           private var sphere:Sphere=new Sphere();
           private var mouseDO3D:DisplayObject3D=new Sphere();
           public function ClickMoveToPanle():void
           {
                 this.sphere.x=-500;
                 this.sphere.y=200;
                 this.scene.addChild(this.mouseDO3D);
                 this.scene.addChild(sphere);
                 startRendering();
           
           }
           override protected function onRenderTick(event:Event=null) : void
           {
            var ray:Number3D=camera.unproject(this.viewport.containerSprite.mouseX,this.viewport.containerSprite.mouseY);

            ray=Number3D.add(ray,this.camera.position);
            this.mouseDO3D.position=ray;
            var distance:Number=this.sphere.distanceTo(this.mouseDO3D);
            renderer.renderScene(this.scene,this.camera,this.viewport);
           
           
           }
那个球不见了




flash 3d 研究所
(2009-08-16 15:04:40)
this.sphere.x=-500;
你都移出可视区域了,


flash 3d 研究所
(2009-12-07 16:38:18)
看不明白~有源代码吗?


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

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

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

(目前需登陆方可发表)


不想添加了