APP下载

基于Havok引擎的物理碰撞与检测技术的研究与实现

2021-11-03林海

现代信息科技 2021年8期

DOI:10.19850/j.cnki.2096-4706.2021.08.034

摘  要:在Director开发平台下首先对Havok引擎进行初始化,其次设置场景中的重力、模型质量、刚体等各方面的属性,通过Havok引擎模拟真实的物理碰撞。最后对刚体与刚体、刚体与非刚体的碰撞检测进行分析研究,得出结论:基于Havok引擎的物理碰撞与检测技术在Director开发平台下适合游戏开发、模拟复杂的物理现象等虚拟现实的制作。

关键词:刚体;Havok引擎;碰撞检测

中图分类号:TP391.9      文献标识码:A 文章编号:2096-4706(2021)08-0122-03

Research and Implementation of Physical Collision and Detection Technology Based on Havok Engine

LIN Hai

(Zhanjiang Preschool Education College,Zhanjiang  524084,China)

Abstract:Under the Director development platform,the Havok engine is initialized firstly,and then the gravity,model quality,rigid body and other attributes in the scene are set. The Havok engine simulates real physical collisions. Finally,the collision detection between rigid body and rigid body,rigid body and non-rigid body is analyzed and researched,and it is concluded that the physical collision and detection technology based on Havok engine is suitable for virtual reality production such as game development and simulation of complex physical phenomena under the Director development platform.

Keywords:rigid body;Havok engine;collision detection

0  引  言

近年来,碰撞与检测技术[1,2]已经越来越成为三维虚拟现实、机器人、动画仿真等领域研究的热点,在目前成功的商业3D虚拟现实项目中,普遍采用的碰撞检测是BSP树与包装盒相结合的方式。

基于BSP树[3]的碰撞检测主要应用于复杂形态模型的精确的碰撞检测,但它需要很长的预处理时间,因此不适合加载时运算,BSP划分经常会产生比原多边形数多三到四倍的多边形,即使不用保存颜色、法线、uv等物体信息也要增加将近一倍的内存容量。

基于包装盒的碰撞检测[4],主要应用于简单形態或者可以视其为简单形态的模型碰撞检测。采用一个正方体或者球型体包裹住3D物体对象整体来代表物体,用于描述区域,之后根据描述区域的位置与距离等信息来检测是否发生碰撞。

碰撞检测技术[5]已成为计算几何、计算机动画、仿真机器人、CAD/CAM、3D游戏开发、物理仿真等领域中的一个热点问题,而日趋复杂的虚拟环境的真实感和实时性对碰撞检测提出了更高的要求,比如,虚拟人物在场景中可以自由移动,当遇到一定高度内的障碍物能够走上去,而过高的障碍物则不能行走,遇到较小的斜坡可以走上去,陡坡过大则把人挡住,无法继续行走。在各种前进方向被挡住的情况下,都要尽可能地让人物沿合理的方向行走而不是直接卡住。满足这些要求的同时,还要注意防止人物在某种检测不到的情况下穿墙或掉出场景以外的区域。

本文以Director为开发平台,实现Havok物理引擎的加载,并采用BSP树及包装盒方式的碰撞检测技术,对场景建构以及对象的碰撞与检测进行研究。

1  Havok Physics物理引擎简介

Havok物理引擎全称为Havok Game Dynamics,SDK,中文名为Havok游戏动力开发包。它将物理运动定律引入到虚拟场景中,增加了项目的交互性和互动性,内置了物理碰撞检测函数,方便了游戏的开发。目前应用广泛的物理引擎有Havok的Havok Physics物理引擎和NVIDIA的PhysX引擎,其中Havok Physics物理引擎是物理模拟计算引擎界的领军者。

2  Director软件简介

Director是由美国Adobe公司开发的一款用于多媒体项目开发的功能全面的软件。广泛应用于CAI教学课件、网络交互式等多媒体查询系统、企业多媒体形象展示。Director有丰富的第三方工具集,比如数据库插件,可以制作数据库管理软件等。其强大的Shockwave 3D引擎[6],能开发出生动形象的3D游戏。

3  构建基于Havok引擎的真实的物理碰撞场景

Havok Physics开发中,首先需要定义各种不同的角色(actor),并对每个角色的形状(shape)属性和刚体(body)属性进行设置;最后,把这些角色都加入到场景(scene)空间中,这样就能构造出一个完整的虚拟实现世界。刚体可分为固定刚体、活动刚体两类,固定刚体受到碰撞后不可动,活动刚体受到碰撞后将产生相应的运动。

本文以公路作为Havok物理引擎测试场景,设定2部汽车为活动刚体,公路和基围栏为固定刚体研究Havok物理引擎各种的碰撞检测和检测机制。

3.1  导入3DMAX场景模型

在3D MAX中制作出基础场景模型后,导出为Shockwave 3D场景,生成扩展名为W3D的文件,在Director直接导入该文件,生成一个Shockwave 3D角色,如图1所示。

在图1中,小轿车为用户可控制的车辆,名称为“car”;出租车为静止的车辆,名称为“car2”;画面右上角的红色半透明面为路标检测,用于判断车辆是否通过该面,名称为“pla”。

3.2  设置虚拟场景的Havok属性

3.2.1  設置Havok初始参数

在Havok整合初步计算阶段,进行物理对象的一些初始物理状态的初始化,包括重力、场景模型等各项信息,为后面的运算做准备。主要语句为:

pMember = member(1)  --3D场景角色编号

pHavok = member(2)  -- pHavok场景角色编号

pHavok.initialize(pMember,1,1)–havok环境与Shockwave 3D环境通过初始化而建立连接,从而使在havok环境中的模拟运算可以影响Shockwave 3D模型。

