这几天我跟一个大佬在合作,然后我们俩都不太会数学哈哈。
最近想搞个物理爆炸的效果,把周围的东西炸飞,于是做出了这个效果。
我这里的计算原理可能跟其他游戏不太一样,不过效果感觉还可以,应该是最简单的实现方式了。
原理是:
我们获取炸弹的坐标,再获取被炸物体的坐标。
物体的坐标 - 炸弹的坐标 = 两者之间的距离
这样计算下来,只要炸弹的位置在左边,炸弹的坐标就肯定小于物体的坐标,这样减出来的结果就一定是整数,所以它会往右飞!
我们直接单独拿一个X轴来算,假如炸弹现在的X坐标=0,而物体在坐标X=3,
这时用 物体x - 炸弹x 得出 物体和炸弹之间的距离。
得到距离了就可以给他做衰减计算了,我想让物体里炸弹越近,它受到的爆炸力越大。
我们假设炸弹爆炸范围最大=10。用 爆炸范围最大距离 - 物体和炸弹的距离 = 剩下的爆炸冲力
这时候数值就反过来了,物体离炸弹越近,受到的冲力就越大!
这时候还有点小问题,假如炸弹的坐标是负数呢?
10 - -1 = 11,它的距离是11,变成正数,方向就错了,所以我们还得给它个判定。
如果 距离 < 0:我们用 -冲击力 - 距离。 -10 减 -1=? -11,负数往左飞了。
就是物体和炸弹的距离是负数,我们就用 “负爆炸距离” 减 “距离”
如果物体和炸弹的距离是正数,我们就用 “正爆炸距离” 减 “距离”。
这个爆炸距离也可以当做爆炸强度来使用,因为判断被炸到的物体是哪些要用到范围判断。
判断方式有很多方法,我这里用了节点 Area 。
下面是详细:
#新建一个变量,名字自己取把:
var 爆炸力 = 30
给炸弹弄一个Area节点,加上碰撞箱用来当做炸弹能炸到的范围。
然后用节点信号来获取接触的物体发送到炸弹身上:
炸弹身上的脚本,检测所有进入范围的刚体:
给进入范围的所有物体加入数组:Bodys ← 自己起的数组名
超出范围的物体就给它挪出数组,让他不被计算到。
那么进入Bodys数组里的物体就可以用 上面的计算来给物体施加一个方向力了。
将炸弹爆炸之后计算出来的爆炸结果给物体加上:
利用这个方法↓: 给物体施加一个方向力(适用于刚体类节点)
apply_central_impulse()
#数组名.apply_central_impulse(算出的方向力结果)↓
Bodys.apply_central_impulse(Distance)
给数组里的物体施加一个方向力,这个方向力的力度就是:爆炸力 -(物体坐标 - 炸弹坐标)
最后的最后:
用Area判断范围的话,就算隔着墙壁也会被炸到,可以选择用射线来判断最近物体,
但是纯用射线的话计算出整个球体的全方向发射位置又会太吃性能,于是就想到了一个办法。
我们用范围先获取所有可以被炸到物体,然后再单独向这些物体发射射线(因为射线只能射到最近的物体)
,然后排除掉没有被射线射到的物体,剩下的就是可以被炸飞的物体了。
小小分享,非专业~
最近想搞个物理爆炸的效果,把周围的东西炸飞,于是做出了这个效果。
我这里的计算原理可能跟其他游戏不太一样,不过效果感觉还可以,应该是最简单的实现方式了。
原理是:
我们获取炸弹的坐标,再获取被炸物体的坐标。
物体的坐标 - 炸弹的坐标 = 两者之间的距离
这样计算下来,只要炸弹的位置在左边,炸弹的坐标就肯定小于物体的坐标,这样减出来的结果就一定是整数,所以它会往右飞!
我们直接单独拿一个X轴来算,假如炸弹现在的X坐标=0,而物体在坐标X=3,
这时用 物体x - 炸弹x 得出 物体和炸弹之间的距离。
得到距离了就可以给他做衰减计算了,我想让物体里炸弹越近,它受到的爆炸力越大。
我们假设炸弹爆炸范围最大=10。用 爆炸范围最大距离 - 物体和炸弹的距离 = 剩下的爆炸冲力
这时候数值就反过来了,物体离炸弹越近,受到的冲力就越大!
这时候还有点小问题,假如炸弹的坐标是负数呢?
10 - -1 = 11,它的距离是11,变成正数,方向就错了,所以我们还得给它个判定。
如果 距离 < 0:我们用 -冲击力 - 距离。 -10 减 -1=? -11,负数往左飞了。
就是物体和炸弹的距离是负数,我们就用 “负爆炸距离” 减 “距离”
如果物体和炸弹的距离是正数,我们就用 “正爆炸距离” 减 “距离”。
这个爆炸距离也可以当做爆炸强度来使用,因为判断被炸到的物体是哪些要用到范围判断。
判断方式有很多方法,我这里用了节点 Area 。
下面是详细:
#新建一个变量,名字自己取把:
var 爆炸力 = 30
给炸弹弄一个Area节点,加上碰撞箱用来当做炸弹能炸到的范围。
然后用节点信号来获取接触的物体发送到炸弹身上:
炸弹身上的脚本,检测所有进入范围的刚体:
给进入范围的所有物体加入数组:Bodys ← 自己起的数组名
超出范围的物体就给它挪出数组,让他不被计算到。
那么进入Bodys数组里的物体就可以用 上面的计算来给物体施加一个方向力了。
将炸弹爆炸之后计算出来的爆炸结果给物体加上:
利用这个方法↓: 给物体施加一个方向力(适用于刚体类节点)
apply_central_impulse()
#数组名.apply_central_impulse(算出的方向力结果)↓
Bodys.apply_central_impulse(Distance)
给数组里的物体施加一个方向力,这个方向力的力度就是:爆炸力 -(物体坐标 - 炸弹坐标)
最后的最后:
用Area判断范围的话,就算隔着墙壁也会被炸到,可以选择用射线来判断最近物体,
但是纯用射线的话计算出整个球体的全方向发射位置又会太吃性能,于是就想到了一个办法。
我们用范围先获取所有可以被炸到物体,然后再单独向这些物体发射射线(因为射线只能射到最近的物体)
,然后排除掉没有被射线射到的物体,剩下的就是可以被炸飞的物体了。
小小分享,非专业~