战场地图上的 Faked Shadow 基本实现
在场景动态角色非常多的情况下, 使用假影子可以大大提高速度.
当前游戏中影子效果图如下:
将一个Faked Shadow封装成一个对象, 继承与 Ogre::Node::Listener,
实现其 nodeUpate(const 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 基本实现相关推荐
- 传说之下地图素材_【开阔眼界】地图上的史记——名著轻松读
购买链接:https://j.youzan.com/Zns-38 我读了无数次<史记>,每次都是读了开头没几页就放弃,文言文看不懂,翻译的白话文内容又太枯燥,现在居然有图画版的史记,还附有 ...
- Leaflet工作笔记-GIS地图上构造echarts的3D图
这里要实现的是这样的效果: 在地图上有一个柱子,3D的,直接显示,而不是使用什么label或者点击,在界面上显示. 原理如下: 1.使用leaflet的marker标签,插入一个html: 2.在这个 ...
- 高德地图Web端JavaScript API开发(二)---在地图上绘制(点标注)
使用高德地图在很多时候需要在地图上标记位置,并且很多时候需要用到自定义的图标去完成这种位置的标记. 当然,这些功能高德地图都为我们准备了,比如常用的地图覆盖物Marker和信息窗体等.这里就先说一下点 ...
- java 生成kml文件_如何使用kml文件在地图上绘制路径?
在上面的代码中,据我所见,您不会将kml数据传递到代码中的任何位置.要显示路由,您应该解析kml数据,即通过SAX解析器,然后在地图上显示路由标记. 请参阅下面的代码中的一个例子,但是它还没有完成-只 ...
- Android使用Google Map服务 - 根据GPS信息在地图上定位
Android使用Google Map服务 - 根据GPS信息在地图上定位 自暑假7月7日开始,到今天的8月7日,整个一个月,我总算是学到了Google Map这部分的内容.原本挺兴奋的,却被注册ap ...
- android对图片拉线测量,如何在谷歌地图上绘制线条叠加Android
我想在我的地图项目上绘制一条线,但无法绘制线条.我在哪里以及如何声明覆盖图?我尝试了各种方法,但无法让它工作.即代码只是在Eclipse中显示错误.我不想做的是画一条从A到B的路线,而是在我移动时绘制 ...
- android百度地图轨迹实现,android 获取GPS经纬度在百度地图上绘制轨迹
实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /** * 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标 ...
- java地图上标记_绘制点标记-在地图上绘制-开发指南-Android 地图SDK | 高德地图API...
点标记用来在地图上标记任何位置,例如用户位置.车辆位置.店铺位置等一切带有位置属性的事物. 地图 SDK 提供的点标记功能包含两大部分,一部分是点(俗称 Marker).另一部分是浮于点上方的信息窗体 ...
- WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现...
原文:WPF技术触屏上的应用系列(二): 嵌入百度地图.API调用及结合本地数据库在地图上进行自定义标点的实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系 ...
最新文章
- Linux常用压缩命令
- 笔记-高项案例题-2015年下-计算题
- C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
- 自定义ImageView 实现双击放大缩小还原,无极缩小和旋转及拖动(多机型测试很稳定)
- mysql闪回工具下载_MySQL闪回工具之myflash 和 binlog2sql
- 【牛客 - 181C】序列(前缀和,二分,可用set维护)(有坑)
- http 和 https_Golang设置https访问,以及http如何重定向到https
- python爬app_Python爬虫抓取手机APP的传输数据
- 【官方速报】Pika3.0正式发布
- er图转关系模式规则_ER模型怎么画?快速绘制ER模型操作方法分享
- java使用BZip算法压缩解压缩文件、数据流、byte[]字节数组
- cad添加自己线性_如何自定义自己需要的CAD线型?
- 如何把模糊照片变清晰把相片变高清修图#ps教程#ps学习视频
- 离散信号(七)| 离散傅里叶变换(DFT)推导
- crmphp_PHP开源CRM-推荐几个
- 1050ti比1050强多少 gtx1050和gtx1050ti差距大吗
- 漫谈直播:从零开始认识直播并快速搭建专属直播平台
- 如何分辨iphone 的冷屏与暖屏
- 用R画出染色体修饰图谱--超详细版本
- python读取数据的函数详解_python之文件读写详解