模型贴花
来源:互联网 发布:网络发票号码 编辑:程序博客网 时间:2024/04/30 00:25
地形贴花,CreateMeshDecal()只创建一次,之后每次调用SetMeshDecal()。
/**
* @Function: CreateMeshDecal
* @Description: 创建模型贴花Mesh,此Mesh只被创建一次
*/
void CMap::CreateMeshDecal(void)
{
m_pMeshDecal = new Ogre::ManualObject("MeshDecal");
m_pSceneManager->getRootSceneNode()->attachObject(m_pMeshDecal); // 挂在根节点
int x_size = 4; // 在X方向的多边形数量
int z_size = 4; // 在Z方向的多边形数量
// 此Mesh所使用的材质,用三角形带创建Mesh
m_pMeshDecal->begin("Crosshairs", Ogre::RenderOperation::OT_TRIANGLE_LIST);
for (int i = 0; i <= x_size; i++)
{
for (int j = 0; j <= z_size; j++)
{
// 添加一个顶点
m_pMeshDecal->position(Ogre::Vector3(i, 0, j));
// 为这个顶点定义纹理坐标
m_pMeshDecal->textureCoord((float)i / (float)x_size, (float)j / (float)z_size);
}
}
for (int i = 0; i < x_size; i++)
{
for (int j = 0; j < z_size; j++)
{
// 通过顶点索引建立四边形(4*4),(x_size + 1)是一行上的顶点数
// quad只用于三角形带
m_pMeshDecal->quad(
i * (x_size + 1) + j, // 左上
i * (x_size + 1) + j + 1, // 右上
(i + 1) * (x_size + 1) + j + 1, // 右下
(i + 1) * (x_size + 1) + j // 左下
);
}
}
m_pMeshDecal->end();
}
============================================================================
/**
* @Function: SetMeshDecal
* @Description: 设置模型贴花到指定位置
* @Param x: 坐标
* @Param z:
* @Param rad: 半径
*/
void CMap::SetMeshDecal(Ogre::Real x, Ogre::Real z, Ogre::Real rad)
{
Ogre::Real x1 = x - rad; // 左下角坐标
Ogre::Real z1 = z - rad;
int x_size = 4; // 在X方向的多边形数量
int z_size = 4;
Ogre::Real x_step = (rad * 2) / x_size; // 每个四边形的宽、高
Ogre::Real z_step = (rad * 2) / z_size;
// 更新地形贴花Mesh
m_pMeshDecal->beginUpdate(0);
for (int i = 0; i <= x_size; i++)
{
for (int j = 0; j <= z_size; j++)
{
// 根据地形高度更新顶点位置
m_pMeshDecal->position(Ogre::Vector3(x1, GetTerrainHeight(x1, z1) + 1, z1));
m_pMeshDecal->textureCoord((float)i / (float)x_size, (float)j / (float)z_size);
z1 += z_step; // 列中每行
}
x1 += x_step; // 行中每列
z1 = z - rad;
}
// 更新四边形
for (int i = 0; i < x_size; i++)
{
for (int j = 0; j < z_size; j++)
{
m_pMeshDecal->quad(
i * (x_size + 1) + j, // 左下
i * (x_size + 1) + j + 1, // 左上
(i + 1) * (x_size + 1) + j + 1, // 右上
(i + 1) * (x_size + 1) + j); // 右下
}
}
m_pMeshDecal->end();
}
============================================================================
/**
* @Function: GetTerrainHeight
* @Description: 获得地形高度
* @Param x: 坐标
* @Param z:
* @Return: 高度
*/
Real CMap::GetTerrainHeight(Real x, Real z)
{
// 设置光线的起始位置为人物上方5000高度
m_UpdateRay.setOrigin(Vector3(x, 5000.0f, z));
// 设置光线的方向为Y轴负方向
m_UpdateRay.setDirection(Vector3::NEGATIVE_UNIT_Y);
m_pRaySceneQuery->setRay(m_UpdateRay); // 设置用于光线追踪的光线
RaySceneQueryResult& result = m_pRaySceneQuery->execute(); // 获得搜索结果
RaySceneQueryResult::iterator itr;
for(itr = result.begin(); itr != result.end(); itr++)
{
if (itr->worldFragment) // 如果是地形
{
return itr->worldFragment->singleIntersection.y;
}
}
return 0;
}
- 模型贴花
- 模型贴花
- 贴花
- 使用投影纹理进行模型贴花(Mesh Decals)
- 使用投影纹理进行模型贴花(Mesh Decals)
- 贴花分类
- 投影贴花
- Ogre贴花
- Ogre贴花
- Ogre中的贴花
- Deferred Decal(延迟贴花)
- Deferred Decal(延迟贴花)
- 虚幻4 贴花
- unity 溶解贴花编辑器
- 贴花编辑器实现细节
- Ogitor 场景编辑器之贴花
- (41)Decal [ 贴花] Actor
- 30+简约时尚的Macbook贴花
- 盘点:论坛达人必备的网络英文词汇
- 动态纹理
- 粒子系统的范围和更新
- ADO操作Ms SQL2000时游标问题
- 物理standby主备库的手工切换步骤
- 模型贴花
- 父窗体于子窗体调用,设置标签禁用
- 英语新词:开“夜车” all-nighter 隐性收入 hidden income
- Oracle千万条记录插入与查询小结
- 投影贴花
- 【转】 基于主键的重定义表,解决delete日志表产生的碎片问题
- 网络营销策略内幕
- 英语新词:近视相亲 nearsighted date 世博园 expo garden
- UI线程消息处理过程