ObiRope的一些笔记

之前用ObiRope做的两个小功能,分别是绳子剪裁以及绳子拖拽。但是项目没做完,公司黄了,记录一下相关的笔记。

ObiRope下载
链接:https://pan.baidu.com/s/1D6330eonD4SALxTOJ2a_bg
提取码:hg2o


ObiRope
在这里插入图片描述
这个是控制绳子的生成器,需要挂在ObiSolver下进行。需要挂在目标蓝图,使用了相同蓝图,EditPath所有的ObiRope都会一起发生修改。

在这里插入图片描述

使用EditPath可以修改绳子的初始形状,并且这个修改不是针对单个ObiRope而是针对ObiRope使用的蓝图。
通过增加控制点,可以让绳子分成X个段落,并且控制点可以合其他组件进行联动,控制绳子样式。控制点除了控制绳子的粒子位置,还能控制粒子方向其中name是用来在Attachment下的Group的一个表示,Phase则是物理相关,相同的Phase的对象不会触发物理,而不相同的对象则会触发物理。

在这里插入图片描述
ThickNess控制粒子大小,表示于物理以及渲染
Resolution粒子间隔,1为0间隔。数值越小,间隔越大
PooledParticles为备用粒子,用延长绳子,而初始的粒子数则受限于你拉的控制点长度和Resolution


Obi Particle Attachment

这是一个控制绳子上粒子组固定对象的一个组件,Target为这个粒子组会放在这个Transform上,并且响应相关的效果。Static表示这个点是固定的,绳子并不会被这个东西拉动,反而会被这个东西固定起来。

如果是Dynamic的话则这个点会受到物理效果,物体的重力绳子会对这个挂在的Target产生物理效果,但是Target需要有刚体,并且刚体不是静止的。

只要一动绑上一段的的Transform就可以对绳子进行移动了


ObiCursor
在这里插入图片描述
这个组件可以控制绳子的伸长缩短,虽然不加的时候,拉取绳子两段的Attachment绑定的也会拉长绳子,但是这时候绳子只是被【拉伸】不是被【延长】,并且里面的粒子排布会变宽,就会造成穿透等现象。
使用Cursor,可以【延长】绳子,调用它自己的 cursor.ChangeLength(length);的方法,可以调整绳子的长短,并且这个延长,增加绳子的粒子。会在SourceMu调整粒子和CursorMu来调整绳子吐出来的地方和绳子收回去的地方。
在这里插入图片描述
但是这个Cursor新增的粒子会受到蓝图的PooledParticles的粒子总数控制,超过这个总数的粒子,就不会继续延长,而是变成【拉伸】


    restLength = rope.restLength;			//稳定下来的时候的长度
    length = rope.CalculateLength();	//现在绳子的长度
    element = rope.elements.Count;		//element的个数
    partical = rope.particleCount;			//这个绳子现在有多少个粒子
    绳子

通过上面参数可以获取到当前绳子的相关状况,RestLength实则为你绳子长度,除了使用cursor.ChangeLength(length)进行长度修改之外,普通的拉伸控制点距离是不会让这个数值改变的。

CalculateLength(); 这是会计算并返回现在绳子的实际长度,这个数会把你拉伸之后的长度给复制进去

element,实则是粒子组,为是一个数据结构,有这两个粒子在总一个池子里面的索引,以及他们之间的距离所组成的一个数据结构


切割

ObiRope实际上的粒子是在Solver上进行计算的,而并不是由ObiRope进行一个处理,而一般粒子都是通过Solver粒子组的所以所表示

    [System.Serializable]
    public class ObiStructuralElement
    {
        public int particle1;
        public int particle2;
        public float restLength;
        public float constraintForce;
        public float tearResistance;
    }

是这样的一个数据结构。

可以通过这个段代码来遍历粒子的位置

       foreach(var item in rope.elements)
        {
            int p1 = item.particle1;
            int p2 = item.particle2;

            Vector3 pos1 = rope.GetParticlePosition(p1);
            Vector3 pos2 = rope.GetParticlePosition(p2);
        }

可以通过上面的这个方法,找到你要断开的一个靠近的一个电,并且获取到他对应的elements
使用这个代码让绳子在指定位置断裂

rope.Tear(element)							//切割指定的element并断开
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值