发现一个物理引擎的一个奇怪的问题0.0

这里我在物理世界中,创建了一条线,用的chainshape,可以看到这个线会随着重力往下掉,这一块是没问题的。

但是!!! 它就这么横在这上面了,这个重力分布是不是有点问题?还是我写的姿势不对???
这是创建的代码
let body = this.m_penNode.getComponent(cc.RigidBody);
body.type = 2;
let collider = this.m_penNode.getComponent(cc.PhysicsChainCollider);
collider.points = this.curPenPosData;
collider.friction = 1;
collider.apply()

顶一下,有人知道为什么么~~~~

这个有demo吗,发下我帮你看看,刚才在群里看到你发的图:grinning:

NewProject_1.zip (480.0 KB)

最简单的demo了,完全没有任何逻辑代码。。。

稍等,看一下的

我刚才试了一下,可以试着给cc.PhysicsChainCollider加一点弹性restitution,并且加一下线的密度,现在这个线太轻了,稍微有点摩擦力就粘在一起了,试下行不行

应该不是这个问题,你看我这边上面放了个动态的方块,掉下来,线只是往右边动了一下。。。

这个就看上去很怪了。。。

线是动态的,但是碰撞与重力都很奇怪,完全没有角度变化

你这个线需要像柔软的绳子吗,还是要不可变的形状呢,稍等再看一下

不可变的形状。。。

chain本来就做不到你的效果,chain是没质量的

/// Chains have zero mass.
/// @see b2Shape::ComputeMass
        b2ChainShape.prototype.ComputeMass = function (massData, density) {
            massData.mass = 0;
            massData.center.SetZero();
            massData.I = 0;
        };

我之前感觉也是。。。诶,之前忘了去翻一下源码了。。。百度也没相关说明

NewProject_2.zip (513.3 KB)我用多边形碰撞体弄了一下,物理引擎是用碰撞体面积和密度计算质量的,你可以写一个转换方法将你画的线转换为一个多边形碰撞体的顶点,效果应该就正常了

画线可以用PolygonCollider,论坛里有帖子的,你可以搜一下

之前刚好写过一个画线物理游戏,你可以参考下

var PTM_RATIO = cc.PhysicsManager.PTM_RATIO;

/**
 * @class PhysicsLineCollider
 * @extends PhysicsCollider
 * @uses Collider.Polygon
 */
var PhysicsLineCollider = cc.Class({
    //name: 'PhysicsLineCollider',
    extends: cc.PhysicsCollider,
    mixins: [cc.Collider.Polygon],

    properties: {
        lineWidth: 5,
    },

    editor: {
        menu: CC_EDITOR && 'i18n:MAIN_MENU.component.physics/Collider/Polygon',
        //inspector: CC_EDITOR && 'packages://inspector/inspectors/comps/physics/points-base-collider.js',
        requireComponent: cc.RigidBody
    },

    _createShape: function (scale) {
        
        var shapes = [];

        var polys = this.points;

        var offset = this.offset;

        var polyIdx = 0;
        for (var i = 0; i < polys.length - 1; i++) {
            var posBegin = polys[i];
            var posEnd = polys[i+1];
            
            var linelen = posBegin.sub(posEnd).mag();

            var angle = Math.atan2(posEnd.y - posBegin.y,posEnd.x - posBegin.x) - Math.PI / 2;

            var midPos = posBegin.add(posEnd).mul(0.5);

            var shape = new b2.PolygonShape();

            if(posBegin.equals(posEnd)){
                cc.error('Failed to create shape, posBegin and posEnd is same!');
                continue
            }

            if (shape) {
                shape.SetAsBox(this.lineWidth / 2 / PTM_RATIO * scale.x, linelen / 2 / PTM_RATIO * scale.y, new b2.Vec2(midPos.x / PTM_RATIO * scale.x, midPos.y / PTM_RATIO * scale.y), angle);
                shapes.push(shape);
            }
        }

        return shapes;
    }
});

module.exports = PhysicsLineCollider;

调用:

let collider = path.node.addComponent(PhysicsLineCollider)
collider.lineWidth = "线的宽度";
collider.points ="线段连接的点的集合,点距离不能太小,太小构成多边形的时候会有问题";
1赞

是的,多边形的这个是肯定可以用的。。。
之前做的时候,发现多边形的效率不如chain shape。。。现在看来只能用这个了