51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2687|回复: 0
打印 上一主题 下一主题

Havok测试

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2008-1-10 17:54:30 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    前段时间挖掘了一下以前HalfLife2的泄漏代码,发现了尽然有Havok的全部代码,真是太开心了,可知道Havok是业界著名的软件模拟物理引擎,被普遍用在很多游戏中以提高游戏真实感,而HalfLife2就使用了Havok技术,而其泄漏代码也包含了这些Havok技术。
    为此特地花了一个下午研究了一下Havok,发现它同我以前使用的PhysX物理引擎差不多,至少概念和使用方法基本类似,所以特别写了一个Demo测试下Havok的性能,Demo很简单就是模拟200个盒子从50米的高度下落的自由落体运动,代码写起来也很简单,核心代码不过以下部分:

    IVP_Environment_Manager *env_mgr;
    env_mgr=IVP_Environment_Manager::get_environment_manager();
    IVP_Application_Environment app_env;
    g_HKEnv=env_mgr->create_environment(&app_env,0,0);
    if(!g_HKEnv)
    return S_FALSE;
    //设置环境的重力为垂直向下9.81
    IVP_U_Point g(0.0f,-9.81f,0.0f);
    g_HKEnv->set_gravity(&g); IVP_U_Point boxVert[8];
    IVP_U_Vector<IVP_U_Point> points;
    for (int offset=0,z=-1; z<=1; z+=2) {
    for (int y=-1; y<=1; y+=2) {
    for (int x=-1; x<=1; x+=2) {
    boxVert[offset].set(2*x, 2*y, 2*z);
    points.add(&boxVert[offset++]);
    }
    }
    } IVP_Compact_Surface *boxSurface =
    IVP_SurfaceBuilder_Pointsoup::convert_pointsoup_to_compact_surface(&points); IVP_SurfaceManager *boxSM =
    new IVP_SurfaceManager_Polygon(boxSurface);
    for(int n=0;n<totalBallCount;n++)
    {
    IVP_Template_Real_Object template_real_object;
    template_real_object.mass = 1.0; // the object's mass (unit: kg)
    template_real_object.material = new IVP_Material_Simple(0.7, 0.6); IVP_U_Quat direction;
    direction.init(); // default orientation
    IVP_U_Point position(0.0+sinf(n)*30, 50.0+n*5, 30.0); g_box[n] = g_HKEnv->create_polygon(boxSM,
    &template_real_object, &direction, &position); //box需要碰撞检查
    g_box[n]->enable_collision_detection();
    //box需要参与模拟
    g_box[n]->ensure_in_simulation(); // immediately revive object
    } IVP_U_Point floorVert[8];
    points.clear();
    for (int offset=0,z=-1; z<=1; z+=2) {
    for (int y=-1; y<=1; y+=2) {
    for (int x=-1; x<=1; x+=2) {
    floorVert[offset].set(50*x, 0.5*y-15, 50*z);
    points.add(&floorVert[offset++]);
    }
    }
    } IVP_Compact_Surface *compact_surface =
    IVP_SurfaceBuilder_Pointsoup::convert_pointsoup_to_compact_surface(&points); IVP_SurfaceManager *surface_manager =
    new IVP_SurfaceManager_Polygon(compact_surface); IVP_Template_Real_Object template_real_object;
    template_real_object.mass = 1.0;
    template_real_object.material = new IVP_Material_Simple(0.7, 0.6);
    // friction, elasticity
    template_real_object.set_name("cube"); // optional name
    template_real_object.physical_unmoveable = IVP_TRUE;
    // object is unmoveable IVP_U_Quat direction;
    direction.init(); // default orientation
    IVP_U_Point position(0.0, 0.0, 50.0); // the sphere's position // within the physical g_floor = g_HKEnv->create_polygon(surface_manager,
    &template_real_object, &direction, &position); g_floor->enable_collision_detection();
    g_floor->ensure_in_simulation(); // immediately revive object  这样就可以了,剩下的事情havok会自动计算以后所有盒子的状态、位置等,下面是这个demo的截图,可以看到所有的盒子都动起来了:
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 06:11 , Processed in 0.069417 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表