1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Программирование: Булевы оп-ции?

Тема в разделе "Maya", создана пользователем Eh_Temka, 26 авг 2005.

Модераторы: Dark™, Skif
  1. Eh_Temka

    Eh_Temka Пользователь сайта

    С нами с:
    26.08.2005
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    2
    История болезни...
    Пишу плагин разбивки обьектов на куски. Делаю так.
    Создаю плоскость и с помощью булевой операции произвожу отсечение.
    Плоскости создаю "шершавыми" и с долей случайности положения в сцене.
    И иногда происходит исчезание объектов из-за того, что они не пересекаются фактически.
    И при этом выдается предупреждение. Так как в описаниях библиотек я не нашел
    сишных функций булевых операций, то пользуюсь mel-командой polyBoolOp... Так вот,
    отследить это предупреждение нельзя, так как при выполнении этой операции
    возвращается 1(true) - если верно, и 0(false) - если нет. А выполнение с предупреждением
    считается 1(true). Раньше, когда я вызывал polyBoolOp... через MGlobal::executeCommand,
    чтобы избежать исчезновений, я делал дубликаты объектов и выполнял следующие действия:

    MGlobal::executeCommand( MString("polyBoolOp -operation 2 ") + "-name DesStat"...;

    MStatus statOp2 = MGlobal::executeCommand( MString("getAttr ") + "DesStatShape.pnts[1];");

    MGlobal::executeCommand( MString("setAttr ") + "polyBoolOp1.operation 3;");

    MStatus statOp3 = MGlobal::executeCommand( MString("getAttr ") + "DesStatShape.pnts[1];");

    // Условие проверки правильности булевой операции
    if( (statOp2) && (statOp3) )
    {...

    и если условие выполняется я производил операцию с оригиналами, если нет, то на нет и суда нет.

    Но сейчас мне понадобилось реализовывать откат, и код пришлось менять. Вместо MGlobal::executeCommand
    приходится использовать dgMod.commandToExecute, и теперь команда сначала регистрируется, а только потом
    выполняется. И я не могу отследить ошибку в выполнении операции.

    А вопроса два:
    1. Есть ли сишная функция булевой операции
    2. Есть ли способ решения проблемы, которую я описал.

    Если надо, могу описать подробней...
     
  2. Guest

    незнаю что там с API, как насчёт МЕЛ-вставки
    на Меле проверка делается примерно так, знаешь наверняка
    string $a[]=`polyBoolOp ...`;
    $v=`polyEvaluate -v $a[0]`;
    if ($v...
    ...

    ------------------------
    ещё вот это посмотри http://www.blastcode.com/index.html
    дистрибутив возможно лежит на здешних ящиках turtle или syflex
     
  3. Eh_Temka

    Eh_Temka Пользователь сайта

    С нами с:
    26.08.2005
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    2
    $TASу: Попробую mel вставку, а на счет blastcode, так я его видел. Эта штука, на сколько я знаю бьет по картам, причем свои объекты. А что если я хочу, например, взорвать коллизей, и причем не сразу, а постепенно. Не думаю, что бласткоду такое под силу... К тому же там странная динамика.

    Решателью: ""Это ровно то что нужно. Он работает именно по тому принципу, что ты описал: взять объект, сгенерить неровную поверхность, развернуть раком, boolean-difference, cleanup, goto start. Разница только в том, что ты вместо неровного экструженного плэйна подсовываешь ему свои объекты."" Это ты о чем, о бласткоде, или о шатере в maya?

    А на счет задачи.. Вот представь - есть стена. В нее поочереди влетают снаряды. Первый делает дыру в ней, вышибая куски. Причем разбивка должны быть "родиальна". Затем вторай снаряд, и так далее. А за стеной стоит колонна, в которую тоже попадает один из снарядов пролетевших через стену ну и т.п. Ето пример, подразумевается, более широкое применение

    А принцип я реализую такой: если есть снаряд, то есть то что он вышибет мелкие куски и есть волна, которая вышибет, или просто немного выдавит более крупные куски. "Трещины" при этом из ценра. Снарядов и объектов может быть сколько угодно(а можно и без снарядов). Сама разбивка происходит в несколько этапов, и на кождом этапе регулируется. Регулирование происходит как раз путем изменения параметров вида, положения и количества плоскостей которые создаются для разбивки. Ну и потом соответственно создается динамика, тоже регулируемая. Это без подробностей. А из-за исчезновения обьектов все это работает некорректно.

    И еще к примеру такой баг. Я в какой-то момент вырезаю плоскостями кусок, а затем этим куском вырезаю дыру в объекте. Это кстати самый частый случай исчезновения. А происходит это, я думаю, из-за изменения геометрии объекта после булевой операции, всмысле оставжейся части.
     
  4. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    1. Поискал - вроде навскидку так нет.
    2. Имеет смысл спросить в highend3d.com MayaDev mailing list. Там постоянно тусуется множество высоких лбов, я думаю ответят быстро.

    Вопрос только один - зачем писать в виде плага то, что уже и так реализовано? Solid shatter делает абсолютно то же самое.
     
  5. Eh_Temka

    Eh_Temka Пользователь сайта

    С нами с:
    26.08.2005
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    2
    На счет Solid shatter ничего не не знаю, не видел, только разбивка - это всего лишь часть плагина. Причем те шатеры, которые я видел не очень то подходят. А вообще он предназначен для создания взрывов(приемущественно от попадания чего-нибудь в что-нибудь и образования при этом кучи обломков и дыр-проломов) включая определенным образом построенную динамику.

    А на счет highend3d.com MayaDev mailing list... Спасибо конечно, но с забугорным языком у меня некоторые проблемы. Если прочитать еще могу более-менее, то написать очень геморно.

    А, кстати... А этот Solid shatter в виде скрипта? Если да, то где его можно взять?
     
  6. Guest

    Поверхность то всё равно создаётся, только полигонов в ней будет НОЛЬ, вот это и проверяй.
     
  7. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    Shatter - это во встроенных майкиных Effects.
     
  8. Eh_Temka

    Eh_Temka Пользователь сайта

    С нами с:
    26.08.2005
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    2
    Решателю: Да, извини. Нашел этот шатер. Только это совсем не то, что нужно.

    $TAS: Дык как это проверить, если dgMod.commandToExecute... возвращает не результат команды, а результат регистрации команды? И выполнение ее происходит после регистрации, так что даже нельзя взять эти полигоны, так как объекта не существует на момент регистрации и такой код, к примеру, не сработает:

    doit()
    {
    dgMod.commandToExecuteMString("polyBoolOp...;

    ...

    int nPol = "взятие полигонов от результата polyBoolOp" (не помню на вскидку функцию);

    ...

    return redo();

    }

    так как результат polyBoolOp будет только после выполнения функции
    redo(){ return dgMod.doit(); }. Такая вот ерунда.


     
  9. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    "Решателю: Да, извини. Нашел этот шатер. Только это совсем не то, что нужно."

    Это ровно то что нужно. Он работает именно по тому принципу, что ты описал: взять объект, сгенерить неровную поверхность, развернуть раком, boolean-difference, cleanup, goto start. Разница только в том, что ты вместо неровного экструженного плэйна подсовываешь ему свои объекты.

    Потом - boolean не ругается, если объекты не пересекаются. По крайней мере только что в 7.0 оно у меня не ругнулось. Оно ругается только в том случае, если возникает ашыпка бульонов. А у тебя ругается скорее всего потому что ты не делаешь клинап - его и клинит при множестве последовательных операций.

    И наконец - ты можешь рассказать свою задачу ещё раз...а то как-то пока что смутно понятно. Но в общем Stas прав - надо просто почекать - "а не нуль ли точек в резалте"?
     
  10. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    Я про шаттер. Дело в том, что майский бульон не всегда порождает корректные объекты. В том скрипте(в шаттере) про который я писал стабильность работы достигается применением cleanUp после каждого бульона.

    Кроме того - можно просто учесть возможность исчезновения объектов(нестабильной работы), и в случае получения пустого объекта сделать "try again". Хотя это по сути костыль конечно.

    Есть паперы, в которых рассказывается как такие вещи делаются аналитическими методами и физически корректно. Но я посмотрел на тамошнюю математику - и пока что отложил. ;)
     
  11. Eh_Temka

    Eh_Temka Пользователь сайта

    С нами с:
    26.08.2005
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    2
    А где эти паперы можно посмотреть, если не секрет. А то проблему-то решать все равно надо. А время у меня свободное вроде пока есть. Если дашь паперы, то я покапаюсь, и если что выйдет дам на пробу.
     
  12. Решатель

    Решатель Знаток

    С нами с:
    20.04.2005
    Сообщения:
    1.413
    Симпатии:
    0
    Баллы:
    44
    http://www.cs.berkeley.edu/b-cam/Papers/obrien-2002-GMA/
    Ну и гугль по его имени и fracture.
     
  13. Eh_Temka

    Eh_Temka Пользователь сайта

    С нами с:
    26.08.2005
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    2
    $TASу: Попробовал твое предложение. Вроде теперь постабильней. Хотя пришлось повазится,, чтобы откат не потерять и работает теперь в два раза медленнее. А вообще спасибо. Я сам не догадался все в одной вставке сделать...

    Но основная проблема с изменением геометрии остается...

    Решателью: Спасибо, гляну
     
Модераторы: Dark™, Skif

Поделиться этой страницей