driving_speed = max_driving_speed * cursor.y * cursor.y * cursor.y;//控制速度
rotation = max_rotation * cursor.x * cursor.x * cursor.x;//控制方向
sts = vehicle_drive( own_vehicle, driving_speed, -rotation*G_DEG_TO_RAD );//调用汽车行驶函数
/将当前属性赋值给汽车/
position_record.x += driving_speed * sinf( -vehicle_rot.y );//x坐标
position_record.z += driving_speed * -cosf( -vehicle_rot.y );//z坐标
rotation_record.y += turning_speed;//方向旋度
GV_obi_set_position( vehicle, &position_record );//重新赋值汽车位置
GV_obi_set_rotation( vehicle, &rotation_record );//重新赋值汽车姿态角
4.4 碰撞检测
碰撞检测技术在3D游戏中至关重要,好的碰撞检测技术要求人物在场景中可以平滑移动,遇到一定高度内的台阶可以自动上去,而过高的台阶则把人挡住,遇到斜率较小的斜坡可以上去,斜率过大则把人挡住,在各种前进方向被挡住的情况下都要尽可能地让人物沿合理的方向滑动而不是被迫停下。在满足这些要求的同时还要做到足够精确和稳定,防止人物在特殊情况下穿墙而掉出场景。
本系统运用了两种碰撞检测,一种是两点之间连线是否有碰撞,一种是两个物体是否有碰撞。前者使用函数GV_geo_inq_intersection( scene, &p0, &p1, type_mask,exclude, &data);后者使用函数GV_geo_inq_obi_collision( GV_Obi object1, GV_Obi object2, G_Boolean * collision_out )。这两个函数的功能是有很大不同的,所以使用的环境不一样。两点之间连线碰撞检测是为了是汽车能够贴地行驶,所以不断会调用这个函数,其内存空间占用的也不会大。而两物体之间的碰撞检测实际上是检测物体的包围盒是否有交集,这个运算量是很大的,所以只能对少数物体碰撞检测使用,不能广泛运用。
4.4.1 汽车贴地行驶
OpenGVS中提供两点之间的碰撞检测函数GV_geo_inq_intersection( scene, &p0, &p1, type_mask,exclude, &data);通过不断调用这个碰撞检测函数,汽车可以实时的贴着地面行驶。汽车贴着地面行驶的基本原理是,将汽车的四个轮子看成三个点。前面两个点(与汽车前进方向分别成45度,负45度),后面一个点(与前进方向成180度),这样就确定了一个面。这三个点分别向地面发射一条射线,函数GV_geo_inq_intersection就是为了获得这三点的坐标。在程序中具体调用函数GV_geo_inq_intersection( scene,&point2,&vector_down, isc_geo_mask, EXCLUDED, &isc_data );其中isc_data记录碰撞点的信息,并将它传给碰撞点。再通过函数GV_geo_inq_face_orientation()获得该处地面的姿态角,重复三次获得三个点的坐标及姿态角。取这三个点高度的均值,赋给汽车,从而得到汽车的重心高度。同时对姿态角取均值,赋给汽车,那么汽车的前进方向也就可知了。
在回调函数own_vehicle_sim_callback()中控制汽车贴地行驶,这样就控制汽车贴地行驶了。
其关键代码为:
GV_geo_inq_intersection( own_data->scene, &point1,
&vector_down, isc_geo_mask, EXCLUDED, &isc_data );//检测两个点之间的连线是否有碰撞发生
position.y = ( point1.y + point2.y + point3.y ) / 3.0f;//通过刚才确定出来的三点计算汽车的当前高度
rotation.x = ( rot1.x + rot2.x + rot3.x ) / 3.0f;
rotation.z = ( rot1.z + rot2.z + rot3.z ) / 3.0f;
GV_obi_set_rotation_x( own_data->model, rotation.x );//重新设置汽车的坐标
GV_obi_set_rotation_z( own_data->model, rotation.z );//重新设置汽车的姿态角 基于OpenGVS的虚拟汽车驾驶模拟系统的开发(10):http://www.751com.cn/tongxin/lunwen_1612.html