CocosCreator3D1.1.0,物理系统BUG

游戏引擎:CocosCreator3D 1.1.0

物理引擎:cannon.js

给地面和cube分别都加上刚体,碰撞器,物理材质(Friction 0.5,Restitution 0.1)

然后在代码中给cube一个偏向Z轴的冲量
let togglerPos: cc.Vec3 = cc.v3(50,0,30);

rigidBody.applyImpulse(togglerPos);

之后cube会因为摩擦力停下,按理说cube如果没有碰到东西移动路径应该是直线,但实际是前半段为直线后半段会自动拐弯…

请大佬帮忙看看

您好,可以提供个demo吗

等等我新建一个给你

NewProject_1.rar (714.0 KB)
demo,使用直接运行,鼠标按住cube随便拖向一个方向,在向靠近X轴或Y轴移动时会不直线移动大概20°到40°之间

收到请回复一下谢谢NewProject_1.rar (714.0 KB)

应该是cannon.js对摩擦处理的不够好

试试把摩擦系数设置为0,阻尼加大一些来做
NewProject_mod.zip (832.3 KB)

1赞

使用线性阻尼不受物体mass属性影响
所以我使用代码动态消减速度:
import * as cc from ‘cc’;
import { CCHELP } from ‘…/…/…/VV/base/utils/CCHELP’;
const { ccclass, property } = cc._decorator;

@ccclass(‘PlayerChess’)
export class PlayerChess extends cc.Component {

private _rigidBody: cc.RigidBodyComponent = null;

public onLoad() {

    this._rigidBody = this.node.getComponent(cc.RigidBodyComponent);
}

public update(dt) {

    let now_V: cc.Vec3 = cc.v3();
    this._rigidBody.getLinearVelocity(now_V);
    let mass:number = this._rigidBody.mass;

    now_V = this.SubNow_V(now_V, dt,mass);
    this._rigidBody.setLinearVelocity(now_V);
}

private SubNow_V(now_V: cc.Vec3, dt: number,mass:number): cc.Vec3 {
    if(now_V.x == 0 ){
        return now_V;
    }
    let subNumber: number = 0.98*(1-dt*mass);
    
    now_V = cc.v3(now_V.x * subNumber, now_V.y, now_V.z * subNumber);
    let vLong: number = CCHELP.GetPosLong_Vect2(now_V.x, now_V.z);
    if (vLong <= 1) {
        now_V = cc.v3(0, now_V.y, 0);
    }
    return now_V;
}

}

1赞