3DCenter.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> FAQ по MaxSDK, Архитектура, понятия, методы, примеры и т.д.
VaniaVania
сообщение 07/12/2009, 19:21
Сообщение #31


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 21
Регистрация: 10/09/2009
Пользователь №: 72 690



Всем привет. Вопрос такой - каким образом 3D Max рендерит с помощью Mental Ray? Mental Ray может работать как 'stand alone'-приложение, так и встроенным в 3D Max. Когда Max рендерит с помощью встроенного Mental Ray, знает ли последний о том, что он работает с Max? Mental Ray сам берёт сцену из Max и рендерит её или Max на лету генерирует .mi файлы и подсовывает их в Mental Ray для рендеринга? Мой плагин для 3D Max рассаживает обычные максовские объект в большом количестве по другому объекту (например, деревья по ландшафту). Нужно заставить Mental Ray рендерить эти объекты, создавая в своей памяти только один экземпляр и храня для всех них только матрицы положений в пространстве.
Go to the top of the page
 
+Quote Post
Karba
сообщение 16/12/2009, 20:53
Сообщение #32


Creator
Иконка группы

Группа: AWARD
Сообщений: 3 749
Регистрация: 08/12/2002
Пользователь №: 1 252



У базового класса animatable есть функции RenderBegin и RenderEnd, или что-то вроде того. В этих функциях можно перед рендером накидать в макс объектов, а после рендера, удалить.
Гарантированно работает под vray. В ментале не проверял, но думаю, должно работать.

Сообщение отредактировал ECXIMER - 17/04/2012, 15:35
Go to the top of the page
 
+Quote Post
VaniaVania
сообщение 19/12/2009, 00:43
Сообщение #33


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 21
Регистрация: 10/09/2009
Пользователь №: 72 690



У класса Animatable нет таких функций, можно просто перехватывать подобные броадкасты. Плюс то, о чём вы говорите, для каждого созданного объекта будет тратить память МАКСа, а её не так много в 32-х разрядном варианте. А задача состоит в том, чтобы Ментал для рендера многих объектов по факту обращался всё время к одному объекту. Для ВРэй мне удалось это сделать, хочу тоже самое для Ментал Рэй.

Сообщение отредактировал ECXIMER - 17/04/2012, 15:36
Go to the top of the page
 
+Quote Post
Karba
сообщение 19/12/2009, 11:35
Сообщение #34


Creator
Иконка группы

Группа: AWARD
Сообщений: 3 749
Регистрация: 08/12/2002
Пользователь №: 1 252



Тогда ментал SDK и вперед. Пишем геометрический шейдер.

Сообщение отредактировал ECXIMER - 17/04/2012, 15:36
Go to the top of the page
 
+Quote Post
exlevel
сообщение 19/12/2009, 15:06
Сообщение #35


Советчик
Иконка группы

Группа: Пользователи
Сообщений: 87
Регистрация: 22/04/2008
Пользователь №: 63 568



Всем привет!

Вот столкнулся с проблемой... Можем ли мы изменять размеры свитков на командной панели, созданные с помощью:
ip->AddRollupPage(hInstance, MAKEINTRESOURCE(IDD_DLG), ... );
Т.е. созданные из ресурсов?
Есть задача изменять размер некоторого контрола (причем, интерактивно, двигая некий ползунок), и к тому же надо передвигать остальные контролы, находящиеся ниже данного. Но при этом, мы не можем изменить размер самого свитка (по крайней мере я не нашел как это сделать).

Остается только один вариант для меня: Создавать этот свиток программно, не из ресурсов. И при изменении размеров контрола, пересоздавать его. Но это слишком муторно, и не понятно как это все будет выглядеть...
Есть ли у кого идеи на этот счет?

Заранее спасибо!
Go to the top of the page
 
+Quote Post
VaniaVania
сообщение 21/12/2009, 14:21
Сообщение #36


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 21
Регистрация: 10/09/2009
Пользователь №: 72 690



Цитата(Karba @ 19/12/2009, 11:35) *
Тогда ментал SDK и вперед. Пишем геометрический шейдер.


