Quest3D - Русскоязычное сообщество

Quest3D => Программирование => Тема начата: mihanandr от 22 Мая 2011, 12:35:44



Название: OO Member type: channel - как с ним работать
Отправлено: mihanandr от 22 Мая 2011, 12:35:44
Привет! такой вопрос.
У member у класса по мимо vector, value и т.п. есть еще Channel. например такой:
http://img807.imageshack.us/img807/895/26804457.jpg
Вопрос как с ним работать. Конкретно как у экземпляру присвоить конкретное значение.

Для примера накидал сценку. Полочки с коробочками.
Хочется геометрию, то есть канал 3Dobject чтобы был членом класса. При рендеринге пробегать по массиву объектов и вызывать 3Dobject от туда.

сцену можно скачать тут: http://narod.ru/disk/13627824001/q.rar.html

вот OOEditor:
http://img807.imageshack.us/img807/895/26804457.jpg

это каналы геометрии:
http://img823.imageshack.us/img823/9733/10507713.jpg
там Box_red стоит отдельно внизу. вот конкретно его и хочется убрать в объект

вот сам главный цикл:
http://img849.imageshack.us/img849/3982/78552614.jpg

правая ветка рендеринг,левая что-то вроде инициализации.
Нас интересует 3Dobj->3Do
справа он участвует в рендеринге,
а слева он "повис в воздухе", и что с ним делать не понятно.
рядышком висит ярлык на "BOX red", который и нужно толи скопировать туда, толи не понятно.

для Value например есть канал SetValue, он копирует из одного Value в другой. а как скопировать 3D object.
Может даже лучше не копировать, ярлык прямо в класс зачунуть.
в общем Help!

в результате должна получиться такая картинка:
http://img195.imageshack.us/img195/4904/66975243.jpg
только наш BOX red на самом деле синенький  ;D

вот


Название: Re: OO Member type: channel - как с ним работать
Отправлено: Devastor от 22 Мая 2011, 13:28:11
Можно сделать так: создать в интерфейсе класса функцию типа channel:3dObject с входными параметром типа value и matrix например. Потом сделать channel switch типа 3dObject и указать как таргет функции и в этом классе хранить все объекты. А в главном цикле вызывать объект по индексу тот, который требуется.
Это реализует схему вызова, правда, не через OO.
Сам не знаю как элементу класса, для которого нет стандартных команд, типа setValue присваивать значения, если узнаешь, скажи =)

http://img43.imageshack.us/img43/1788/tempqn.jpg


Название: Re: OO Member type: channel - как с ним работать
Отправлено: Corpic от 22 Мая 2011, 22:17:14
Сохранить канал в буфер. Затем загрузить буфер в канал. Так можно передать подчти что все.


Название: Re: OO Member type: channel - как с ним работать
Отправлено: mihanandr от 24 Мая 2011, 07:58:25
Devastor, пасибо - получилось.

Corpic, а поподробней можно?
что за буфер? буфер обмена?
и как его вставлять в OO Class Instances List?


Название: Re: OO Member type: channel - как с ним работать
Отправлено: Corpic от 24 Мая 2011, 17:52:39
Все стандартные каналы квеста.


Название: Re: OO Member type: channel - как с ним работать
Отправлено: mihanandr от 26 Мая 2011, 10:40:22
Corpic, спасибо - всё отлично копируется!

С ООП разобрался.
вот пример простой сцены сделал:
http://narod.ru/disk/14074062001/OO.zip.html

В ней два класса:
http://img843.imageshack.us/img843/5332/36429941.jpg

В классе менеджера есть список, в котором храним c3DO, который как раз хранит member Channel:3D ObjectData

менеджер также имеет функциию insert_3DO с параметром ObjectData.
Вот тут показан вызов функций, где параметром передаются три ObjectData, которые были экспортированы из 3Dmax'a
http://img831.imageshack.us/img831/6623/97587063.jpg

Сама функция добавления:
http://img135.imageshack.us/img135/2857/16325000.jpg

Смысл такой:
Создаём новый экземпляр класса и ложим в контейнер, получая индекс.
По этому индексу получаем ССЫЛКУ на элемент списка по полученному индексу.
Ну и по рецепту Corpic'а через буффер копируем, используя полученную ссылку на добавленный экземпляр класса из списка.

вроде всё.
всем спасибо  ;D


Название: Re: OO Member type: channel - как с ним работать
Отправлено: dfx от 26 Мая 2011, 14:54:18
mihanandr
На мой взгляд тут есть один нехороший баг и небольшие усложнения того, что можно было сделать проще.

Баг в том, что данные из буфера не чистятся и в нем всегда будет то, что в последний раз через него копировал. Кроме того, эти данные сохраняются вместе с цгр файлом. И если, перед сохранением что то копировалось, то ЦГР-файл будет весить больше ровно на столько, сколько весили эти данные.

Вввиду этого стоит написать функцию копирования каналов. Создавать копию класса с полем буффера, переносить через него данные и уничтожать эту копию после копирования.

