查看: 2019|回复: 2
打印 上一主题 下一主题

【Flare3D创建黄色星球】添加互动功能和定义光线方向_步骤4

[复制链接]

5472

主题

6

听众

1万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
76544
精华
23

活跃会员 荣誉管理 突出贡献 优秀版主 论坛元老

跳转到指定楼层
楼主
发表于 2013-3-3 10:29:39 |只看该作者 |倒序浏览
步骤 4:添加互动功能和定义光线方向
YellowPlanet_04.as 包含本节描述的代码。
在本节中,你将学习一些用于将互动性引入到游戏的概念。
首先,让我们探讨一下游戏如何管理用户的输入。 Flare3D 包含一些你可以使用的工具,它们能够在游戏播放过程中快速地管理键盘和鼠标输入信息。
在该类中,Input3D.keyDown() 方法可以用于检测按下的键。该方法在按下一个键时将返回一个 ***e 值。此外,该工具还包含 Input3D.keyHit() 方法,它类似于keyDown,但只返回一次 ***e 值。
本范例项目中的另一个值得研究的有趣概念是光线的使用。光线是虚拟的并且长度无限,它可以从任一点开始沿着某个方向无限延伸。
在无限延伸之前,光线能够测试游戏中的一个对象是否相交。 如果测试的结果是可靠的,则光线将提供关于碰撞的附加信息,其中包括 mesh、碰撞的确切点、被碰撞面部的法线等信息。
本范例项目将使用光线效果,因为宇航员在保持与球形地面对齐的同时需要不断地在球形地面上奔跑。 光线用于完成两个任务(参见图9)。
图9. 光线能够将宇航员角色与 3D 环境的地面对齐
在本例中,环境的 stage 基本上是一个球体。 如有必要,你可以使用其它方法让宇航员保持与该球体对齐,但光线的作用很大,因为它们能够用于不均匀的表面。
使用 new RayCollision() 方法创建光线
使用下行代码创建一个新的 RayCollision:ray = new RayCollision();
使用 ray.addCollisionWith( object ) 方法添加对象以便对光线进行测试
下面代码将添加行星的地面以便利用光线测试碰撞效果:ray.addCollisionWith( planet.getChildByName( "floor" ), false );

第二个参数("false")表示只能利用地面检测碰撞(丢弃地面的child)。 使用 ray.test( from, direction ) 方法测试光线碰撞通过在光线起始的位置设置一个点开始测试。 这一位置应该不会与宇航员的位置完全一致,因为它与地面如此靠近,以致光线无法与任何物体相交。 相反,设置一个位置稍高的点,例如 (0,100,0),然后使用 localToGlobal 将该点转换为世界坐标(world coordinate)。在定义光线起始点之后,下一个任务是为它提供方向。 该方向应该向下指向宇航员的方向。 你可以使用 Pivot3D 的 getDown() 方法获取该矢量。
//define ray’s start pointvar from:Vector3D = container.localToGlobal( newVector3D( 0, 100, 0 ) );//define ray’s directionvar dir:Vector3D = container.getDown();// Test the ray.if ( ray.test( from, dir ) ){      // ray collision is ***e.      …使用收到的碰撞信息在上节中,你已经了解如何测试何时光线碰撞返回 ***e 值。 光线碰撞信息已经可用并且你可以将它用于游戏逻辑。 该信息是以特定的结构储存的。 你可以使用 CollisionInfo 对象来解析收到的信息。在下面代码中,注意一下你如何才能获取位置 (info.point.x、info.point.y、info.point.z) 和标准方位 (info.normal) 信息。
  // Test the ray.if ( ray.test( from, dir ) ){     // Get the info of the first collision.     var info:CollisionInfo = ray.data[0];    // Set the astronaut container at thecollision point.    container.setPosition( info.point.x,info.point.y, info.point.z );    // Align the astronaut container to thecollision normal.     container.setNormalOrientation( info.normal,0.05 );
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

无效楼层,该帖已经被删除

0

主题

1

听众

2458

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-2-22 15:25:52 |只看该作者
好东西啊,感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-24 00:56 , Processed in 0.093237 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部