0

カメラを円を描くように連続的に回転させるだけの短い Maya スクリプトがあります。問題は、スクリプトを実行しようとすると、スクリプトが実行されると、スクリプトを強制終了するまでアプリケーションを閉じることができないことです。私は cmds.refresh() を使用していますが、それは UI を更新するだけで、他の操作 (プログラムを閉じるなど) を遅らせます。手でスクリプトを強制終了できることは理解していますが、コールバックなどを介してプログラムで実行できるようにしたいと考えています。

これが私のコードが今どのように見えるかです:

import sys
import time
import maya.cmds as cmds
import maya.api.OpenMayaUI as omui

view = omui.M3dView.active3dView()
currentCamera = view.getCamera()

while(True):
    cmds.orbit(currentCamera, ha = 1)
    view.setCamera(currentCamera)
    cmds.refresh()
    time.sleep(.01)

基本的に、プログラムを閉じるときにスクリプトを自動的に強制終了する "True" の代わりに while() に入れることができるものはありますか? または、まったく別の方法でできることはありますか?

4

2 に答える 2

1

あなたは本当にここにいたくないwhile True:. Maya はスレッド化に関してかなり古風です。別のスレッドから可視シーンまたは UI に触れることは禁止されています。そのため、Maya セッションを完全に引き継がない限り、必要な種類の動作を簡単に作成することはできません。残念ながら、それはあなたが経験している振る舞いをあなたに与えます。

次の 2 つの基本的な戦略を試すことができます。

簡単なことは、「アイドル」イベントで起動する Maya スクリプト ジョブを使用することです。これは、Maya が他に何もしていないときにのみ実行を試みます。Maya がメイン スレッドで実行するため、問題は発生しません。ただし、これは Maya が他に何もしていない場合にのみ起動します。したがって、ユーザが UI またはシーンで何かを実行している場合、スクリプトは起動しません。何かのようなもの:

def orbit_cam():
   cmds.orbit('persp', ha = .01)

cmds.scriptJob(e=('idle', orbit_cam))

これの大きな欠点は、スクリプトが起動する頻度を制御できないことです。それは Maya 次第です。

2 番目のオプションは、独自の条件でスクリプトを起動する別のスレッドを作成することです。ただし、 maya.util.executeDeferredへの呼び出しでそれらをラップしない限り、2 番目のスレッドから起動された関数がクラッシュを引き起こすため、ここでは注意が必要です。

詳細な背景: Python (maya) マルチスレッドの使用方法 およびMaya MEL プロシージャを定期的に実行する方法

于 2015-08-03T17:29:22.443 に答える
0

これは、イベントscriptJobに添付されたで行うことができます。idle

import time
import sys
import maya.cmds as cmds
import maya.api.OpenMayaUI as omui

view = omui.M3dView.active3dView()
currentCamera = view.getCamera()

def rotate_camera():
    cmds.orbit(currentCamera, ha = 1)
    view.setCamera(currentCamera)
    cmds.refresh()
    time.sleep(.01)

cmds.scriptJob(event=['idle', rotate_camera], killWithScene=True)

これにより、ユーザーがいつでもアプリケーションを終了したり、UI を操作したりできるようにしながら、カメラが継続的に回転します。アニメーションが終了するときにスクリプト ジョブを削除するコールバックが必要になることに注意してください。

于 2015-08-03T17:27:14.227 に答える