使用Unity的时候了解到Unity可通过射线碰撞检测来精确判断地形,从而实现不规则地形角色的运动模拟,那么away3d是否也有相同功能呢?通过样例学习,发现away3d中有鼠标拾取的功能。而这个功能的核心之一恰好就是Raycast方式;这个方式的原理就是从摄影机发射一条射线并判断焦点从而完成三维物件的拾取。那么,这条射线是否可人为定义从指定位置发射呢?答案是肯定的。away3d.core.pick.RaycastPicker就提供了此功能;RaycastPicker的getEntityCollision方法可获取射线所经过区域的交点;焦点是away3d.core.pick.PickingColliderVO类型的对象,包含了碰撞射线的属性;通过该对象的rayEntryDistance属性是射线起点到交点的长度;rayEntityCollision的参数有三个:第一是射线起点位置向量,第二参数是射线方向向量,第三参数是需要碰撞碰撞检查的Vector.<Entity>组;知道了这些,下面就动手看看是不是如自己所想吧;
import away3d.core.pick.RaycastPicker;
import away3d.core.pick.PickingCollisionVO;
import away3d.containers.View3D;
import away3d.primitives.CubeGeometry;
import away3d.materials.ColorMaterial;
import away3d.primitives.PlaneGeometry;
import away3d.entities.Mesh;
import away3d.entities.Entity;
import away3d.controllers.HoverController;
import away3d.primitives.SphereGeometry;
import away3d.entities.Sprite3D;
import away3d.materials.TextureMaterial;
import away3d.textures.BitmapTexture;
import away3d.core.pick.PickingColliderType;
var v3D:View3D=new View3D();
stage.addChild(v3D);
var box1:Mesh=new Mesh(new CubeGeometry(100,100),new ColorMaterial(0xFFFF00,0.4));
var box2:Mesh=new Mesh(new SphereGeometry(100),new ColorMaterial(0x00FFFF,0.8));
var pln:Mesh=new Mesh(new PlaneGeometry(1000,1000));
v3D.scene.addChild(pln);
v3D.scene.addChild(box1);
v3D.scene.addChild(box2);
box1.y=100;
box2.y=100;
box2.x=300;
var sp:Sprite3D=new Sprite3D(new TextureMaterial(new BitmapTexture(new MAPP())),10,10);
TextureMaterial(sp.material).alphaBlending=true;
v3D.scene.addChild(sp);
var hch:HoverControllerHelper=new HoverControllerHelper(stage,new HoverController(v3D.camera,pln));

通过以上代码搭建了测试场景,一个球体,一个方块和一个平面(作为地板);并设置了悬停控制器来观察场景的内容;增设了一个反应碰撞交点的Sprite3D作为指示器;而下面才是重头戏。

var rc:RaycastPicker=new RaycastPicker(true);

建立RaycastPicker 并设置其沿着最近的距离开始寻找位置(参数true)

var direct:Vector3D=new Vector3D(box2.x-box1.x,box2.y-box1.y,box2.z,-box1.z);
direct.normalize();

这里需要得到box1到box2向量的方向;所以通过上式计算得出;

var Vo:PickingCollisionVO=rc.getEntityCollision(box1.position,direct,Vector.<Entity>([box2]));

下面求得交点;如果没有getEntityCollision方法会返回null所以下面的判断还需要注意一下;

addEventListener(Event.ENTER_FRAME,run);

为了让程序运行,需要为view3d加入一个驱动,刷新屏幕;或许通过动态的判断检测效果会更直接,所以干脆把getEntityCollision放在驱动中;这里需要注意的是PickingCollisionVO仅仅包含了射线的属性(长度,起点,方向等)是不包含交点的。 不过可以以下方式计算出终点的位置;

var diro:Vector3D=new Vector3D(box1.x+direct.x*dis,box1.y+direct.y*dis,box1.z+direct.z*dis);

这样再持续将交点指示器位置更新就大功告成了; 为了直观,在每一帧给box2的rotationY加了一个增量;

function run(e:Event){Vo=rc.getEntityCollision(box1.position,new Vector3D(1,0,0),Vector.<Entity>([box2]));
if(Vo!=null){sp.visible=true;
var dis:Number=Vo.rayEntryDistance;
var diro:Vector3D=new Vector3D(box1.x+direct.x*dis,box1.y+direct.y*dis,box1.z+direct.z*dis);
sp.position=diro;
txt.text="distance="+dis;
}else{if(sp.visible){sp.visible=false;
}
}
box2.rotationY+=0.3;
if(box2.rotationY>360){box2.rotationY-=360;
}
v3D.render();
}

经过测试发觉对于box物体可完美运行,而对于球体则不准确,忽然想起pickingCollider属性,设置其为PickingColliderType.AS3_FIRST_ENCOUNTERED或AS3_BEST_HIT之后,完美运行。

