Box2D-Lite源码阅读笔记(4)_ARTELE的博客-程序员秘密

技术标签: 源码阅读  物理引擎  Box2D-Lite  Box2D  Box2D-Lite源码阅读  

0.简介

前面我们发现了物体碰撞检测的函数,这回我将来读物体碰撞检测函数的代码。

1.碰撞检测

这个碰撞检测主要是针对矩形与矩形的碰撞检测,以为例子中只给了矩形的物理碰撞。这里先对开始部分做一个阅读和注释。

这段代码是一些准备工作,主要目的是获取物体在空间中的姿态和基本位置信息。

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;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ARTELE/article/details/109897074

智能推荐

android 闪退分析,Android TimeoutException闪退记录及解决_weixin_39593519的博客-程序员秘密

此问题在oppo R9 系列的手机出现较多,而且主要集中在Android 5.1-6.0的手机系统。TimeoutException,在Android 系统里会出现下面这些,在释放资源时,因耗时导致的,可能不是10s,可能会是20s,30s,60s,120s。具体跟手机有关。android.database.CursorWindow.finalize() timed out after 10 se...

servicemanager之启动过程_servicemanager to start with server name:controlin_fanxiaoyu321的博客-程序员秘密

相关代码文件如下:代码路径说明frameworks/native/cmds/servicemanager/service_manager.cservicemanager守护进程启动文件frameworks/native/cmds/servicemanager/binder.cservicemanager在实现时,并没有引用libbinder库,所以将一些和binde...

数组中存放的多个十六进制数合并成一个十六进制数,并转换成十进制(整形)_两个16进制合并_没有简介的我的博客-程序员秘密

利用的就是计算机存储的特性,需要注意大小端1.char sDec[4] = {0x05,0xc5,0xb3,0xea};低字节序的情况下. 并且 int 占用 32bit. char sDec[4] = {0x05,0xc5,0xb3,0xea};int val = 0;char *pBuf = (char*)&val;pBuf[0] = sDec[3];pBuf[1] = sDec[2];pBuf[2] = sDec[1];pBuf[3] = sDec[0];这时val=

Mysql 大批量删除数据(解决方案)_主键批量删除30万数据会锁表吗_三少说的博客-程序员秘密

Mysql 大批量删除数据参考微信公众号《Java自学之路》在业务场景要求高的数据库中,对于单条删除或者更新的操作,在delete和update后面加上limit1是个好习惯。我在工作中看到有同事这样写,如果想要了解具体细节,请参考Mysql全面总结为什么这样做?比如在执行删除中,如果第一条就命中了删除行,如果Sql中有limit1;这时候就直接return了,否则还会执行完全表扫描才return。如果表的数据量大,会做很多无用功。那么我们讨论下如果删除大数据量的sql,能否用limit达到

74HC595_chuannaoxuan4674的博客-程序员秘密

介绍 不管你是在玩树莓派还是Arduino或者其他的板子,都可能会遇到GPIO口不够用的情况,这时候怎么办呢?你需要利用一个寄存器来把你的GPIO扩展了。 本文介绍的是74HC595这个型号的寄存器。 SN74HC595N是德州仪器公司生产的集成电路芯片,是一个8位串行输入变串行输出...

JS实现多行文本框内容换行保存,换行展示_多行文本框换行符_笑在余生的博客-程序员秘密

1.在保存多行文本框内容的时候,默认是无法保存换行符的,首先,在js中对文本内容的换行符进行特殊处理。var content = $('#content').val().replace(/\n/g,"<br/>");2.从数据库查询出多行文本框保存的内容后,再对换行符进行特殊处理,并赋值给多行文本框。var content;//由数据库获取的数据var reg=new...

随便推点

总结解决 Android-Studio 编译耗时(好久、太长)问题_weixin_30346033的博客-程序员秘密

首先通过搜索有关Android-Studio 编译耗时(好久、太长)问题的博客,速度确实有所改善。一、暂时解决 Android-Studio 编译耗时(好久、太长)问题本文链接:https://blog.csdn.net/u012827205/article/details/78338829简单描述一下我遇到的问题2017年10月24日下午6点之前我的 android stu...

追书神器破解版_风萧萧兮易水寒!的博客-程序员秘密

现在追书神器更新的,看小说需要花钱的,现在介绍苹果(ios)破解版的给大家各位手机最好先越狱,否则,用不了这个软件,越狱之后,可以用过PP助手安装在手机至于如何越狱,本人就不介绍了,自己百度吧下载网址:http://www.zsgtdc.cn/listData.php?id=53

面试必问Elasticsearch倒排索引原理_weixin_34072637的博客-程序员秘密

本文摘抄自我的微信公众号“程序员柯南”,欢迎关注!原文阅读倒排索引是目前搜索引擎公司对搜索引擎最常用的存储方式,也是搜索引擎的核心内容,在搜索引擎的实际应用中,有时需要按照关键字的某些值查找记录,所以是按照关键字建立索引,这个索引就被称为倒排索引。首先你要明确,索引这东西,一般是用于提高查询效率的。举个最简单的例子,已知有5个文本文件,需要我们去查某个单词位于哪个文本文件中,最直观的做法就是挨...

Lsyncd本地文件复制到远程机器_Brent-CCNU的博客-程序员秘密

1. 设置ssh免密登录主机A免密登录到主机B# 登录A主机,生成密钥对ssh-keygen -t rsa# 将公钥复制到B主机ssh-copy-id -i .ssh/id_rsa.pub [email protected]. 安装lsyncd# 安装repo文件wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo...

杂项_H_Gragon的博客-程序员秘密

1 button并无target属性,但且可以通过javascript实现。具体是:在单击button事件中添加 Page.RegisterStartupScript("js", "window.open('xxx.aspx','main','',false); ");。xxx.apsx是你要显示的页面,main是你框架取的name,id名!2 asp.net中数字不够六位补0: in

dataframe的字符类型dtypes为什么是object,而不是str?_dtypes中的object_wang603603的博客-程序员秘密

data = pd.DataFrame({"A": [True, False, True], "B": [1.1, 2.2, 3.33], "C": ["c1", "c2", "c3"] })print("data : \n", data.

推荐文章

热门文章

相关标签