Например -
Функция для копирования через буффер
(http://img847.imageshack.us/img847/5420/templateooscreenshot01.jpg) (http://imageshack.us/photo/my-images/847/templateooscreenshot01.jpg/)

Функция добавления 3д-даты

(http://img217.imageshack.us/img217/1663/templateooscreenshot00.jpg) (http://imageshack.us/photo/my-images/217/templateooscreenshot00.jpg/)



Название: Re: OO Member type: channel - как с ним работать
Отправлено: mihanandr от 26 Мая 2011, 15:06:21
dfx, да.

Но больше чем буфер меня волнует то, что копируются(дублируются) ВСЕ данные, проходящие через это.

т.е. если пропустить десять ObjectData по 10 мб, итого 100 мегабайт, то если я правильно понимаю они все продублируются. И в памяти будет 100мб + 100мб копии+ 10мб буфер...

Может как то можно убить каналы в cdr не по настоящему  ;D
Т.е. чтоб в самом файле они были, а при проигрывании убивались. в общем я запутался.

Будут еще идеи?..


Название: Re: OO Member type: channel - как с ним работать
Отправлено: dfx от 26 Мая 2011, 17:39:50
mihanandr
Это смотря что тебе нужно. Честно говоря я не вижу в этом проблемы.
 
Можно вообще убивать исходные каналы с которых скопировал данные в список и хранить их в списке. А менеджером добавлять в список рендера только ссылки на них.

Можно подгружать цгрки, копировать с них данные в список и отключать их от проекта. Тогда, надо не забыть, в списке нужно убрать галочку "Save Data", которая отвечает за сохранение данных в списке в файл ЦГР.

А можно пользоваться каналом "SceneImporter" и грузить геометрию из Collada- файлов. Там на выходе получаются именно ОО-объекты. Минус этого метода только в том, что он не работает со скинеными объектами, в остальном хорошо работает.

Т.ч. сам выбирай.   ;)

Про кастом ченнелы и уже не пишу.. ;D


Название: Re: OO Member type: channel - как с ним работать
Отправлено: Corpic от 26 Мая 2011, 19:14:51
Если речь идет только о 3DObjectData, то этот канал легко копируется в другой 3D_OD при помощи Command_new_interface (misc/add object data)


Название: Re: OO Member type: channel - как с ним работать
Отправлено: mihanandr от 27 Мая 2011, 07:35:34
еще раз спасибо, понятно, что многое мне еще не ведомо )))

А можно как нибудь получить просто некую ссылку на канал, а её уже в массив и с через неё работать? это был бы самый тот вариант.


Название: Re: OO Member type: channel - как с ним работать
Отправлено: Sqwer от 27 Мая 2011, 12:19:33
Линк-нода   (та  что   единственная  выше прямоугольника канала)   - это и есть указатель на объект.

В квесте  предусмотренно  сохранение указателей  типизированных данных  в массиве. 


При создании нового поля   выбираем   радиоботон на последнем варианте "Pointer"  и  указываем  тип объекта.


чтобы воспользоваться указателем  нужно поместить канал "Array_pointer".

Таким образом мы  в массиве храним  не    сами объекты, а их 4ёх байтовые указатели.

PS На указателях  построена вся логика Квеста.


Название: Re: OO Member type: channel - как с ним работать
Отправлено: mihanandr от 27 Мая 2011, 12:48:26
А вот это уже интереснее  ;D
Sqwer, всё понял.

А еденичный указатель можно получить/хранить?


Название: Re: OO Member type: channel - как с ним работать
Отправлено: Sqwer от 27 Мая 2011, 14:12:05
Возможно  это можно   сделать  прибегнув к каналу  Буффер.

зы  канал Буффер  - это массив  4ёх  байтовых единиц.
Код:
DWORD* name;
name = new DWORD[n];

где n- округлёное до целого     (размер типа)/4

 


Название: Re: OO Member type: channel - как с ним работать
Отправлено: DimiS от 30 Мая 2011, 15:16:07
Если речь идет только о 3DObjectData, то этот канал легко копируется в другой 3D_OD при помощи Command_new_interface (misc/add object data)
плюсую, это проверенный и надёжный способ
копирование через буфер не рекомендую так как может привести к неожиданным багам при копировании обычного ченела в мембер ОО интерфейса или наоборот

еще раз спасибо, понятно, что многое мне еще не ведомо )))

А можно как нибудь получить просто некую ссылку на канал, а её уже в массив и с через неё работать? это был бы самый тот вариант.
поидее это можно сделать через квестовые арреи, но все равно метод этот сложен для понимания мозгом, и тебе нужно где-то хранить экземпляры, и если ты хочешь добавлять новые экземпляры динамически(а для нормальных тасков это обычно необходимо) то с этим возникнет ещё больше проблем.
я рекомендую воспользоваться квестовым ОО, только ты будешь хранить не сами экземпляры ченелов и ссылки на них а экземпляры классов и ссылки на них, а вот у классов уже мемберами будут описаны твои ченелы. Работая с ОО у тебя будет возможность добавлять динамически новые экземпляры, создавать списки указателей, хранить "единичный" указатель


Название: Re: OO Member type: channel - как с ним работать
Отправлено: mihanandr от 30 Мая 2011, 15:23:54
всем спасибо.

Пока оставлю так, а потом посмотрим.

Для конкретно моей задачи склоняюсь делать класс, а в нём member channel array , а в нём указатели... как то в этом направлении.


Название: Re: OO Member type: channel - как с ним работать
Отправлено: DimiS от 30 Мая 2011, 15:30:26
поверь, member channel array тебе там совершенно не нужен
просто пытаюсь сэкономить тебе время и нервы)