请教个关于碰撞或者也算是穿透的问题

需要实现的功能是物体随鼠标的移动改变旋转的角度,当碰到其他物体时,会阻挡齐旋转,往其他方向还可以正常拖动
遇到的问题:
1.如果我用碰撞,然后在move中计算角度直接给赋值angle,会出现穿透现象
如图5vlmf-on34g
2.如果用刚体的话,会出现被挤出去的情况,因为不能设置两个物体都是static,所以被点击的物体type为dynamic,所以会被挤出去,如图
Screen-2024-02-22-192224
想要的功能就是简单被挡住不让往旁边移动就行,当鼠标拉回来的时候 还可以继续往没被阻挡的方向旋转
大佬们给点思路

方案1,自己修正结果。

好的,我试一下

不要物理碰撞,直接判断是否相交效率最高

如果都是这种矩形或者规则图形,直接算是否相交,矩形相交判断有现场的api.

您说的通过rect去计算是否相交是么

嗯嗯,确实应该是不用物理的,需要去通过代码计算比较好,我得试一下

是的 :smirk:

不要在move中判断 应该在update中判断

你需要的不只是判断是否碰撞,而是算出2个矩形交点坐标P,然后计算P与锚点A的角度赋值给angle
用下面3个函数可以算出交点坐标
//计算向量ab和ac的叉积
cross(ax: number, ay: number, bx: number, by: number, cx: number, cy: number): number {
return (ax - bx) * (ay - cy) - (ay - by) * (ax - cx);
}
//计算线段ab和cd的交点坐标,不相交返回null
intersectionLineLine(ax: number, ay: number, bx: number, by: number, cx: number, cy: number, dx: number, dy: number): cc.Vec2 {
let deltX = ax - bx;
let deltY = ay - by;
let abc = deltX * (ay - cy) - deltY * (ax - cx);
let abd = deltX * (ay - dy) - deltY * (ax - dx);
if (abc * abd > 0) return null;
let cda = (cx - dx) * (cy - ay) - (cy - dy) * (cx - ax);
let cdb = cda + abc - abd;
if (cda * cdb > 0) return null;
let ratio = cda / (abd - abc);
return cc.v2(ax - deltX * ratio, ay - deltY * ratio);
}
//计算向量ab与矩形rect的首个交点,不相交返回null,rect是顶点数组,每2个数代表一个顶点坐标
intersectionLineRect(ax: number, ay: number, bx: number, by: number, rect: number[]): cc.Vec2 {
let distance = 1e8;
let id = 0;
//找出矩形离a最近的顶点p,判断ab在ap的哪一侧,从而确定首次相交于哪条边
for (let i = 0; i < 8; i += 2) {
let deltX = rect[i] - ax;
let deltY = rect[i + 1] - ay;
let dis = deltX * deltX + deltY * deltY;
if (dis < distance) {
distance = dis;
id = i;
}
}
let isClockwise = this.cross(rect[0], rect[1], rect[2], rect[3], rect[4], rect[5]) < 0;
let id1 = this.cross(ax, ay, bx, by, rect[id], rect[id + 1]) < 0 !== isClockwise ? (id + 6) & 7 : (id + 2) & 7;
return this.intersectionLineLine(ax, ay, bx, by, rect[id], rect[id + 1], rect[id1], rect[id1 + 1]);
}

1赞

虽然一大堆,看着有点迷,但是看注释好像是我需要的写法,哈哈哈,谢谢了,我去试试

move和update都会穿透,这个好像是没办法避免的,只能判断角度是否穿透,如果穿透的话,赋值所能达到的那个角度

你要模拟是真实世界发生的事情旋转=就是时间x角速度。 不会穿透的 你物体没那么快的

不是通过角速度驱动的,是直接设置angle的值来赋值的 所以才会穿透,如果是通过角速度驱动就没这个问题了,现在不是特别想用角速度和刚体这块,角速度驱动没有跟随鼠标那么自然

大佬~ 这个位置限制 穿透 你是怎么处理的 ~

算角度,限制物体可以移动的范围,不过我虽然写出来了,但是还是有一些角度转换的一系列问题,还是有点迷 哈哈