20 Мая 2024, 09:46:37
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Навигация по форуму







guest3d
Quest3D - Русскоязычное сообщество > Quest3D > Программирование > OO Member type: channel - как с ним работать
OO Member type: channel - как с ним работать
(Прочитано 14292 раз)
  [1] 2
Печать
mihanandr | * | Новичок | Сообщений: 13 | « 22 Мая 2011, 12:35:44 »
OO Member type: channel - как с ним работать |
0
Привет! такой вопрос.
У 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 на самом деле синенький  Смеющийся

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

http://img43.imageshack.us/img43/1788/tempqn.jpg
« Последнее редактирование: 22 Мая 2011, 13:39:25 от Devastor »
Corpic | * | Новичок | Сообщений: 23 | «Ответ #2 22 Мая 2011, 22:17:14 »
Re: OO Member type: channel - как с ним работать |
2
Сохранить канал в буфер. Затем загрузить буфер в канал. Так можно передать подчти что все.
mihanandr | * | Новичок | Сообщений: 13 | «Ответ #3 24 Мая 2011, 07:58:25 »
Re: OO Member type: channel - как с ним работать |
3
Devastor, пасибо - получилось.

Corpic, а поподробней можно?
что за буфер? буфер обмена?
и как его вставлять в OO Class Instances List?
Corpic | * | Новичок | Сообщений: 23 | «Ответ #4 24 Мая 2011, 17:52:39 »
Re: OO Member type: channel - как с ним работать |
4
Все стандартные каналы квеста.

* buffer.png (40.87 Кб, 444x415 - просмотрено 1480 раз.)
« Последнее редактирование: 24 Мая 2011, 18:39:17 от Corpic »
mihanandr | * | Новичок | Сообщений: 13 | «Ответ #5 26 Мая 2011, 10:40:22 »
Re: OO Member type: channel - как с ним работать |
5
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'а через буффер копируем, используя полученную ссылку на добавленный экземпляр класса из списка.

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

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

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

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

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

(http://img217.imageshack.us/img217/1663/templateooscreenshot00.jpg)

mihanandr | * | Новичок | Сообщений: 13 | «Ответ #7 26 Мая 2011, 15:06:21 »
Re: OO Member type: channel - как с ним работать |
7
dfx, да.

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

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

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

Будут еще идеи?..
« Последнее редактирование: 26 Мая 2011, 15:08:13 от mihanandr »
dfx | ** | Пользователь | Сообщений: 95 | «Ответ #8 26 Мая 2011, 17:39:50 »
Re: OO Member type: channel - как с ним работать |
8
mihanandr
Это смотря что тебе нужно. Честно говоря я не вижу в этом проблемы.
 
Можно вообще убивать исходные каналы с которых скопировал данные в список и хранить их в списке. А менеджером добавлять в список рендера только ссылки на них.

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

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

Т.ч. сам выбирай.   Подмигивающий

Про кастом ченнелы и уже не пишу.. Смеющийся
« Последнее редактирование: 26 Мая 2011, 17:42:49 от dfx »
Corpic | * | Новичок | Сообщений: 23 | «Ответ #9 26 Мая 2011, 19:14:51 »
Re: OO Member type: channel - как с ним работать |
9
Если речь идет только о 3DObjectData, то этот канал легко копируется в другой 3D_OD при помощи Command_new_interface (misc/add object data)
mihanandr | * | Новичок | Сообщений: 13 | «Ответ #10 27 Мая 2011, 07:35:34 »
Re: OO Member type: channel - как с ним работать |
10
еще раз спасибо, понятно, что многое мне еще не ведомо )))

А можно как нибудь получить просто некую ссылку на канал, а её уже в массив и с через неё работать? это был бы самый тот вариант.
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #11 27 Мая 2011, 12:19:33 »
Re: OO Member type: channel - как с ним работать |
11
Линк-нода   (та  что   единственная  выше прямоугольника канала)   - это и есть указатель на объект.

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


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


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

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

PS На указателях  построена вся логика Квеста.
mihanandr | * | Новичок | Сообщений: 13 | «Ответ #12 27 Мая 2011, 12:48:26 »
Re: OO Member type: channel - как с ним работать |
12
А вот это уже интереснее  Смеющийся
Sqwer, всё понял.

А еденичный указатель можно получить/хранить?
« Последнее редактирование: 27 Мая 2011, 13:53:12 от mihanandr »
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #13 27 Мая 2011, 14:12:05 »
Re: OO Member type: channel - как с ним работать |
13
Возможно  это можно   сделать  прибегнув к каналу  Буффер.

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

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

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

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

А можно как нибудь получить просто некую ссылку на канал, а её уже в массив и с через неё работать? это был бы самый тот вариант.
поидее это можно сделать через квестовые арреи, но все равно метод этот сложен для понимания мозгом, и тебе нужно где-то хранить экземпляры, и если ты хочешь добавлять новые экземпляры динамически(а для нормальных тасков это обычно необходимо) то с этим возникнет ещё больше проблем.
я рекомендую воспользоваться квестовым ОО, только ты будешь хранить не сами экземпляры ченелов и ссылки на них а экземпляры классов и ссылки на них, а вот у классов уже мемберами будут описаны твои ченелы. Работая с ОО у тебя будет возможность добавлять динамически новые экземпляры, создавать списки указателей, хранить "единичный" указатель
 
  [1] 2
Печать
 
Quest3D - Русскоязычное сообщество > Quest3D > Программирование > OO Member type: channel - как с ним работать
Перейти в: