Dieser Artikel ist der 7. Tagesartikel von ** Maya Advent Calender 2019 **.
Wenn Sie in Maya ein Modellierungswerkzeug erstellen, erhalten Sie möglicherweise die Scheitelpunktposition des ausgewählten Objekts. In einem Modell mit einer großen Anzahl von Scheitelpunkten ist es jedoch langsam, alle Scheitelpunktpositionen mit ** MEL ** oder ** cmds ** zu erfassen. Dies ist eine Ebene, die die Modellierungsarbeit behindert. ** Open Maya ** wird oft eingeführt, um die Verarbeitungsgeschwindigkeit zu erhöhen, aber es ist ein hoher Schwellenwert für mich, und ich habe mich gefragt, ob es eine Möglichkeit gibt, die Verarbeitungsgeschwindigkeit mit ** cmds ** zu erhöhen.
Ich habe so geschrieben.
from maya import cmds
sel_obj = cmds.ls(sl=True)
verts = cmds.ls(sel_obj[0] + '.vtx[*]', fl=True)
vert_pos = [cmds.xform(vert, t=True, ws=True, q=True) for vert in verts]
Wenn Sie es jedoch auf diese Weise erhalten, wird es viel Zeit in Anspruch nehmen, wenn das Objekt viele Eckpunkte hat.
Erstellen Sie zunächst eine sehr schöne Kugel mit ** Unterteilungsachse ** und ** Unterteilungshöhe ** in der Szene, beide ** 200 **.
Die Anzahl der Eckpunkte beträgt ** 39802 **.
Wählen Sie diese Kugel aus und messen Sie das obige Skript mit dem Zeitmodul von Python.
Es dauerte ungefähr 2 Sekunden. Bei dieser Geschwindigkeit wird die Modellierungsarbeit behindert.
from maya import cmds
sel_obj = cmds.ls(sl=True)
verts = cmds.ls(sel_obj[0] + '.vtx[*]')
vert_pos = cmds.xform(verts, t=True, ws=True, q=True)
Das ** fl ** -Flag des ** ls ** -Befehls wird entfernt, und die Liste der erfassten Scheitelpunkte wird gemeinsam dem Argument von ** xform ** übergeben. Lassen Sie uns nun die Verarbeitungsgeschwindigkeit erneut messen.
** Ungefähr 0,06 Sekunden! Es ist ungefähr 33 mal schneller. ** **.
Wenn Sie sich jedoch die zurückgegebenen Werte ansehen, handelt es sich um ein eindimensionales Array. Um also dieselben Werte wie bei der Verarbeitung mit for zurückzugeben, müssen Sie den folgenden Code hinzufügen und ihn für jedes XYZ durch ein zweidimensionales Array ersetzen.
vert_pos = [vert_pos[i:i + 3] for i in range(0, len(vert_pos), 3)]
Wie oben erwähnt, war es ein Verfahren, um die Verarbeitungsgeschwindigkeit der Scheitelpunktpositionserfassung zu erhöhen.
Es ist ein sehr kleiner Artikel, aber es war eine Entdeckung für mich, also habe ich ihn aufgeschrieben. Maya hat eine Funktion, die eine solche Liste als Argument verwenden kann, und sie kann viel schneller sein als die Verarbeitung mit for, oder sie kann schneller sein, indem Doppelspurigkeiten beim Geben einer Liste beseitigt werden.
Soweit ich sehen kann, kann ich nicht sehen, ob das Argument in der offiziellen Dokumentation aufgeführt werden kann, daher ist es mühsam, es zu testen ...
Wenn Sie Fehler oder unklare Punkte in dem Artikel haben, würde ich es begrüßen, wenn Sie sie aufschreiben könnten. Bis zum Ende Danke fürs Lesen.