使用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. python 写入excel_使用python将数据写入excel
  2. python能绘制统计图吗-特征锦囊:常用的统计图在Python里怎么画?
  3. python三:if...else
  4. 用户注册 - 判断用户名存在
  5. flink写入iceberg(没有搞完)
  6. C语言转义字符的使用
  7. C#LeetCode刷题之#258-各位相加(Add Digits)
  8. FCS省选模拟赛 Day7
  9. 骑马与砍杀服务器修复,骑马与砍杀21.3.1公共版和热修说明 修复联机模式
  10. postgresql 连接超时_关于超时:如何自动关闭PostgreSQL中的空闲连接?
  11. 动易SiteFactory数据采集模块
  12. sqlserver sql行专列_Sqlserver 列转行 行转列
  13. Java垃圾回收机制知识点总结
  14. eclipse:设置maven本地仓库
  15. PIC单片机c语言休眠,PIC16F72 休眠程序
  16. 阿尔伯塔大学计算机科学是哪个校区,阿尔伯塔大学优势专业是什么?
  17. 山东计算机技校排名,山东技校排名前十 山东有什么好的技校
  18. IE浏览器将于明年6月“退役”,程序员和IE的爱恨情仇终结了
  19. HBase MOB特性介绍
  20. 深圳大学数学文化赏析MOOC答案

热门文章

  1. ossimplanet编译,修改操作器及其他
  2. squid服务器的使用配置
  3. 【深度学习】——过拟合的处理方法
  4. JUnit5学习之六:参数化测试(Parameterized Tests)基础
  5. 华为OD笔试202010OD笔试华为OD第二题最长的非递减连续子序列的长度
  6. vue项目检测IE浏览器版本,版本太低给出提示
  7. 华为云IoT智慧物流案例01 | 背景介绍与环境搭建
  8. flutter 让TextFeild可以根据输入法上移
  9. 网站打开的慢是什么原因呢?
  10. 一文入门HTML+CSS+JS(样例后续更新)