技术标签: 源码阅读 物理引擎 Box2D-Lite Box2D Box2D-Lite源码阅读
前面我们发现了物体碰撞检测的函数,这回我将来读物体碰撞检测函数的代码。
这个碰撞检测主要是针对矩形与矩形的碰撞检测,以为例子中只给了矩形的物理碰撞。这里先对开始部分做一个阅读和注释。
这段代码是一些准备工作,主要目的是获取物体在空间中的姿态和基本位置信息。
int Collide(Contact* contacts, Body* bodyA, Body* bodyB)
{
// Setup
//取A B两个物体的半径,width中存储的是边长
//这里获取到的是一半的长度,也可以认为是在
//矩形自身的坐标系下的第一象限的点,自身坐标系以矩形中心为(0,0)点
//那么hA和hB是右上角第一象限的点
Vec2 hA = 0.5f * bodyA->width;
Vec2 hB = 0.5f * bodyB->width;
//取A B两个物体的世界坐标,物体本身坐标是自身的局部坐标
//position存储的就是物体在实际世界坐标的位置,这里的世界坐标就是
//我们认为的全局屏幕坐标,也是我们实际看到的坐标
Vec2 posA = bodyA->position;
Vec2 posB = bodyB->position;
//获取A B两个物体旋转角,然后构造成旋转矩阵
//因为是二维空间中的旋转,所以矩阵是2x2的,
//而且矩阵构造好了后直接就是正交矩阵,正交矩阵的
//转置就是其逆
Mat22 RotA(bodyA->rotation), RotB(bodyB->rotation);
//将两个旋转矩阵转置,这样能直接得到逆矩阵,矩阵本身就是正交矩形
//如果向量a乘以矩阵RotA,就是将a从自己的局部坐标系A变换到世界坐标,
//变换后的a在乘以RotBT就是将a变换到局部坐标系B下。最终的效果就是将
//向量a从A坐标系变换到B坐标系下。
Mat22 RotAT = RotA.Transpose();
Mat22 RotBT = RotB.Transpose();
Vec2 dp = posB - posA;//两个物体的中心点做差,得到的就是两个矩形中心连线的向量
//中心连线分别乘以物体各自的逆矩阵,
//就会将连线向量dp变换到各自的局部坐标系下
Vec2 dA = RotAT * dp;
Vec2 dB = RotBT * dp;
...
...
return 0;
}
文章浏览阅读152次。给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1:输入: “A”输出: 1示例 2:输入: “AB”输出: 28示例 3:输入: “ZY”输出: 701其实就是26进制转10进制class Solution {public: int titleToNumber(string s) { int_计算excel的列序号c++
文章浏览阅读729次。Bug fix release : otp_src_R15B01Build date : 2012-04-02This is R15B01, the first maintenance release for the R15B major release.You can find the README file for the release at http_otp_src_r15b01.tar.gz
文章浏览阅读2.7k次,点赞2次,收藏3次。在上篇文章《[哈希值和可变性Hash value and mutability](https://blog.csdn.net/wumingxiaoyao/article/details/108912543)》最后说到 set 去重问题,所以这篇主要是通过实践来研究一下 set 去重背后的故事,当然也是参考了网上一些资料得到了一些启发,感谢那些陌生的喜欢分享的博友们。想了解更多 Python 基础序列文章,请参考 [Python 基础系列大纲](https://blog.csdn.net/wumingxia_python set 底层如何去掉重复元素原理 数组去重
文章浏览阅读3.9k次,点赞6次,收藏37次。你好_r语言grf包
文章浏览阅读2.8k次。//Ax+by+cz=Dvoid cvFitPlane(const CvMat* points, float* plane){// Estimate geometric centroid.int nrows = points->rows;int ncols = points->cols;int type = points->type;CvMat* centroid =..._opencv光平面标定
文章浏览阅读891次。我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。但在多线程情况下,就不行了。下面介绍三种方法(1)getGeneratedKeys()方法:程序片断:Connectionconn=...;Serializable ret = null;PreparedStatementstat..._qt 自增编号
文章浏览阅读1.3k次,点赞35次,收藏26次。在现代Web架构中,NGINX以其高性能、稳定性和灵活性而广受青睐。本文将深入探讨NGINX中的两个核心功能:URL重写和反向代理,以帮助您更好地理解和配置这些强大的特性。_nginx set指令
文章浏览阅读2.3w次,点赞27次,收藏138次。HTTP1.0、HTTP2.0、HTTP 3.0及HTTPS简要介绍1 HTTP1.0及HTTPSHTTP 建立之初,是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。但随着CSS,Javascript的出现,以及移动互联时代的到来,我们不得不对HTTP进行不断地优化。HTTP优化:影响一个 HTTP 网络请求的因素主要有两个方面:带宽和延迟。随着网络基础建设的完善,带宽因素已经不需要再考虑,仅需要考虑的就是延迟。延迟主要受三个方面影响:浏览器阻塞(HOL blocking_http1.0
文章浏览阅读1.8k次。ros与arduino串口通信c++写在最前安装serial库编写arduino串口通信程序编写ros节点端口号配置配置CmakeLists.txt文件编译整个ROS工程运行节点后记写在最前串口通信在嵌入式领域的重要性我也就不多说了, 这里的ros与arduino串口通信的方案, 同样适合于stm32, 51单片机等各种芯片. 这里与rosserial有区别, rosserial是基于某种类..._c++ rosserial
文章浏览阅读6.3k次,点赞11次,收藏44次。高频面经汇总:https://blog.csdn.net/qq_40262372/article/details/1160755288.1Spring相关 面试题总结8.1.1什么是Spring框架?Spring是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。目的:解决企业应用开发的复杂性功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能范围:任何Java应用简单来说,Spring是一个轻量级的控制反转(IoC)和面向切..._spring,springmvc,springboot面试题
文章浏览阅读1k次。首先对于MX25L3233F型号Flash。指令部分先不说,我先介绍Flash大小换算和擦除部分。首先,我们先明确下此Flash为32M Bit,也就是4M Byte。在文章开头概括时会介绍Flash有多少个扇区对应多大的Byte、多少个块对应多大的Byte。比如这里写到的是总共1024个扇区,每隔扇区4K Byte。所以这里这么计算,就跟Flash大小对应起来了:1024*4(K By..._flash中 bytes和byte
文章浏览阅读2.1w次,点赞35次,收藏53次。目录 学习JAVA也有一段时间了,对于输出等腰三角这个需求,刚看到时也时一头雾水,不知道如何下手,没有实现的具体思路;但想来需要使用循环,那就先写个程序大体框架吧,使用EClipse建立一个工程,先命名为“HelloWorld”的吧(当然这是一个简单的程序,大家随便用一个文本编辑器新建一个java文件,手工一步步写也可以),然后新建一个class类文件并建立main主函数;并先..._java用while循环写等腰三角形