Box2D淌坑日记: 如何正确的设置角度

对刚体角度设置的唯一函数是

SetTransform

然而,这个函数不会对传入的角度作任何处理,因此,如果你试图设置一个角度,并应用一个revoluteJoint时,可能会出现问题。

我在实践中碰到的问题是,我通过其他方式计算出了当前角度,将角度设上,按照设想,刚体应该做一个小角度的摆动,没想到它摆动了一周之后才回到终点,也就是说多摆动了1周。

之后我通过打log,发现问题出在jointAngle上。当判断upper和lower角度限制时,revoluteJoint计算了当前角度

aB - aA - referenceAngle

而这个角度计算出来的是-6.3,难怪旋转了一周。

于是我顺藤摸瓜,发现最初设置角度时,使用的是SetTransform,而这个函数并未对传入的角度做修正。因此,这个步骤需要自己做。

怎么做才合适呢?如下是我现在使用的办法:
b2Rot rot = b2Rot(angle);

angle = rot.GetAngle();

这个函数将调用std::atan2来计算出在一个固定区间内的角度。只要在SetTransform设置角度前确保了角度在0-2pi 或者-pi-pi内,就不会有问题了

时间: 2025-01-23 22:10:07

Box2D淌坑日记: 如何正确的设置角度的相关文章

Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)

关节在Box2D的对象组织结构中,与b2Body(刚体)并列.因此两种对象都是由b2World创建并直接管理. 然而Joint有依赖于b2Body的地方,就是它的销毁:当关节所涉及到的刚体被销毁,关节也会被销毁.此时再访问关节指针,将得到一个错误,因此,在销毁body的时候应该遍历其涉及到的Joint并销毁之. 除此之外,可算是并列于b2Body的b2World另一大组成成分.我们就得到了这么一个物理世界:有一堆刚体,也有一堆关节.这一堆刚体根据物理定律运行,这一堆关节限制或驱动某些刚体的运动.

Cocos2dx淌坑日记:粒子系统PositionType的正确使用

Cocos2dx中的粒子系统,有三种定位方式,对应于不同需求. 之前我有一个想做的效果,是类似彗星的扫尾.但是当父节点也就是CCLayer跟着物体移动的时候,发现尾巴并没有跟随CCLayer移动,而是保持之前的屏幕位置.此时还以为出了bug,百思不得其解,进去查代码,发现是通过visit访问的,也就是说应用了上层父亲的transform,那为什么不跟着CCLayer走呢? 之后才发现,原来是PositionType设置导致的结果: kCCPositionTypeFree 这个是默认的设置.在这个

WindowsPhone&Windows8.1&Windows8&Unity3d 填坑日记

近期的游戏开发大体上接近尾声,总结了不少关于Unity3d面向Windows几大平台开发时遇到的各种坑以及怎样填坑的经验.总的来说,Windows8.1 Windows8/RT以及WindowsPhone这几个平台的开发人员很的少,文档也很的有限.甚至于MSDN的文档写的也是不清不楚.所以我认为有必要用一系列的文章具体的和大家分享一下. 这一篇仅仅是一个文件夹,先介绍一下我要写的一些部分: 1. Unity项目导出至各个平台注意事项. 2. API不兼容问题以及怎样解决. 3. Windows8

SpringBoot踩坑日记-定时任务不定时了?

问题描述br/>springboot定时任务用起来大家应该都会用,加两注解,加点配置就可以运行.但是如果仅仅处在应用层面的话,有很多内在的问题开发中可能难以察觉.话不多说,我先用一种极度夸张的手法,描述一下遇到的一个问题.@Componentpublic class ScheduleTest {@Scheduled(initialDelay = 1000,fixedRate = 2*1000)public void test_a(){System.out.println("123"

米忽悠踩坑日记-1

米忽悠踩坑日记-1            --知不足,而后进 进入米哈游差不多一个半月了,就以刚刚上线的某个任务作为节点写一篇踩坑日记吧. 1.安全意识,尽量考虑到玩家各种奇奇怪怪的操作以及有可能想刷道具的行为. 2.日志方面,记录玩家的每一步操作,成功或者失败,需要记录清楚,uid,region以及其他的信息,如奖励的ID,更新一次游戏玩家数据也记录 3.在写代码时候不要总想着先实现逻辑再来优化结构,因为一个小任务的代码量不一定少,而且任务排的很紧,如果不从一开始就保持良好的结构自己看起来简直

vue 组件传值踩坑日记 1

今天在用平时很少用到的传值方式,是V2.4以后新加入属性$attrs $listener 以及inheritAttrs. 总结:这样形式的代码适合套娃模式的组件传递,却不适合兄弟组件的传值,那样的传值方式,需要创建一个事件总线,说白了就是新new一个空的vue,详见,我的第二篇日志<vue 组件传值踩坑日记 2> 废话不多说,直接上代码,大家可以边看注释边测试一下效果吧 <!DOCTYPE html> <html lang="en"> <hea

前端系列——jquery前端国际化解决方案“填坑日记”

前言:最近,新的平台还没有开发完成,原来的老项目又提出了新的需求:系统国际化.如果是前后端完全分离的开发模式,要做国际化,真的太简单了,有现成的解决方案,基于Node构建的时下热门的任何一种技术选型都有成熟的方案,比如: vue + vue-i18n angular + angular-translate react + react-intl 但现在的情况是老的项目并没有使用这类架构.说起国际化,博主几年前就做过,在MVC里面实现国际化有通用的解决方案,主要就是通过资源文件的方式定义多语言.最初

AI相关 TensorFlow -卷积神经网络 踩坑日记之一

上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是google开源出来的人工智能库,由python语言写的 官网地址:http://www.tensorflow.org/   请用科学上网访问 中文地址:http://www.tensorfly.cn/ 当然还有其他AI库,不过大多数都是由python 写的 .net 的AI库叫 Accord.net

Emacs之爬坑日记(一)

实习看到导师神一般地使用Emacs,飞速操作,深深被震惊.以前早有耳闻,也去折腾过一段时间,但是没发现什么好玩的,没有传说中那样的神,那日一件,感叹自己功力还是不够啊,很多事情都是这样,没经历过就没有实质的感觉,就没有体会,即”阅历“. Emacs以高度自定义化而著称,内部使用emacs lisp作为配置脚本语言,Lisp,久负盛名的一门函数式语言,自己也很喜欢,可惜曲高和寡,不过因为她我认识了Java系里的Clojure,这也是后话了,下面直入主题吧. Emacs在Linux下和Windows