【Cocos Creator小白学习日志:绳子关节】 test00:制作一条柔软可弯曲的绳子(失败)

这里为我尝试写的微信小游戏学习日志。
在此我要说明一下,我是初学者小白,如果有人看见了(没有),不要嘲笑我(逃


今天想用物理引擎实现一个柔软可弯曲的绳子。首选(也不知道还能选啥)当然是用cocos物理引擎的RopeJoint(绳子关节)。

绳子关节的作用是保持两端刚体的距离最大值,简单地说,就是我用绳子关节链接了两个刚体,设置maxLength为50,那么这两个刚体无论怎么运动,其最大距离就是50(可以小于这个距离),就好像有一个绳子连着这两个刚体。

但是要注意,这个绳子是看不见的,是无形的绳子,也就是它没有物理特性。你在绳子运动轨迹上放一个刚体他们是不会发生相互作用的。但是我要做的是一个柔软可弯曲的绳子,所以这个关节满足不了我的需求。那我该怎么办呢?

这时候就要运用到高数学到的微分知识了!

我们把想要的绳子进行微分,将他分为很多小段绳子,每一小段绳子都用RopeJoint链接起来,那么我们的真·绳子就做出来了! 这个想法很好,嗯。

于是我尝试了往层级管理器里面拖了10段小绳子,一个一个把他们连接起来,效果还是不错的。但是如果绳子不够小段,看起来就是方的,那就不像绳子了,所以我们要分地足够小段。那么问题又来了,这么多段总不能全都手动加上去吧,于是我就需要写代码让他自动添加。

我的想法是,先把第一小段绳子固定在一个点上,暂且称这小段绳子为rope0,然后通过JavaScript脚本生成多个复制(绳子)节点,再把这些复制绳子的父节点都设置为rope0,每一个复制绳子都与上一个复制绳子用RopeJoint链接起来。如果成功,那么就大功告成了!

下面看下我的代码。

Rope.js
cc.Class({
    extends: cc.Component,

    properties: {
        length: 0,

        fatherRope:{
            type: cc.Node,
            default: null,
        }
    },

    
    createRope: function()
    {
        var partRope = new Array();
        for(var i=0;i<this.length;i++)
        {
            partRope[i] = cc.instantiate(this.fatherRope);//partRope为复制的一小段绳子节点
            //设置这一小段绳子的父节点,父节点即为第一小段绳子(所有小绳子共用一个父节点)
            this.node.addChild(partRope[i]);
            partRope[i].position = cc.v2(0,0);
            if(i>=1)
                partRope[i].connectedBody = partRope[i-1].getComponent(cc.RigidBody);//每小段绳子都链接到上一段绳子上
        }
    },

    onLoad: function() 
    {
        this.createRope();
    },

});

这个Rope.js我是挂在第一小段绳子上的。属性里面的fartherRope是我拖的一个模板绳子(没用Prefab是因为一开始没想到,后面就懒得改了),length就是小段绳子的数量了,直观地可以理解为最终绳子的长度。



看这代码好像不错(我认为),但是却出了严重问题,根本实现不了。我设置length为200,一运行,所有的小段绳子都挤在那个固定点上,上下跳动,不好形容,反正就是失败了。。。而且我的Intel i7-8750H开始疯狂运算,cpu占用率接近40%,更不要说手机了。。。应该是200个刚体在那一直不停的相互作用导致cpu负担很大。

我也不知道怎么解决,不知道是我的代码有错误还是想法不好。也只是在此记录一下。另外我在百度上也没查到用cocos做条足够柔软绳子的教程。希望以后能解决这个问题。今天也搞了四五个小时了,休息会儿吧。




我已经找到做绳子的方法了,很复杂。。。。但是我的思想是对的,还在学习中。。。

你可能感兴趣的:(学习日志)