質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

pythonで3dアニメーションが2週目以降崩れてしまうのを直したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,920

score 32

python3を使っています.下に作成したアニメーションのスクショとプログラムを載せておきます.合成波が進んでいくところのアニメーションを作ってみましたが,frames数を200にしたところ、二週目以降で波の始めと終わりがつながってしまいます。分かりやすいように、アニメーションの一週目のスクショ、二週目以降のスクショ、書いたプログラムを載せておきます。どなたか分かる方ご教授ください。
よろしくお願いします。

一週目のアニメーション

二週目以降のアニメーション

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as anm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
f=np.pi/6
d=np.pi/2
t=[]

def update(i):
    if i !=0:
        plt.cla()

    X1=0
    Y1=0
    Z1=0
    U1=-np.cos(i/10)*np.sin(f)*np.cos(f)
    V1=np.cos(i/10)*np.sin(f)*np.sin(f)
    W1=0

    X2=0
    Y2=0
    Z2=0
    U2=np.cos(i/10)*np.sin(f)*np.cos(f)
    V2=np.cos(i/10)*np.cos(f)*np.cos(f)
    W2=0

    X3=0
    Y3=0
    Z3=0
    U3=U1+U2
    V3=V1+V2
    W3=0

    X4=[X1,U1]
    Y4=[Y1,V1]
    Z4=[Z1,W1]
    X5=[X2,U2]
    Y5=[Y2,V2]
    Z5=[Z2,W2]
    X6=[X3,U3]
    Y6=[Y3,V3]
    Z6=[Z3,W3]

    ax.set_xlim(-1.5,1.5)
    ax.set_ylim(-1.5,1.5)
    ax.set_zlim(0,3)
    ax.axis("off")
    ax.plot(X4,Y4,Z4,"-",c="r",lw=2)
    ax.plot(X5,Y5,Z5,"-",c="b",lw=2)
    ax.plot(X6,Y6,Z6,"-",c="m",lw=2)

    t.append(i)
    t1=np.array(t)
    x1=-np.cos((i-t1)/10)*np.sin(f)*np.cos(f)
    y1=np.cos((i-t1)/10)*np.sin(f)*np.sin(f)
    z1=t1/100


    x2=np.cos((i-t1)/10)*np.sin(f)*np.cos(f)
    y2=np.cos((i-t1)/10)*np.cos(f)*np.cos(f)
    z2=t1/100

    x3=x1+x2
    y3=y1+y2
    z3=z1

    ax.plot(x1, y1, z1,"-", c="r")
    ax.plot(x2, y2, z2,"-", c="b")
    ax.plot(x3, y3, z3,"-", c="m")

ani = anm.FuncAnimation(fig, update, \
    interval = 15, frames = 200)


plt.show()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

とりあえずこれで満足してます

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as anm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
f=np.pi/6
d=np.pi/2
t=[]
s=[]


def solid(x,y,z,lx,ly,lz,depth,iro):
    u1=[x,x+lx]
    v1=[z,z+lz]
    X1,Y1=np.meshgrid(u1,v1)
    ax.plot_surface(X1,y,Y1,alpha=depth,color=iro)
    ax.plot_surface(X1,y+ly,Y1,alpha=depth,color=iro)

    u2=[x,x+lx]
    v2=[y,y+ly]
    X2,Y2=np.meshgrid(u2,v2)
    ax.plot_surface(X2,Y2,z,alpha=depth,color=iro)
    ax.plot_surface(X2,Y2,z+lz,alpha=depth,color=iro)

    u3=[y,y+ly]
    v3=[z,z+lz]
    X3,Y3=np.meshgrid(u3,v3)
    ax.plot_surface(x,X3,Y3,alpha=depth,color=iro)
    ax.plot_surface(x+lx,X3,Y3,alpha=depth,color=iro)

    plt.show()


def update(i):

    if i==0:
        del t[:]

    else:
        pass

    if i !=0:
        plt.cla()

    X1=0
    Y1=0
    Z1=0
    U1=-np.cos(i/10)*np.sin(f)
    V1=0
    W1=0

    X2=0
    Y2=0
    Z2=0
    U2=0
    V2=np.cos(i/10)*np.cos(f)
    W2=0

    X3=0
    Y3=0
    Z3=0
    U3=U1+U2
    V3=V1+V2
    W3=0

    X4=[X1,U1]
    Y4=[Y1,V1]
    Z4=[Z1,W1]
    X5=[X2,U2]
    Y5=[Y2,V2]
    Z5=[Z2,W2]
    X6=[X3,U3]
    Y6=[Y3,V3]
    Z6=[Z3,W3]

    ax.set_xlim(-1.5,1.5)
    ax.set_ylim(-1.5,1.5)
    ax.set_zlim(0,3)
    ax.axis("off")
    ax.plot(X4,Y4,Z4,"-",c="r",lw=4)
    ax.plot(X5,Y5,Z5,"-",c="b",lw=4)
    ax.plot(X6,Y6,Z6,"-",c="m",lw=4)

    t.append(i)
    s.append(i)

    t1=np.array(t[:200])

    x1=-np.cos((i-t1)/10)*np.sin(f)
    y1=0*t1
    z1=t1/100


    x2=0*t1
    y2=np.cos((i-t1)/10)*np.cos(f)
    z2=t1/100

    x3=x1+x2
    y3=y1+y2
    z3=z1


    ax.plot(x1, y1, z1,"-", c="r")
    ax.plot(x2, y2, z2,"-", c="b")
    ax.plot(x3, y3, z3,"-", c="m",lw=3)

    if len(s)>250:
        t2=np.array(s[:len(s)-250])

        x4=-np.cos((i-t2)/10-d)*np.sin(f)
        y4=0*t2
        z4=t2/100+3


        x5=0*t2
        y5=np.cos((i-t2)/10)*np.cos(f)
        z5=t2/100+3

        x6=x4+x5
        y6=y4+y5
        z6=z4

        ax.plot(x4,y4,z4,"-",c="r")
        ax.plot(x5,y5,z5,"-",c="b")
        ax.plot(x6, y6, z6,"-", c="m",lw=3)


    solid(-1,-1,2,0.25,2,1,0.4,"green")
    solid(-0.75,-1,2,0.25,2,1,0.4,"yellow")
    solid(-0.5,-1,2,0.25,2,1,0.4,"green")
    solid(-0.25,-1,2,0.25,2,1,0.4,"yellow")
    solid(0,-1,2,0.25,2,1,0.4,"green")
    solid(0.25,-1,2,0.25,2,1,0.4,"yellow")
    solid(0.5,-1,2,0.25,2,1,0.4,"green")
    solid(0.75,-1,2,0.25,2,1,0.4,"yellow")
    soa=np.array([[1,0,0,2,0,0],[0,-1,0,0,-2,0]])
    X,Y,Z,U,V,W=zip(*soa)
    ax.quiver(X,Y,Z,U,V,W,color="black")




ani = anm.FuncAnimation(fig, update, \
    interval = 15, frames = 1000)

plt.show()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る