首页 > 其他分享 >基于VMobject的动画实现

基于VMobject的动画实现

时间:2022-10-16 10:45:26浏览次数:47  
标签:动画 基于 VMobject myli 锚点 innerli li append

我想,将VMobject变为一个个内外嵌套的壳,但是目前来看无法实现

首先,我们考察非平滑节点,以正方形为例:

        def playscene0():
            c = Square()
            li = c.get_anchors_and_handles()  # 获取VMobject的anchors和handles
            l = len(li[0])  # 注意li的长度为4,这意味这[li[0][i],li[1][i],li[2][i],li[3][i]]组成一条贝塞尔曲线
            v = VMobject(stroke_width=10)  # 创建空的VMobject
            v1 = VMobject(stroke_width=10)  # 创建空的VMobject
            myli = []
            for i in range(l):
                myli.append(li[0][i]);myli.append(li[1][i]);myli.append(li[2][i]);myli.append(li[3][i])  # 注意不需要加[]
            v.points = myli
            
            
            def getinner(a, b, c):
                vect1 = b - a
                vect1 = vect1/np.sqrt(vect1[0]**2 + vect1[1]**2 + vect1[2]**2)  # 如果不是np.array()类型而是list类型则会报错:TypeError: unsupported operand type(s) for -: 'list' and 'list'
                vect2 = c - a
                vect2 = vect2/np.sqrt(vect2[0]**2 + vect2[1]**2 + vect2[2]**2)
                vect3 = [x + y for x,y in zip(vect1, vect2)]
                vect3 = vect3/np.sqrt(vect3[0]**2 + vect3[1]**2 + vect3[2]**2)
                point = a + vect3
                return point
            innerli = []
            for i in range(l):
                if i == 0:
                    a = getinner(myli[0],myli[1],myli[-2])
                    innerli.append(a);innerli.append(myli[1] - myli[0] + a)
                else:
                    a = getinner(myli[4*i-1],myli[4*i-2],myli[4*i+1])
                    innerli.append(myli[4*i-2] - myli[4*i-1] + a);innerli.append(a);innerli.append(a);innerli.append(myli[4*i+1] - myli[4*i] + a)
            z = getinner(myli[0],myli[1],myli[-2])
            innerli.append(myli[-2] - myli[-1] + z);innerli.append(z)
            print(innerli)
            v1.points = innerli

基本思想是,根据某个锚点的两个手柄,将锚点沿着两个手柄的角平分线移动一定距离,得到内部的innerli。但是如果对于平滑节点,则无法实现,因为其两个锚点做向量运算为零向量,如果考虑其垂直平分线,那么有两个方向可以考虑,这个问题的解决方法是考虑锚点两侧的像素颜色,从而选出锚点移动的方向,但是还有另一个问题,对于锚点的手柄,如何才能使其能恰好贴紧外侧的内部边缘?这个对于锚点的运算是线性的吗?这我不打算研究了

标签:动画,基于,VMobject,myli,锚点,innerli,li,append
From: https://www.cnblogs.com/daxiangcai/p/16795740.html

相关文章