Center Pivot без xform

Есть ли способ центрировать ось объекта без использования xform?

Я действительно хотел бы попытаться найти версию этого pyMel или Maya API, поскольку xform обычно в 10 раз медленнее, чем решение pymel или API.

Очевидно, вы можете добиться этого с помощью xform следующим образом:

xform(obj, cp=1)

Но я пытаюсь найти другой способ, кто-нибудь что-нибудь знает?


person Shannon Hochkins    schedule 23.08.2013    source источник
comment
Вы должны иметь возможность напрямую возиться с атрибутами преобразования, но меня больше интересует основа вашего комментария, который стал в 10 раз медленнее. Как вы пришли к этому числу? Должно быть, это было связано с другой проблемой, поскольку в этом случае у вас нет другого решения, с которым можно было бы сравнить в первую очередь... (Я предполагаю, что что бы вы ни делали раньше, команда xform не была медленная часть, но окружающий ее MEL был. В этом случае простой вызов xform из Python должен сильно помочь.)   -  person Mark R. Wilkins    schedule 23.08.2013
comment
xform запускает отмену, которая всегда немного медленная. Но не обновлять отмену проблематично, вы можете временно приостановить отмену. Но это делает его проблемой юзабилити. API может сделать это быстрее, если вы заинтересованы в реализации собственной отмены. В любом случае, если вы действительно настолько чувствительны к производительности (преждевременная оптимизация?), ваш единственный вариант - использовать С++ для всего.   -  person joojaa    schedule 24.08.2013
comment
@MarkR.Wilkins, я несколько раз читал, что xForm всегда медленнее, чем альтернатива, а также то, что JooJaa говорит о части функции отмены xForm, хотя я действительно думаю, что мне нужно покопаться в API для более чистого кодирования, подобного этому :)   -  person Shannon Hochkins    schedule 26.08.2013


Ответы (2)


Хотите найти версию PyMEL? Или объектно-ориентированный способ сделать это? xform(obj, cp=1) находится в PyMEL. Однако объектно-ориентированный метод для получения того же результата очень похож на ответ теодокса, в котором вы должны сделать следующее:

obj.setScalePivot(obj.c.get())
obj.setRotatePivot(obj.c.get())

Центрирование поворота объектов основано на центре ограничивающей рамки. obj.c.get вернет вам именно это. Просто подключите это к методам выше.

person Argiri Kotsaris    schedule 23.08.2013
comment
Как вы думаете, это будет быстрее, чем xform (cp = 1)? - person Shannon Hochkins; 24.08.2013
comment
@ShannonHochkins Нет, скорее всего, он будет работать немного медленнее. - person joojaa; 24.08.2013
comment
Вы не возражаете, если я спрошу, почему @joojaa? Разве xForm не должен выполнять точно такую ​​же задачу? - person Shannon Hochkins; 26.08.2013
comment
@ShannonHochkins, возможно, но xForm не должен выходить из собственного кода. Команды синхронизации не так уж сложны, вы знаете, проверьте и убедитесь сами. Кроме того, какое вам дело до того или иного пути? - person joojaa; 26.08.2013
comment
Я просто ненавижу xform, ха-ха, я никогда не соглашался с тем, как он читается, я предпочитаю знать, что команда thr делает в фоновом режиме, чтобы я мог узнать больше @joojaa, как я могу их рассчитать? - person Shannon Hochkins; 26.08.2013
comment
@ShannonHochkins Честно говоря, в этом случае методы, которые мы все показали, будут считаться непитоновскими. Python фокусируется на удобочитаемости, поэтому было бы хорошо, если бы вы написали для него функцию и назвали бы ее centerPivot(obj), однако xform уже делает это и многое другое, так что это более избыточно, что определенно контрпродуктивно. - person Argiri Kotsaris; 26.08.2013
comment
@ShannonHochkins позвольте мне отметить, что ни вышеизложенное, ни xForm не дают вам никакого представления о том, что они делают за кулисами. Смысл использования скриптовых интерфейсов состоит в том, чтобы выполнять задачи, а не думать о проблемах с производительностью. Если вы действительно должны одержимо знать, что что-то делает в фоновом режиме, то Maya не для вас. Вместо этого вам нужно использовать некоторое программное обеспечение с открытым исходным кодом. Но не существует хорошего 3D-приложения с открытым исходным кодом (без блендера это плохо, это просто раздражает). В любом случае, Maya никогда не будет по-настоящему Pythonic, потому что набор инструментов был написан для mel на C++. Но тогда много реального кода похоже на это. - person joojaa; 26.08.2013
comment
Я не имею в виду изучение исходного кода, например, теперь я знаю, как сбросить сводную точку без использования xform, мне нравится расширять свои знания. - person Shannon Hochkins; 27.08.2013
comment
@ShannonHochkins Тогда лучше было бы спросить, как Maya вычисляет центральную точку поворота объекта? Разве это не так? - person Argiri Kotsaris; 27.08.2013
comment
Что ж, тот же вопрос приведет к аналогичному ответу, поскольку мой заголовок является центральным поворотом без xform, я получу ответ, отличный от xform, но я думаю, что это тоже был бы хороший вопрос. - person Shannon Hochkins; 27.08.2013
comment
Я провел тест timeit, и вы были правы @joojaa, на самом деле он был в два раза медленнее! Я бы не подумал, что это так, но я думаю, вы знаете намного больше :) Спасибо за вашу помощь, ребята! - person Shannon Hochkins; 27.08.2013
comment
Я также отредактировал ваш вопрос @ArgiriKotsaris, если вы хотите опубликовать его для других, кто может наткнуться на это. - person Shannon Hochkins; 27.08.2013

В API он будет вызывать mfnTransform.setRotatePivotTranslation и setScalePivotTranslation с включенным «балансом». Недостаточно накладных расходов, чтобы гарантировать обходной путь — трудно понять, как это может быть узким местом.

person theodox    schedule 23.08.2013
comment
Я не уверен, как вы это реализуете, можете ли вы продемонстрировать это с помощью своего кода? - person Shannon Hochkins; 24.08.2013
comment
длинный фрагмент превращает объект сцены в mfnTransform, что обычно означает получение его из mfnDagNode, который, в свою очередь, обычно берется из примера mfnSelectionlistt... на полпути вниз по этой странице: akeric.com/blog/?p=1067. Это много работы для небольшого или нулевого прироста скорости. не беспокойся - person theodox; 24.08.2013
comment
Ну, я уже использую API для других вещей, так что это не так уж и много работы. Было бы здорово, если бы вы могли рассчитать время функций, чтобы увидеть, какие из них занимают больше всего времени. - person Shannon Hochkins; 26.08.2013
comment
Используйте модуль timeit: docs.python.org/2/library/timeit.html для получения точных данных профилирования. Однако в таком случае результаты будут очень сильно зависеть от количества обрабатываемых объектов - как я уже сказал, если вы не центрируете сотни поворотов за раз, скорость этой операции не должна иметь большого значения. Все, что делают функции, — это установка поворота/масштабирования на ноль и инвертирование матриц rotatePivotTranslate/scalePivotTranslate, это не так много математики, и все это делается в ядре Maya. - person theodox; 26.08.2013