Как написать геометрический шейдер, я понял. Как теперь заставить Ментал Рэй использовать этот шейдер? Задача такая - есть обычный максовский геометрический объект. Я создал плоскую квадратную поверхность (Plane) и хочу, чтоб Ментал Рэй отрендерил этот обычный максовский объект в количестве 1000 штук в заданных мною местах. Просто скопировать туда эти объекты не хочу. Пусть я написал геометрический шейдер, как теперь программно заставить Ментал Рэй отрендерить стандартный максовский объект с помощью этого шейдера? В Ментал СДК про это ничего не сказано, т.к. там СДК для Ментала как для Stand-alone приложения. В МАКС СДК про это буквально пара строк, из которых я ничего не понял... Написал письмо автодеску, они меня отправили всё к тем же двум строкам МАКС СДК.

Сообщение отредактировал ECXIMER - 17/04/2012, 15:37
Go to the top of the page
 
+Quote Post
VaniaVania
сообщение 21/12/2009, 15:11
Сообщение #37


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 21
Регистрация: 10/09/2009
Пользователь №: 72 690



2 exlevel

Я в МАКС СДК не нашёл способов изменять размеры диалогов на панели. Остаётся только низкоуровневый способ делать это руками, но это не очень хорошо, т.к. багов будет куча, скорее всего. Для чего вообще нужно это, динамически изменять размер диалога? зачем такой изврат в интерфейсе?

Сообщение отредактировал ECXIMER - 17/04/2012, 15:38
Go to the top of the page
 
+Quote Post
exlevel
сообщение 21/12/2009, 16:55
Сообщение #38


Советчик
Иконка группы

Группа: Пользователи
Сообщений: 87
Регистрация: 22/04/2008
Пользователь №: 63 568



В некоторых свитках плагина имеются списки (ListBox'ы), и вот хочется менять их вертикальный размер за их нижнюю границу, так же как и у списка модификаторов на панели Modify... В принципе, это не обязательно, но при большом количестве элементов, хотелось бы увеличить размеры такого списка.

Сообщение отредактировал ECXIMER - 17/04/2012, 15:38
Go to the top of the page
 
+Quote Post
Lastjedi
сообщение 21/12/2009, 19:17
Сообщение #39


Учитель
Иконка группы

Группа: Участник
Сообщений: 322
Регистрация: 18/06/2002
Из: Москва
Пользователь №: 72



А эту функцию не пробовал?
CODE
void IRollupWindow::SetPageDlgHeight (int index, int height)

Remarks:
This method is used to change the height of a rollup page.

Parameters:
int index - The index of the rollup to change.
int height - The new height of the dialog in pixels.
Go to the top of the page
 
+Quote Post
exlevel
сообщение 22/12/2009, 10:15
Сообщение #40


Советчик
Иконка группы

Группа: Пользователи
Сообщений: 87
Регистрация: 22/04/2008
Пользователь №: 63 568



Во, точно, спасибо!!! biggrin.gif
Просто это класс IRollupWindow, который используется для отдельных окон со свитками, вот что про это сказано:
Цитата
Description:
This control is used to access existing rollup pages or if you are creating a dialog box which will not be used in the command panel. This control may be used to add a container area for rollup pages to be added to the dialog, and provides a scroll bar just like the command panel itself.
Note that this is a special case. Normally, adding rollup pages to the command panel is done using the simple AddRollupPage() method of the Interface class. This control is only used when you want to have a scrolling region for rollup pages in a dialog box.

Поэтому и не думал как-то это использовать...
Но связать с командной панелью всетаки удалось, есть даже функция в интерфейсе для этого GetCommandPanelRollup(); smile.gif
В итоге, решил проблему вот так:
Код
IRollupWindow* irw = ip->GetCommandPanelRollup();
int i = irw->GetPanelIndex(hWnd); // получаем индекс свитка
int h = irw->GetPanelHeight(i);      // получаем текущую высоту
irw->SetPageDlgHeight(i, h+10);   // увеличиваем эту высоту на 10

Спасибо еще раз за наводку!!!

Сообщение отредактировал ECXIMER - 17/04/2012, 15:40
Go to the top of the page
 
+Quote Post
VaniaVania
сообщение 30/12/2009, 21:26
Сообщение #41


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 21
Регистрация: 10/09/2009
Пользователь №: 72 690



Всем привет! Есть у меня заанимированный объект - кубик, у которого две вершины движутся. анимировал с помощью AutoKey - выставил их на 0-м и 100-м кадре. Как программно сдвинуть эти ключи, чтоб анимация была не в диапазоне "1-й кадр - 100-й кадр", а, например, в диапазоне "50-й кадр - 150-й кадр"? Я сумел доступиться до каждого контроллера положения вершины кубика, но вот сдвинуть ключи у этих контроллеров пока не смог.

Проблема решена, вот как я реализовал функцию, которая сдвигает ключи анимации объекта на заданное значение TimeValue:
Код
BOOL MoveObjectAnimationKeys( Object* pObj, TimeValue moveTime )
{
  if ( pObj == NULL )
  {
    return FALSE;
  }

  // контроллеры объекта хранятся как ссылки.
  // пробегаем по всем ссылкам, и смотрим, какие из них являются контроллерами
  int nNumRefs = pObj->NumRefs();
  for ( int iRef = 0; iRef < nNumRefs; ++ iRef )
  {
    RefTargetHandle pReference = pObj->GetReference( iRef );
    if ( pReference )
    {
      // если ссылка 'pReference' является контроллером, то её 'SClassID' будет одним из ниже перечисленных
      switch ( pReference->SuperClassID() )
      {
      case CTRL_FLOAT_CLASS_ID:
      case CTRL_POINT3_CLASS_ID:
      case CTRL_MATRIX3_CLASS_ID:
      case CTRL_POSITION_CLASS_ID:
      case CTRL_ROTATION_CLASS_ID:
      case CTRL_SCALE_CLASS_ID:
      case CTRL_MORPH_CLASS_ID:
        {
          // преобразуем ссылку в указатель на контроллер безопасным способом
          Control* pControl = dynamic_cast<Control*>( pReference );
          if ( pControl )
          {
            // получаем для контроллера интерфейс ключей анимации
            IKeyControl* pKeyControl = GetKeyControlInterface( pControl );
            if ( pKeyControl )
            {
              // у разных типов контроллеров разные типы ключей,
              // но каждый из них унаследован от типа 'IKey'.
              // выделяем нужное количество памяти для внутренних данных ключей
              BYTE* pKeyData = new BYTE[pKeyControl->GetKeySize()];
              IKey* pKey = reinterpret_cast<IKey*>( pKeyData );

              // получаем количество ключей и у каждого меняем временнУю метку
              int nNumKeys = pKeyControl->GetNumKeys();
              for ( int iKey = 0; iKey < nNumKeys; ++ iKey )
              {
                pKeyControl->GetKey( iKey, pKey ); // получаем ключ
                if ( ! (pKey->flags & IKEY_TIME_LOCK) ) // у ключа есть флаги, один из которых запрещает менять временнУю метку
                {
                  pKey->time += moveTime; // меняем временнУю метку ключа
                  pKeyControl->SetKey( iKey, pKey ); // задаём ключ с новой временнОй меткой
                }
              }

              delete [] pKeyData;
            }
          }
        }
        break;
      }
    }
  }

  return TRUE;
}


Сообщение отредактировал ECXIMER - 17/04/2012, 15:40
Go to the top of the page
 
+Quote Post
suprunai
сообщение 16/01/2010, 17:13
Сообщение #42


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 11
Регистрация: 24/10/2009
Пользователь №: 73 795



Кто сведущь в этом вопросе помогите!
В справке по SDK:
Indirect references - Indirect references are like weak direct references but prevent the propagation of message sent from the ReferenceMaker to the ReferenceMaker from propagating to any other ReferenceTarget that observe the ReferenceMaker. The purpose of an indirect reference is to model reciprocal subject-observer relationships between scene elements.

Тут нет ошибки (обр. внимание на выделенный текст)? Если нет, ток как это понять?

А в этом обзаце:
Objects that wish to be notified of changes in target objects (i.e. observers) are called reference makers and must derive from ReferenceMaker. The target object (i.e. subject) is called the reference target and must derived from ReferenceTarget. Because observers can also be subjects, ReferenceMaker derives from ReferenceTarget.

В иерархии классов наоборот или я вообще ничего не понимаю!!!!!
Go to the top of the page
 
+Quote Post
VaniaVania
сообщение 21/01/2010, 01:47
Сообщение #43


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 21
Регистрация: 10/09/2009
Пользователь №: 72 690



Цитата(suprunai @ 16/01/2010, 17:13) *
А в этом обзаце:
Objects that wish to be notified of changes in target objects (i.e. observers) are called reference makers and must derive from ReferenceMaker. The target object (i.e. subject) is called the reference target and must derived from ReferenceTarget. Because observers can also be subjects, ReferenceMaker derives from ReferenceTarget.

В иерархии классов наоборот или я вообще ничего не понимаю!!!!!


Я так понимаю, что здесь правильно, а в иерархии классов ошибка. Т.к. написанное в тексте вполне логично - объект изначально ReferenceTarget (источник сообщений), а уже только потом ReferenceMaker (приёмник сообщений), поэтому ReferenceMaker унаследован от ReferenceTarget. Хотя стоит в самом SDK посмотреть, кто от кого унаследован...

Цитата(suprunai @ 16/01/2010, 17:13) *
Кто сведущь в этом вопросе помогите!
В справке по SDK:
Indirect references - Indirect references are like weak direct references but prevent the propagation of message sent from the ReferenceMaker to the ReferenceMaker from propagating to any other ReferenceTarget that observe the ReferenceMaker. The purpose of an indirect reference is to model reciprocal subject-observer relationships between scene elements.

Тут нет ошибки (обр. внимание на выделенный текст)? Если нет, ток как это понять?


Тут ошибки нет, другими словами - отличие прямой и непрямой ссылки таково:
если объект (О1) владеет прямой ссылкой (С) (Maker владеет Target'ом) и при этом этот объект сам является ссылкой для кого-то другого объекта (О2), то сообщение, посланное ссылкой С1, будет получено объектом О1, а затем объектом О2 (и так далее, если объектом О2 ещё кто-то владеет). Если же в такой же ситуации объект О1 владеет непрямой ссылкой С, то сообщение, сгенерированное С, получит только объект О1.

В самом SDK ReferenceTarget унаследован от ReferenceMaker... значит, в документации ошибка

Сообщение отредактировал ECXIMER - 17/04/2012, 15:44
Go to the top of the page
 
+Quote Post
suprunai
сообщение 25/01/2010, 16:24
Сообщение #44


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 11
Регистрация: 24/10/2009
Пользователь №: 73 795



Но если заглянуть в include файл ref.h, то как и в диаграмме ниже class ReferenceTarget : public ReferenceMaker {} т.е. ошибка есть, но не в иерархии. Где логика? Я чего то не могу уловить или изначально неправильно понимаю! Может кто популярно?

Сообщение отредактировал ECXIMER - 17/04/2012, 15:44
Прикрепленные изображения
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
VaniaVania
сообщение 25/01/2010, 22:49
Сообщение #45


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 21
Регистрация: 10/09/2009
Пользователь №: 72 690



Ну очевидно, раз в реальности в файле "ref.h" ReferenceTarget унаследован от ReferenceMaker, то значит ошибка в тексте документации smile.gif Либо случайно так получилось, либо несогласованность разработчиков и технических писателей

Сообщение отредактировал ECXIMER - 17/04/2012, 15:45
Go to the top of the page
 
+Quote Post
Bots
сообщение Системное сообщение






4 страниц V  < 1 2 3 4 >
Fast ReplyReply to this topicStart new topic

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 28/03/2024 - 22:27