phavok.gravity = vector( 0, 0, -386 )

--pHavok为场景的矢量重力大小,-386为向下的重力,值越大,刚体下落速度越快;值越小,刚体下落速度越慢。

3.2.2  设置各模型的刚体属性

刚体与常规表面不同,在模拟过程中,刚体会发生碰撞而不是彼此穿插。

小轿车模型的刚体属性设置语句为:

pCar=pHavok.makeMovableRigidBody(“car”,1000)

说明:设置小轿车为活动刚体,质量为1000Kg,模拟了真实小轿车的重量,碰撞检测方式为BSP树。

出租车模型的刚体属性设置语句为:

pHavok.makeMovableRigidBody(“car”,1000, true, #box)

说明:设置出租车为活动刚体,设置为活动刚体,1000Kg,碰撞检测方式为包装盒。

公路和路基的刚体属性设置为固体刚体设置语句为:pHavok.makeFixedRigidBody(“Highway”,false)。

路标检测的平面由于允许刚体穿越,所以不设置为刚体

3.2.3  虚拟场景的真实模拟

加入帧脚本事件,开始虚拟场景的真实模拟。语句为:

on exitframe me

pHavok.step()--开始模拟

end

3.2.4  控制小轿车的行驶

Havok为Director用户提供了方便的角色控制行为库,可以通过简单的Drive model行为实现小轿车的模拟驾驶。图2为Drive model行为的设置。

设置好行为后,小轿车可通过→、←、↑、↓四个方向键来控制汽车的行驶。

经过以上的几步设置,小轿车已经具备刚体属性已经可以在虚拟场景的公路中自由行驶,可以和其它刚体产生真实的碰撞效果而不会彼此穿越了。

4  Havok引擎物理碰撞检测技术的应用

4.1  刚体与刚体的碰撞检测

刚体与刚体的碰撞检测应用范围广泛,如:交通事故模拟、虚拟装配、虚拟场景漫游等。刚体的碰撞检测主要通过registerInterest函数实现。RegisterInterest将事件与模型绑定,当模型发生碰撞时呼叫它。

registerStepCallback是一个注册碰撞检测的处理程序,将在每一个物理模拟的副步(sub step)被呼叫一次。它通过精灵脚本事件进行注册。本实例中主要检测黄色小轿车的碰撞,注册处理语句为:

pHavok.registerInterest( pCar.name, #all, 0, 0, #collisionHandler, me )

说明:pCar为小轿车刚体对象。检测所有的刚体碰撞对象。

pHavok.registerStepCallback( #controlCharacter, me )

说明:将碰撞检测的结果发回controlCharacter子程序中,将返回一个名称为details的数组列表,再通过if语句来判断在碰撞对象中是否有黄色小轿车“car2”的存在,语句为:

if chars(details[2],1,3)="car2" then

put details[2]

end if

4.2  刚体与非刚体的碰撞检测

刚体与非刚体产生碰撞后可以穿透非刚体对象,常用于一些路标检测等监测刚体是否到达指区域而又不影响刚体运动的情况,如赛车游戏中,对赛车通过路段的检测。

首先要制作一个刚体的子对象,该子对象一直跟随主刚体,但不设置为刚体属性,只用于非刚体的碰撞检测。该子象的设置语句为:

member("aaa").model("car2dl").parent=member("aaa").model("car2")

其次,开启子对象”car2dl”的碰撞检测,语句为:member("aaa").model(rwd).collision.enabled = true

最后,注册碰撞检测处理程序,语句为:

member("aaa").model("car2dl").collision.setCollisionCallback ( #mCollide, me )

说明:将碰撞检测的结果发回mCollide子程序中,将返回一个名称为collisionData的对象,再通过collisionData.modelB来判断是否与子对象“car2dl”产生碰撞,语句为:

tWaypoint=collisionData.modelB

tName=tWaypoint.name

put tName

5  结  论

在Director开发平台下首先通过pHavok.initialize语句实现Havok引擎的初始化,再设置场景中的重力,模型质量、刚体等各方面的属性,最后通过pHavok.step()语句开始模拟真实的物理碰撞。在碰撞发生后通过pHavok.registerInterest语句实现刚体与刚体的碰撞检测,通过collision.setCollisionCallback语句实现刚体与非刚体的碰撞检测。基于Havok引擎的物理碰撞与检测技术在Director开发平台下的应用具有开发步骤简便,效率高的特点,适合游戏开发、模拟复杂的物理现象等虚拟现实的制作。

参考文献:

[1] 李政峰,王青霞,肖昱锋.Unity3D碰撞检测技术在电力设备虚拟装配中的应用 [J].科学技术创新,2020(30):104-105.

[2] 张森森,金国栋,王五桂,等.船舶操纵模拟器三维视景场景构建及碰撞检测 [J].船电技术,2020,40(S1):24–27.

[3] 孙巍,刘金义.基于物体级BSP树的大规模室外场景渲染 [J].微处理机,2010,31(6):67–70+74.

[4] 陈华.确定任意形状物体最小包围盒的一种方法 [J].工程图学学报,2010,31(2):49–53.

[5] 曲慧雁.复杂虚拟环境下的快速碰撞检测技术研究 [D].长春:吉林大学,2020.

[6] 罗立宏,谭夏梅.基于ShockWave3D的Web虚拟现实技术研究 [J].科技资讯,2007(4):101–102.

作者简介:林海(1976.10—),男,汉族,广东湛江人,讲师,本科,研究方向:虚拟现实技术,人工智能。

收稿日期:2021-03-05

课题项目:湛江幼兒师范专科学校校级课题(2019ZYCQ33)