box2.pickingCollider=PickingColliderType.AS3_BEST_HIT;//AS3_FIRST_ENCOUNTERED;

away3d 4x射线碰撞检测相关推荐

  1. unity中射线碰撞检测总结

    这阵子通过看视频,看书对unity中射线碰撞检测,有了一些了解,这里我把它总结一下写下来,希望能帮助到你们,也希望通过各位大神来指正不足之处: 射线碰撞检测,就是由某一物体发射出一道射线,射线碰撞到物 ...

  2. Unity 射线碰撞检测

    1 定义 射线是在三维世界中从一个点沿一个方向发射的一条无限长的线.在射线的轨迹上,一旦与添加了碰撞器的模型发生碰撞,将停止发射.射线碰撞检测,就是由某一物体发射出一道射线,射线碰撞到物体之后,可以得 ...

  3. away3d 4x的阴影方法们

    要通过计算机创建真实可信的图像,形体,灯光,阴影,这三要素必不可少.这里介绍一下away3d中提供的阴影解决方案,以及每种方案的用法作为备忘录: 要使用阴影,首先需要知道已下几点: 1:away3d阴 ...

  4. away3d 4x开发20要点

    1:原有的DefaultMaterialBase改为了SinglePassMaterialBase类: 2:只有继承自EffectMethodBase类的Method可用addMethod进行添加:比 ...

  5. away3d 4x骨骼控制器用法详解

    终于将away3d的SkeletonAnimator弄懂了.这里记下使用SkeletonAnimator的具体步骤作: 1:骨骼动画的制作:使用3dmax 制作一个简短动画:并通过格式插件/脚本导出到 ...

  6. 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用

    首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++ ...

  7. 【unity3d游戏开发之基础篇】利用射线实现鼠标控制角色转向和移动(角色移动一)...

    由于最近搞2D游戏, 下面的代码配合NGUI来使用 ... 将代码拖到角色身上就OK, 实现了角色转向.移动 ,想看效果的可以将代码下下来~ 用到了向量来计算角度 以及方向,   得恶补下向量知识了 ...

  8. Unity3d插件 BladeSmith Melee Combat System 武器碰撞检测

    作用:武器碰撞检测方案 实现原理 在武器的刀刃上,在整把剑的剑身一条直线上布置多个(8-15个)坐标点,称作标记点.标记点父物体是剑身,播放动画时,标记点也跟着剑挥舞移动. 当播放武器挥舞动画时,就触 ...

  9. ugui源码_UGUI 源码笔记(一)文件结构和部分组件使用

    这是我阅读 UGUI 源码记录的相关笔记,共三部分.文件结构和部分组件使用.输入事件.核心部分 ZeroyiQ:UGUI 源码笔记(一)文件结构和部分组件使用 ZeroyiQ:UGUI 源码笔记(二) ...

最新文章

  1. IBM服务器四大系列解析
  2. Centos 7 安装 Haproxy
  3. Win7下U盘安装Ubuntu14.04双系统步骤详解 | 浏览:42144 | 更新:2014-05-24 18:09 | 标
  4. VTK:可视化之BackgroundTexture
  5. 【Linux】一步一步学Linux——command命令(226)
  6. Xilinx+AWS F1+VP9带来30倍实时转码性能提升
  7. ipad连接电脑_这些应用让iPad生产力分分钟UP
  8. css定位小结 1216
  9. error LNK2019 unresolved external symbol __imp__IoDeleteDevice 错误
  10. SAP License:企业高管眼中的信息化是“万能”的
  11. 汇编笔记1:debug
  12. Hive 不支持 where 子句中的子查询, SQL 常用的 exist in 子句需要改写。这一改写相对简单。考虑以下 SQL 查询语句:
  13. compare的数组升序和降序
  14. FTP上传软件常见错误问题集锦
  15. 百度地图Polyline画直线
  16. 在ArcMap中按村编小班号
  17. 关于Smalltalk,squeak,scratch的学习体验
  18. (一)权限管理系统介绍
  19. 7种情绪,人类心智的通用模块
  20. Linux PCI网卡驱动的详细分析

热门文章

  1. java和python自学教程_一张图片让你明白初学者学Java还是python!
  2. 二分查找算法基本思想
  3. 图像处理基本操作实现工业产品缺陷检测
  4. 强制使用系统键盘 自动锁屏
  5. androidui图形化,Android工程师面试该怎么准备?终局之战
  6. 【Python案例】短视频转动漫效果
  7. sort函数 sorted函数 超详细用法
  8. 校园民谣二十年年祭(下)
  9. 浅绛彩瓷的行情与收藏
  10. 化妆品行业如何在微信朋友圈获客