Atoms Crowdブログへようこそ。こちらのブログでは、Atomsをどのように使用できるかを説明するために、興味深い記事をいくつか投稿しています。
私たちの最初の投稿では、ユーザーに楽しいハックをご覧いただく予定です:XBox 私たちの最初の投稿では、ユーザーに楽しいハックをご覧いただく予定です:XBoxコントローラーでユーザーのエージェントを動かす方法。Controllerからユーザーのエージェントを動かす方法。
テクニカルユーザーではない場合は、最後のセクションは無視し、下にあるマテリアルをダウンロードして、Maya 2017でそれらを試してください。
- Xbox controller Controller モジュール
- Xboxモジュールレコーダー
- XBoxコントローラの入力をキャプチャするために必要な
XBox Controllerの入力をキャプチャするために必要なxbox.pydファイル。それをダウンロードして、ユーザーのPythonパスのどこかにコピーしてください。
pydファイルは、Maya
2017用にコンパイルされています。
ご覧になりたい場合は、こちらでxbox確認する場合は、こちらでxbox.pydを生成するためのビジュアルスタジオプロジェクトをご覧ください。
...
ウィジェット コネクタ | ||||||
---|---|---|---|---|---|---|
|
こちらの例の実行方法
ユーザーのPythonパスの中にxbox.pydをコピーしてください。 (<ドライブ>:\ Documents and Settings \ <ユーザー名> \ My Documents \ maya \ <バージョン> \ scripts)
Atoms UIを開き、新しいBehaviourモジュールを作成して、Xbox Controllerモジュールのコンテンツをエディターにコピーします。
- Registerをクリックしてください。
「Register」をクリックしてください。
- 新しいエージェントグループを作成して、gridLayoutモジュール、stateMachineモジュール、およびXBoxControllerModuleを追加します。
新しいエージェントグループを作成して、gridLayoutモジュール、stateMachineモジュール、およびXBoxControllerモジュールを追加します。
タイムラインフレームの範囲を1〜2000に設定します。
Script EditorでXboxモジュールレコーダーの内容をコピーして実行します。
「Start」をクリックしてください。 Xbox
Controllerを使用してエージェントを操作してください。Controllerを使用して、エージェントを操作してください。
「Stop」をクリックしてください。
...
どのように機能しますか?
まず最初に、ユーザー自身でこれをすべて実行している場合、ユーザーはXboxController入力を捕獲して、それをPythonで利用可能にするためにいくつかのC に、ユーザー自身でこれをすべて実行している場合、ユーザーはXbox Controller inputを捉えて、Pythonで利用を可能にするためにC ++の知識が必要になります。の知識がいくつか必要になります。
幸い、これはすでにサポートをされているため、ユーザーはxbox幸い、これは既に考慮されているため、ユーザーはxbox.pydモジュールからその情報にアクセスすることができます。pydモジュールからその情報へアクセスすることが可能です。
ユーザーが十分な意欲がある場合、ユーザーは与えられたビジュアルスタジオプロジェクトを確認することができます。 現在、私たちが見ている他に2つの主要なコンポーネントがあります。ユーザーに十分な意欲がある場合、ユーザーは与えられたビジュアルスタジオプロジェクトを確認することができます。現在、その他に2つの主要なコンポーネントがあります。
The XBoxControllerModule
...
XBoxControllerModule
これはすべての作業を行い、XBox Controllerを使用して、ユーザーが実行するアクションをキャッシュするAtomsモジュールです。
コード ブロック | ||||
---|---|---|---|---|
| ||||
import Atoms import AtomsCore import AtomsMath import os import xbox import maya class XBoxControllerModule(Atoms.BehaviourModule): def __init__(self): Atoms.BehaviourModule.__init__(self) # Adding the module metadatas self.addAttribute("cachedAngle", AtomsCore.Vector3Metadata(AtomsMath.V3d(0.0,0.0,0.0))) self.addAttribute("cachedState", AtomsCore.IntMetadata(0)) self.addAttribute("record", AtomsCore.BoolMetadata(False)) self.addAttribute("turnAngle", AtomsCore.DoubleMetadata(3.0)) # initializing the class members self.state = 0 self.old_state = 0 self.old_dir = [0.0,0.0,0.0] # lists for caching the values self.stateKeys=[] self.angleKeys=[] def initSimulation(self, agentGroup): # Emptying the two lists and setting initial values self.stateKeys=[] self.angleKeys=[] self.angleKeys.append([maya.cmds.currentTime(q=1), [0.0,0.0,0.0]]) self.stateKeys.append([maya.cmds.currentTime(q=1), 0]) def initFrame(self, agents, agentGroup): # getting the module parameters turnAngle = self.attributes()["turnAngle"].value() record = self.attributes()["record"].value() # getting the xbox control state state = xbox.getControlState() angle = state["LX"] buttonA = state["A"] buttonB = state["B"] buttonX = state["X"] # finding the right state depending on the pressed button if buttonA: self.state = 0 if buttonB: self.state = 1 if buttonX: self.state = 2 if record: # if we are recording we cache the values if self.old_dir[0] != state["LX"] or self.old_dir[1] != state["LY"]: self.angleKeys.append([maya.cmds.currentTime(q=1), [state["LX"],state["LY"],0.0]]) if self.state != self.old_state: self.stateKeys.append([maya.cmds.currentTime(q=1), self.state]) self.old_dir = [state["LX"],state["LY"],0.0] self.old_state = self.state else: # otherwise we get the default values from the module parameters angle = self.attributes()["cachedAngle"].value().x self.state = self.attributes()["cachedState"].value() # for each agent changing the state and direction for agent in agents: if self.state: agent.metadata()["state"].set(self.state) dir = agent.metadata()["direction"].value() q = AtomsMath.Quatd() q.setAxisAngle(AtomsMath.V3d(0.0,1.0,0.0), -angle * turnAngle * 3.1456 / 180.0) dir = dir * q.toMatrix44() agent.metadata()["direction"].set(dir) def endSimulation(self, agents, agentGroup): # setting all the keyframes for v in self.angleKeys: maya.cmds.setKeyframe(agentGroup.name() + ".atoms_XBoxControllerModule_cachedAngle.atoms_XBoxControllerModule_cachedAngleX",v=v[1][0],t=[v[0]]) maya.cmds.setKeyframe(agentGroup.name() + ".atoms_XBoxControllerModule_cachedAngle.atoms_XBoxControllerModule_cachedAngleY",v=v[1][1],t=[v[0]]) maya.cmds.setKeyframe(agentGroup.name() + ".atoms_XBoxControllerModule_cachedAngle.atoms_XBoxControllerModule_cachedAngleZ",v=v[1][02],t=[v[0]]) for v in self.stateKeys: maya.cmds.setKeyframe(agentGroup.name() + ".atoms_XBoxControllerModule_cachedState",v=v[1],t=[v[0]]) |
...
Xbox module recorder
...
これは、記録を開始/停止するためのシンプルなPySide UIです。こちらのスクリプトを実行する前に、必ずエージェントグループトランスフォームを選択してください。
コード ブロック | ||||
---|---|---|---|---|
| ||||
import AtomsMaya import maya from PySide2 import QtWidgets, QtCore, QtGui class XboxControllerModuleWidget(QtWidgets.QWidget): def __init__(self, parent=None): super(XboxControllerModuleWidget, self).__init__(parent) self.ag_name = maya.cmds.ls(sl=1,dag=1,lf=1,shapes=1)[0] self.v_layout = QtWidgets.QVBoxLayout() self.start = QtWidgets.QPushButton("Start") self.stop = QtWidgets.QPushButton("Stop") self.v_layout.addWidget(self.start) self.v_layout.addWidget(self.stop) self.setLayout(self.v_layout) self.start.clicked.connect(self._start) self.stop.clicked.connect(self._stop) self.start.setEnabled(True) self.stop.setEnabled(False) def _start(self): ag_name = self.ag_name maya.cmds.setAttr(ag_name + ".atoms_XBoxControllerModule_record",1) maya.mel.eval("playButtonStart;") maya.mel.eval("playButtonForward;") self.start.setEnabled(False) self.stop.setEnabled(True) def _stop(self): ag_name = self.ag_name ag = AtomsMaya.getAgentGroup(ag_name) mod = ag.behaviourModule("XBoxControllerModule") mod.endSimulation(ag.agents(), ag) maya.cmds.setAttr(ag_name + ".atoms_XBoxControllerModule_record",0) maya.mel.eval("playButtonForward;") self.start.setEnabled(True) self.stop.setEnabled(False) w = XboxControllerModuleWidget() w.show() |
...