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

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

ただいまの
回答率

87.34%

Blender スクリプト Python

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 946

score 7

Blenderにおいて、以下のスクリプトを実行したところ毎回250フレーム目で動作が止まります。解決方法はありますか?

import bpy
import math
import fnmatch

def ClearObjects():
    scene = bpy.context.scene
    data = bpy.data
    pattern = 'Copy*'
    IcoA = [objA for objA in scene.objects if fnmatch.fnmatchcase(objA.name, pattern)]
    IcoB = [objB for objB in data.objects if fnmatch.fnmatchcase(objB.name, pattern)]
    IcoC = [objC for objC in data.meshes if fnmatch.fnmatchcase(objC.name, pattern)]
    IcoD = [objD for objD in data.materials if fnmatch.fnmatchcase(objD.name, pattern)]

    for item in IcoA:
        if item.type == 'MESH':
            bpy.context.scene.objects.unlink(item)
    for item in IcoB:
        if item.type == 'MESH':
            bpy.data.objects.remove(item)
    for item in IcoC:
        bpy.data.meshes.remove(item)
    for item in IcoD:
        bpy.data.materials.remove(item)

def CreateObjects(frame):
    if (bpy.context.screen.is_animation_playing == False):
        return

    objectName='Cylinder'    
    copySrc=bpy.data.objects[objectName]

    num = 12
    r = 4
    obj = []
    for i in range(num):
        t = 2.0 * math.pi * i / num
        x = 0.8 * r * math.cos(t)
        y = 0.8 * r * math.sin(t)

        for ob in bpy.context.scene.objects:
            ob.select = False
        copySrc.select = True

        bpy.ops.object.duplicate(linked=True)
        newObj=bpy.data.objects[objectName+'.001']
        newObj.name='Copy'
        obj.append(newObj)
        bpy.context.scene.objects.active = newObj
        obj[i].location=(0,0,0)

        bpy.ops.rigidbody.object_add()
        obj[i].rigid_body.kinematic = True
        obj[i].rigid_body.restitution = 0.6
        obj[i].hide_render = True
        obj[i].hide_select = True
        obj[i].keyframe_insert( data_path='hide_render', frame=frame-1 )
        obj[i].keyframe_insert( data_path='hide_select', frame=frame-1 )
        obj[i].keyframe_insert( data_path='location', frame=frame-1 )

        obj[i].hide_render = False
        obj[i].hide_select = False
        obj[i].keyframe_insert( data_path='hide_render', frame=frame )
        obj[i].keyframe_insert( data_path='hide_select', frame=frame )

        obj[i].location = (x, y, 0.1)           
        obj[i].keyframe_insert( data_path='location', frame=frame )
        obj[i].rigid_body.keyframe_insert( data_path='kinematic', frame=frame )

        obj[i].location = (x*1.06, y*1.06, 0.1)
        obj[i].keyframe_insert( data_path='location', frame=frame+1 )

        obj[i].rigid_body.kinematic = False
        obj[i].rigid_body.keyframe_insert( data_path='kinematic', frame=frame+2 )   

# every frame change, this function is called.
def handler(scene):
    frame = scene.frame_current

    if frame == 2:
        ClearObjects()
    if frame % 10 == 3:
        CreateObjects(frame)
    if frame == scene.frame_end:
        bpy.ops.screen.animation_cancel(restore_frame=False)

def handler_render_pre(scene):
    bpy.app.handlers.frame_change_pre.clear()

ClearObjects()

bpy.app.handlers.render_pre.clear() 
bpy.app.handlers.render_pre.append(handler_render_pre)

bpy.app.handlers.frame_change_pre.clear() 
bpy.app.handlers.frame_change_pre.append(handler)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

動画の開始フレームと終了フレームを指定してないので、デフォルトの終了フレーム=250が適用されているかと思います。
以下のコードを追記すると良いでしょう。

bpy.context.scene.frame_start = 0
bpy.context.scene.frame_end = 300

参考リンク

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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