Faked Shadow (假影子) 即用一个平面代表影子, 且紧贴地面, 其朝向与地面的法线一致.
在场景动态角色非常多的情况下, 使用假影子可以大大提高速度.

当前游戏中影子效果图如下:

将一个Faked Shadow封装成一个对象, 继承与 Ogre::Node::Listener,
实现其 nodeUpate(const Node* node) 成员函数.
让其在场景节点坐标改变时通知你,
以更新影子平面的方位.

代码如下:

void FakeShadow::nodeUpdated(const Ogre::Node* node)
{
  //如果位置没有被改变则不需要重新得到地面的法线
  if(m_LastPos != node->getPosition())
  {
    m_LastPos = node->getPosition();
    m_pSceneNode->setPosition(node->getPosition()+Ogre::Vector3(0, 0.05, 0));

Ogre::Vector3 newNormal = getTerrainNormal(node);

//将影子片面旋转到朝向法线
    Ogre::Vector3 s(0, 1, 0);
    Ogre::Quaternion quat = s.getRotationTo(newNormal);
    m_pSceneNode->setOrientation(quat);
  }
}

Ogre::Vector3 FakeShadow::getTerrainNormal(const Ogre::Node* node)
{
  //得到法线策略如下
  //从当前位置周围放出三条射线(近似构成正三角形)
  //得到三个点交点,其构成三角形
  //求其三角形的法线,即位当前位置地形的法线

Ogre::Vector3 originPos1 = node->getPosition() + Ogre::Vector3(0, 1000, 0.5);
  Ogre::Vector3 originPos2 = node->getPosition() + Ogre::Vector3(0.3, 1000, -0.15);
  Ogre::Vector3 originPos3 = node->getPosition() + Ogre::Vector3(-0.3, 1000, -0.15);

Ogre::Vector3 intersectP1 = originPos1;
  Ogre::Vector3 intersectP2 = originPos2;
  Ogre::Vector3 intersectP3 = originPos3;
  intersectP1.y = node->getPosition().y;
  intersectP2.y = node->getPosition().y;
  intersectP3.y = node->getPosition().y;

m_pDScene->intersectWithRay(Ogre::Ray(originPos1, Ogre::Vector3::NEGATIVE_UNIT_Y), intersectP1);
  m_pDScene->intersectWithRay(Ogre::Ray(originPos2, Ogre::Vector3::NEGATIVE_UNIT_Y), intersectP2);
  m_pDScene->intersectWithRay(Ogre::Ray(originPos3, Ogre::Vector3::NEGATIVE_UNIT_Y), intersectP3);

return Ogre::Math::calculateBasicFaceNormal(intersectP1, intersectP2, intersectP3);
}

战场地图上的 Faked Shadow 基本实现相关推荐

  1. 传说之下地图素材_【开阔眼界】地图上的史记——名著轻松读

    购买链接:https://j.youzan.com/Zns-38 我读了无数次<史记>,每次都是读了开头没几页就放弃,文言文看不懂,翻译的白话文内容又太枯燥,现在居然有图画版的史记,还附有 ...

  2. Leaflet工作笔记-GIS地图上构造echarts的3D图

    这里要实现的是这样的效果: 在地图上有一个柱子,3D的,直接显示,而不是使用什么label或者点击,在界面上显示. 原理如下: 1.使用leaflet的marker标签,插入一个html: 2.在这个 ...

  3. 高德地图Web端JavaScript API开发(二)---在地图上绘制(点标注)

    使用高德地图在很多时候需要在地图上标记位置,并且很多时候需要用到自定义的图标去完成这种位置的标记. 当然,这些功能高德地图都为我们准备了,比如常用的地图覆盖物Marker和信息窗体等.这里就先说一下点 ...

  4. java 生成kml文件_如何使用kml文件在地图上绘制路径?

    在上面的代码中,据我所见,您不会将kml数据传递到代码中的任何位置.要显示路由,您应该解析kml数据,即通过SAX解析器,然后在地图上显示路由标记. 请参阅下面的代码中的一个例子,但是它还没有完成-只 ...

  5. Android使用Google Map服务 - 根据GPS信息在地图上定位

    Android使用Google Map服务 - 根据GPS信息在地图上定位 自暑假7月7日开始,到今天的8月7日,整个一个月,我总算是学到了Google Map这部分的内容.原本挺兴奋的,却被注册ap ...

  6. android对图片拉线测量,如何在谷歌地图上绘制线条叠加Android

    我想在我的地图项目上绘制一条线,但无法绘制线条.我在哪里以及如何声明覆盖图?我尝试了各种方法,但无法让它工作.即代码只是在Eclipse中显示错误.我不想做的是画一条从A到B的路线,而是在我移动时绘制 ...

  7. android百度地图轨迹实现,android 获取GPS经纬度在百度地图上绘制轨迹

    实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /** * 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标 ...

  8. java地图上标记_绘制点标记-在地图上绘制-开发指南-Android 地图SDK | 高德地图API...

    点标记用来在地图上标记任何位置,例如用户位置.车辆位置.店铺位置等一切带有位置属性的事物. 地图 SDK 提供的点标记功能包含两大部分,一部分是点(俗称 Marker).另一部分是浮于点上方的信息窗体 ...

  9. WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现...

    原文:WPF技术触屏上的应用系列(二): 嵌入百度地图.API调用及结合本地数据库在地图上进行自定义标点的实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系 ...

最新文章

  1. Linux常用压缩命令
  2. 笔记-高项案例题-2015年下-计算题
  3. C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
  4. 自定义ImageView 实现双击放大缩小还原,无极缩小和旋转及拖动(多机型测试很稳定)
  5. mysql闪回工具下载_MySQL闪回工具之myflash 和 binlog2sql
  6. 【牛客 - 181C】序列(前缀和,二分,可用set维护)(有坑)
  7. http 和 https_Golang设置https访问,以及http如何重定向到https
  8. python爬app_Python爬虫抓取手机APP的传输数据
  9. 【官方速报】Pika3.0正式发布
  10. er图转关系模式规则_ER模型怎么画?快速绘制ER模型操作方法分享
  11. java使用BZip算法压缩解压缩文件、数据流、byte[]字节数组
  12. cad添加自己线性_如何自定义自己需要的CAD线型?
  13. 如何把模糊照片变清晰把相片变高清修图#ps教程#ps学习视频
  14. 离散信号(七)| 离散傅里叶变换(DFT)推导
  15. crmphp_PHP开源CRM-推荐几个
  16. 1050ti比1050强多少 gtx1050和gtx1050ti差距大吗
  17. 漫谈直播:从零开始认识直播并快速搭建专属直播平台
  18. 如何分辨iphone 的冷屏与暖屏
  19. 用R画出染色体修饰图谱--超详细版本
  20. python读取数据的函数详解_python之文件读写详解

热门文章

  1. IDM下载器下载百度网盘文件
  2. Monash call:概述生物特征识别
  3. python猴子分桃子的数学题_小学奥数猴子分桃练习及答案【三篇】
  4. html 拼图游戏,HTML5人物拼图游戏
  5. 渝北统景碑口规划开发_渝北区碑口水库主体工程开建
  6. [转]深度学习在目标跟踪中的应用
  7. table表格竖列横排显示
  8. 学习Nisy作者c语言教程笔记1
  9. 【土旦】 使用Vant 的Uploader 上传图片 重定义返回格式 使用FormData格式提交
  10. 对不起,我们公司不招35岁的人