| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 【Overload游戏引擎】源码分析之十:OvRendering函数库(八) -> 正文阅读 |
|
[游戏开发]【Overload游戏引擎】源码分析之十:OvRendering函数库(八) |
2021SC@SDUSC 目录 2.GetBoundingSphere和ComputeBoundingSphere 在前几节的内容中提到了ModelLoaeder类,本节就正式来讲Model类的内容。 Model与Shader与Texture一样,Model同样在最开始将自身的loader作为友元类,同时我们可以看到所谓的模型(model)就是一系列网格的结合。
一个模型对象需要包括以下几个重要信息:网格(meshes)、材质(material),以及碰撞球(boundingsphere),除此之外作为一个工具类,它还需要模型的存储路径path。 为了存储模型网格,我们需要一个类型为mesh指针的向量,同时还需要一个类型为字符串的向量存储材质的名称。 1.构造与析构
model的构造函数很简单,只需要将模型存储路径赋值给自身的path变量;而析构函数的主要作用就是销毁每一个网格指针,这里用变量mesh遍历网格向量,取出每一个网格对象的指针后delete删除。 2.GetBoundingSphere和ComputeBoundingSphere
获取碰撞球对象的函数返回了自身的碰撞球对象,而要获得这个对象需要调用自身的私有函数ComputeBoundingSphere(),接下来我们就来看看它的详细内容。
最开始需要判断网格的数量,因为可能出现由一个单独网格构成的面片模型,若网格向量的大小为1,则m_boundingSphere 直接赋值为第一个网格的碰撞球对象。 若是其他情况,我们需要进行更复杂的处理,首先为自身的m_boundingSphere赋初值,中心点position等于零向量,半径radius为0。
之后判断网格向量的是否为空,向量空时不做处理;反之开始计算。这里的步骤与计算mesh网格的碰撞盒时类似,首先将std限制的浮点数最大值与最小值分别赋值给最小顶点坐标与最大顶点坐标,注意这里是将最小赋给最大,最大赋给最小。
之后遍历所有网格,先获取当前网格的碰撞盒信息,然后将碰撞盒中心坐标与半径相减,并与上述最小坐标做比较去最小值,用最后的结果更新最小坐标;最大坐标的更新也是类似,但需要将相减改为相加,比较时取最大值。
在遍历了所有网格之后,min会成为距离坐标原点最近的碰撞球表面顶点,max会成为距离坐标原点远的碰撞球表面顶点。得到这些信息,我们构建一个包含所有网格的碰撞球,他的中心点坐标等于(max+min)/2,半径大小等于中心点与最小坐标的距离(也可以是最大坐标)。 本节内容较少,主要是对之前的补充,模型加载的更多内容已在前文【Overload游戏引擎】源码分析之八:OvRendering函数库(六)的ModelLoader中讲过,详细内容可以翻阅。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 20:57:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |