FAQ по MaxSDK, Архитектура, понятия, методы, примеры и т.д. |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
FAQ по MaxSDK, Архитектура, понятия, методы, примеры и т.д. |
24/10/2009, 11:34
Сообщение
#1
|
|
Уже не новичок Группа: Пользователи Сообщений: 11 Регистрация: 24/10/2009 Пользователь №: 73 795 |
Предлагаю в этой теме рассмотривать нюансы работы в 3ds Max SDK. А именно архитектуру SDK! Понятно, что всё не плохо изложено в справочном руководстве, но при прочтении его всё равно возникает не мало непонятностей, а тому кто плохо владеет техническим английским, понять что-либо в нем ещё труднее! Есть момент в SDK - один из самых важных, я думаю, это Reference System ( я перевел это как "система ссылок"). Из прочитанного я понял следующее:
1. У Reference system есть несколько задач а. Сообщить всем зависимым объектам сценыо произошедших измененияхили событиях б. Управлять автоматическим удалением объектов в. Загрузить и сохранить граф сцены Большинство ссылок можно увидеть в 3ds Max в окне schematic view. В Reference system есть ReferenceMaker(объект наблюдатель, который содержит ссылки) и Reference Target (тот объект за которым наблюдают). Поскольку наблюдатели могут также быть субъектами наблюдения , поэтому класс ReferenceMaker является подклассом класса Reference Target. Сейчас меня интересует как же, всё таки, по русски назвать Reference system, ReferenceMaker и Reference Target? //==============Пусть это будет здесь===================== 3ds max 7 sdk - https://docs.google.com/file/d/0B6U24pd58VX...G4tRURRYnc/edit 3ds max 8 sdk - https://docs.google.com/file/d/0B6U24pd58VX...zdZOVI0YUE/edit 3ds max 9 sdk - https://docs.google.com/file/d/0B6U24pd58VX...3B0Z2ZUUjA/edit 3ds max 2008 sdk - https://docs.google.com/file/d/0B6U24pd58VX...DVyQUR3Zms/edit 3ds max 2009 sdk - https://docs.google.com/file/d/0B6U24pd58VX...01zcHBYcFE/edit 3ds max 2010 sdk - https://docs.google.com/file/d/0B6U24pd58VX...UtiQWJvdGs/edit 3ds max 2011 sdk - https://docs.google.com/file/d/0B6U24pd58VX...HNseUxlQTg/edit 3ds max 2012 sdk - https://docs.google.com/file/d/0B6U24pd58VX...XNVNS1OQ0E/edit sdk 10 в 1 - http://narod.ru/disk/63303117001.aad7abc76...dk10in1.7z.html на наводку спасибо SnDEL Сообщение отредактировал ECXIMER - 18/11/2013, 09:07
Причина редактирования: добавил линки на SDK
|
|
|
26/10/2009, 11:29
Сообщение
#2
|
|
Знаток Группа: Пользователи Сообщений: 259 Регистрация: 25/11/2005 Пользователь №: 18 441 |
На мой взгляд очень интересная тема, я бы очень хотел чтобы она развивалась.Выкладывали простые примеры кода, обсуждали вопросы и т. д. Я не програмист и мне с SDK тежело разобраться, уже были попытки.Я тоже создавал подобную тему типа вопросы по SDK не пошло может в этот раз.
А зачем по русски? Смысл ты понял. Да ещё было бы очень здорово если бы найти примеры разобранные построчно ну или по блокам.В SDK на мой взгляд не всё понятно я хотел сделать свой шейп и очень долго разбирался как коменты весьма скудные, хотя возможно это потому что я не профи в програмировании. Сообщение отредактировал MadlasS - 26/10/2009, 11:34 |
|
|
26/10/2009, 15:17
Сообщение
#3
|
|
Уже не новичок Группа: Пользователи Сообщений: 11 Регистрация: 24/10/2009 Пользователь №: 73 795 |
Я для себя перевожу help по SDK, конспектируя и тренеруясь на примерах, и стараюсь всё записывать, думаю эти записи понадобятся, если будет реальная работа по разработке plug-in'а. Но глядя на то что уже есть, я вдруг подумал, люди пишут уроки, вот и на gamedev-е парочку видел, почему бы не сделать, что-нибудь для других, а как преподнести, чтобы было доходчиво, тут, конечно, проблема. А до этого хочется проверить правильно ли я понимаю, то что перевожу. Пока большинство собственных (не из SDK) примеров работают, значит большую часть я понимаю правильно!
Постараюсь что-нибудь выкладывать! |
|
|
26/10/2009, 18:41
Сообщение
#4
|
|
Знаток Группа: Пользователи Сообщений: 259 Регистрация: 25/11/2005 Пользователь №: 18 441 |
А ты пробовал делать, шейп?
Я не пойму, как "каркас"(интерфейс) для всего этого создать, можно это сделать визуально? Я делал так, брал ректангл из примеров, и под себя его правил, задолбало, захотел один спинер добавить, и довай по коду в 33 местах лазить.Наверно я чего-то не так делаю, хотя тоже работает. |
|
|
27/10/2009, 16:49
Сообщение
#5
|
|
Уже не новичок Группа: Пользователи Сообщений: 11 Регистрация: 24/10/2009 Пользователь №: 73 795 |
ОК! Shape так shape! Дай время попробую по полочкам разложить!
|
|
|
27/10/2009, 19:38
Сообщение
#6
|
|
Уже не новичок Группа: Пользователи Сообщений: 21 Регистрация: 10/09/2009 Пользователь №: 72 690 |
Очень важная тема!! Хэлп по MAX SDK, на мой взгляд, дурацкий - ничего не ясно, комментарии к функциям это просто развёрнутое название функции без объяснения принципиальных вещей, которые она делает. Топики тоже очень фрагментарно описывают работу МАКСа.
Я сейчас постоянно работаю с SDK, по профессии пишу плагины И есть вопрос - мне нужно добавить в сцену объекты непосредственно перед рендерингом, а сразу после нужно их удалить. С удалением проблем нет, а вот с добавлением есть. Всё работает, если добавлять объекты при обработке бродкаста NOTIFY_PRE_RENDER. Но я хочу добавлять объекты перед каждым кадром, а после рендеринга кадра сразу удалять, а потом перед рендерингом следующего кадра добавлять опять другие объекты и т.д. Для этих целей есть бродкаст NOTIFY_RENDER_PREEVAL. Но созданные при обработке этого бродкаста объекты в рендеринге не рендерятся, но в сцену добавляются (т.к. если после рендеринга их не удалить, они там появятся). Добавление объекта в сцену делаю так (клонирую объект, который в ноде pNode): Код Object* pDuplicateObj = NULL; // we duplicate object switch ( nDuplicateMethod ) { case DUPLICATE_METHOD_COPY: pDuplicateObj = dynamic_cast<Object*>( pNode->GetObjectRef()->Clone() ); break; case DUPLICATE_METHOD_INSTANCE: pDuplicateObj = pNode->GetObjectRef(); break; case DUPLICATE_METHOD_REFERENCE: pDuplicateObj = ::MakeObjectDerivedObject( pNode->GetObjectRef() ); break; default: assert( FALSE ); } // we create duplicate object node assert( pDuplicateObj ); pDuplicateNode = pInterface->CreateObjectNode( pDuplicateObj ); Может, нужно позвать ещё какую-нибудь функцию, типа "АпдэйтРендерСцен" ? Подскажите! Заранее благодарю. |
|
|
27/10/2009, 19:43
Сообщение
#7
|
|
Уже не новичок Группа: Пользователи Сообщений: 21 Регистрация: 10/09/2009 Пользователь №: 72 690 |
Насчёт перевода названий Reference system, ReferenceMaker, ReferenceTarget и т.д. - я бы эти названия не переводил, т.к. неудобно читать хэлп с русскими названиями, а потом думать, как это написать в коде по-английски.. Да и незачем это - пусть читающие воспринимают названия как абстрактные. Да кодеров без знания английского нет, я думаю, т.к. почти все языки англоязычные.
|
|
|
28/10/2009, 16:57
Сообщение
#8
|
|
-.-.-.-.-.-.-.-.-.-.-.- Группа: Модераторы Сообщений: 3 915 Регистрация: 21/06/2002 Из: Нерезиновая Пользователь №: 128 |
Действительно, по MaxSDK не так много доступной и понятной страждущим информации. Надеюсь, что эта тема получит дальнейшее развитие, поэтому поднимаю её в "важные".
|
|
|
28/10/2009, 23:12
Сообщение
#9
|
|
Мастер Группа: Участник Сообщений: 1 431 Регистрация: 09/11/2004 Из: SPb Пользователь №: 8 229 |
Не господа, не с того боку начали. Может я и не прав конечно, но пока дойдешь до ReferenceMarcker и т.п - нужно много что другого знать. Я, к своему стыду наверно, даже не знаю толком что они делают :-)
На мой взгляд, "простого смертного", начинать изучать SDK нужно с понимания какие классы соответствуют тем или иным объектам макса, и правильно их уметь наследовать. Весь SDK сделан таким образом, что пока не отнаследуешь нужное - работать не будет. Я пользуюсь при написании нового плугина Max Wizard. Т.е. шаблоном для создания нового плугина. Он создаст новый клас отнаследованный от нужного класса и пропишет пустые функции, которые нужно потом заполнить своим кодом. Основная, инициализирующая функция плугина, чтобы Макс увидел плугин, описана обычно в DllEntry.cpp BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID){...} там -же должны быть функции обязательные для инициализации плугина в максе - их список в файле *.def LibClassDesc должна вернуть максу пронициализированный класс ClassDesc2 плугина (т.е. класс который отнаследован от ClassDesc2), который в свою очередь в своем конструктороре инициализирует основной класс модификатора, карты, объекта, рендера и т.п. Каждый класс который наследуется требует обязательного описания нескольких функций, например имя которое мы видим в максе, тип, что он возращает, и т.п. у кажого свои, но они обязательны. Вот пока не разберешься с ClassDesc2, как он наследуется, что он инициализируе - про Referenc можно забыть пока. |
|
|
29/10/2009, 12:26
Сообщение
#10
|
|
Знаток Группа: Пользователи Сообщений: 259 Регистрация: 25/11/2005 Пользователь №: 18 441 |
Странно но у меня Визард не работае, может потому что студия 2008, а не 2005?
На сколько я помню в 2005 работал, но там далеко не все типы плагов поддерживались,обнавлений небыло? и ещё по поводу сплайнов.Можна както вызвать функцию булеан, для двух сплайнов? на сколько я понял у SplineShape есть френд SSBolean.. (как то так) и он возвращает SplineShape, но как этим воспользоваться я не пойму.Как вообше эо работает? Булеан, атач.Только по Pick. Можно что-то вроде: Boolean(Splineshape *ss1,Splineshape *ss2,int operation) P.S. Огромное спасибо 3DZver за подём темы. Огромное спасибоVG, что делится своим опытом, так держать. Сообщение отредактировал MadlasS - 29/10/2009, 12:33 |
|
|
29/10/2009, 13:17
Сообщение
#11
|
|
Уже не новичок Группа: Пользователи Сообщений: 21 Регистрация: 10/09/2009 Пользователь №: 72 690 |
Я использую MAX SDK 2010, для него вообще нужна студия 2009...
Ребята, ещё раз поднимаю вопрос, который был 5-ю постами ранее - вопрос про то, что если добавить объекты в сцену непосредственно перед рендерингом, то они в сцене появятся, но не отрендерятся. Очень нужно решить проблему... а после этого готов по мере возможности ответить на интересующие вопросы по MAX SDK , ибо опыт накопился уже немалый Сообщение отредактировал VaniaVania - 29/10/2009, 13:45 |
|
|
29/10/2009, 17:16
Сообщение
#12
|
|
Мастер Группа: Участник Сообщений: 1 431 Регистрация: 09/11/2004 Из: SPb Пользователь №: 8 229 |
Я использую MAX SDK 2010, для него вообще нужна студия 2009... Смотря для каких задач скорее. Я пока 2009 студию не пользую. Глючит она непомерно. А для модификаторов 2008 хватает ... - вопрос про то, что если добавить объекты в сцену непосредственно перед рендерингом, то они в сцене появятся, но не отрендерятся. А в классе Interface нет ничего интересного для апдайта перед рендером? Там много всего вкусного |
|
|
30/10/2009, 11:05
Сообщение
#13
|
|
Знаток Группа: Пользователи Сообщений: 259 Регистрация: 25/11/2005 Пользователь №: 18 441 |
VG а у тебя SDK 2010? визард работает?
У меня 2009 SDK и студия 2008, с визардом вроде сделал всё как в инструкции написано, создаю новый проект, выбираю 3дмах апликейшн и ничего не происходит подскажите чё не так может быть? Сообщение отредактировал MadlasS - 30/10/2009, 11:28 |
|
|
30/10/2009, 12:07
Сообщение
#14
|
|
Знаток Группа: Пользователи Сообщений: 259 Регистрация: 25/11/2005 Пользователь №: 18 441 |
VaniaVania а можно-ли вобще так сделать, я пробовал менять параметры объекта NOTIFY_RENDER_PREEVAL правдо на скрипте, макс вообще вылетает.Код скрипта:
txt = "for o in geometry do(\n" txt +="if classof o.baseObject == Sphere then \n" txt +="o.baseObject.segments *= 2.0\n" txt +=")\n" callbacks.addscript #preRendereval txt id:#sphere_segs причём по одному кадру всё работает, а если 2 подряд 0-1 на втором вылетает. вот я и думаю, может макс все объекты при рендери грузит только один раз при старте. VaniaVania может так: сделать цикл, отрендерить по одному кадру а потом объедени последовательность.но наверно тебе эо не подайдёт. |
|
|
30/10/2009, 13:04
Сообщение
#15
|
|
Уже не новичок Группа: Пользователи Сообщений: 21 Регистрация: 10/09/2009 Пользователь №: 72 690 |
MadlasS, насчёт визарда ничего не подскажу, никогда ими не пользовался.
Скрипты тоже не знаю, поэтому пример скрипта никак для меня не проясняет картину... Теперь о бродкастах - для рендеренга ведь есть 3 бродкаста (которые перед рендерингом): NOTIFY_PRE_RENDER - вызывается перед началом всего рендеринга, со сценой можно делать что угодно. NOTIFY_RENDER_PREEVAL - вызывается перед построением сцены для рендеринга конкретного кадра. Матрицы трансформов апплаятся, но созданные объекты или взведение флага "SetRenderable" нет. NOTIFY_PRE_RENDERFRAME - сцену никак нельзя менять, ибо она вся уже загружена. По моей логике, как раз NOTIFY_RENDER_PREEVAL должен быть для того, чтобы для конкретного кадра менять сцену. Моя задача такая - плагин рассаживает объекты, в сцену они добавляются только при рендеринге, а потом удаляются. Для экономии памяти хочу, чтобы для рендеринга загружались только те объекты, которые попадают в камеру, а остальных вообще не было в сцене. Если сцена анимированная, то такое добавление/удаление нужно делать перед рендерингом каждого кадра. |
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 25/04/2024 - 20:43 |