毕业论文
计算机论文
经济论文
生物论文
数学论文
物理论文
机械论文
新闻传播论文
音乐舞蹈论文
法学论文
文学论文
材料科学
英语论文
日语论文
化学论文
自动化
管理论文
艺术论文
会计论文
土木工程
电子通信
食品科学
教学论文
医学论文
体育论文
论文下载
研究现状
任务书
开题报告
外文文献翻译
文献综述
范文
基于OpenGVS的虚拟汽车驾驶模拟系统的开发(10)
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 );//重新设置汽车的姿态角
共11页:
上一页
1
2
3
4
5
6
7
8
9
10
11
下一页
上一篇:
MATLAB雷达有源干扰建模与仿真+文献综述
下一篇:
Multisim在电子电路分析中的应用研究
认知无线电网络中基于双...
基于TCP/IP技术的转向架振动测试系统设计
基于PM2.5浓度的健康出行路径规划及实现
基于涡旋电磁波的新型雷达成像技术研究
基于相关滤波器的长期跟踪算法研究
基于ZigBee协议轨道交通环...
变分模态分解方法研究及...
《醉青春》导演作品阐述
中国古代秘书擅权的发展和恶变
国内外无刷直流电动机研究现状
浅谈传统人文精神茬大學...
谷度酒庄消费者回访调查问卷表
辩护律师的作证义务和保...
拉力采集上位机软件开发任务书
多元化刑事简易程序构建探讨【9365字】
高校网球场馆运营管理初探【1805字】
浅谈新形势下妇产科护理...