Render.ru

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

Eh_Temka

Пользователь сайта
Рейтинг
2
#1
История болезни...
Пишу плагин разбивки обьектов на куски. Делаю так.
Создаю плоскость и с помощью булевой операции произвожу отсечение.
Плоскости создаю "шершавыми" и с долей случайности положения в сцене.
И иногда происходит исчезание объектов из-за того, что они не пересекаются фактически.
И при этом выдается предупреждение. Так как в описаниях библиотек я не нашел
сишных функций булевых операций, то пользуюсь 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
незнаю что там с API, как насчёт МЕЛ-вставки
на Меле проверка делается примерно так, знаешь наверняка
string $a[]=`polyBoolOp ...`;
$v=`polyEvaluate -v $a[0]`;
if ($v...
...

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

Eh_Temka

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

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

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

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

И еще к примеру такой баг. Я в какой-то момент вырезаю плоскостями кусок, а затем этим куском вырезаю дыру в объекте. Это кстати самый частый случай исчезновения. А происходит это, я думаю, из-за изменения геометрии объекта после булевой операции, всмысле оставжейся части.
 
Рейтинг
34
#4
1. Поискал - вроде навскидку так нет.
2. Имеет смысл спросить в highend3d.com MayaDev mailing list. Там постоянно тусуется множество высоких лбов, я думаю ответят быстро.

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

Eh_Temka

Пользователь сайта
Рейтинг
2
#5
На счет Solid shatter ничего не не знаю, не видел, только разбивка - это всего лишь часть плагина. Причем те шатеры, которые я видел не очень то подходят. А вообще он предназначен для создания взрывов(приемущественно от попадания чего-нибудь в что-нибудь и образования при этом кучи обломков и дыр-проломов) включая определенным образом построенную динамику.

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

А, кстати... А этот Solid shatter в виде скрипта? Если да, то где его можно взять?
 
#6
Поверхность то всё равно создаётся, только полигонов в ней будет НОЛЬ, вот это и проверяй.
 

Eh_Temka

Пользователь сайта
Рейтинг
2
#8
Решателю: Да, извини. Нашел этот шатер. Только это совсем не то, что нужно.

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

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

...

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

...

return redo();

}

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


 
Рейтинг
34
#9
"Решателю: Да, извини. Нашел этот шатер. Только это совсем не то, что нужно."

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

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

И наконец - ты можешь рассказать свою задачу ещё раз...а то как-то пока что смутно понятно. Но в общем Stas прав - надо просто почекать - "а не нуль ли точек в резалте"?
 
Рейтинг
34
#10
Я про шаттер. Дело в том, что майский бульон не всегда порождает корректные объекты. В том скрипте(в шаттере) про который я писал стабильность работы достигается применением cleanUp после каждого бульона.

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

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

Eh_Temka

Пользователь сайта
Рейтинг
2
#11
А где эти паперы можно посмотреть, если не секрет. А то проблему-то решать все равно надо. А время у меня свободное вроде пока есть. Если дашь паперы, то я покапаюсь, и если что выйдет дам на пробу.
 

Eh_Temka

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

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

Решателью: Спасибо, гляну
 
Сверху