01 Июля 2025, 23:51:28
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

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







guest3d
Просмотр сообщений
[1] 2
 1  Quest3D / Визуализация, Шейдеры / Re: Пример Weather System Example, его строение и всё про погоду : 26 Декабря 2010, 20:23:11
Вот архив с исходниками и прелоадером, с помощью которого получилось НЕ СПЕЦИАЛЬНО! и в общем-то непонятно как открыть погоду.
www.avdeevk.ru/weatherOpened.zip
 2  Quest3D / Визуализация, Шейдеры / Re: Пример Weather System Example, его строение и всё про погоду : 26 Декабря 2010, 13:07:12
Народ, я не знаю насколько это ценно, но у меня нечаянно получилось открыть погодные файлы. Кому-нибудь нужно? Там правда, придется все растаскивать, ибо все в кучу.
 3  Quest3D / Визуализация, Шейдеры / Re: Пример Weather System Example, его строение и всё про погоду : 14 Ноября 2010, 16:57:00
По поводу погоды квестион.
Нужна работа погоды через веб.
Ясно, что надо загружать их прелоадером и создавать необходимые группы. Но вопрос в том, в каком порядке нужно создавать эти группы, чтобы не было конфликтов? Чтобы файл не создавал необходимую ему пустую группу. Кто ж придумал "зашить" погоду, блин...
 4  Quest3D / Программирование / Re: ColladaImport и DetecMouseCollision : 28 Октября 2010, 21:41:48
Вообще, пользоваться матрицами не самый лучший способ.
Представь, что в одной точке находится огромный шар и маленький куб.
А еще лучше, длиииииный параллелепипед и сфера. Матрицы - одинаковые. А конец параллелепипеда к нам ближе. )
 5  Quest3D / Программирование / Re: LUA Динамическая подгрузка 1000 разных объектов : 28 Октября 2010, 21:37:55
Да, интересно. Сейчас сам работаю над программой для формирования помещений. Так что будем делиться опытом )
 6  Quest3D / Программирование / Re: LUA Динамическая подгрузка 1000 разных объектов : 28 Октября 2010, 11:29:58
1. Загрузка объекта из базы - не знаю, не пробовал. Но должно работать.
2. То что загружается - это группа, или то, что можно преобразовать в группу - работает ColladaImport. Просто в нужные параметры вписываются не данные из файла модели(там ведь они тоже есть), а данные из запроса к базе.
3. По поводу активности - мне кажется, что тебе может помочь следующая тема: http://guest3d.wohlnet.ru/forum/index.php?topic=1577.0
Принцип-то тот же.

Квест нереально мощный. Мне иногда кажется, что все упирается в соображалку.
 7  Quest3D / Программирование / Re: LUA Динамическая подгрузка 1000 разных объектов : 28 Октября 2010, 11:07:09
Воспользуйтесь массивами или ОО системой, куда будете складывать данные из базы.

Кстати, в каком виде в базе хранится такие вещи как VertexData и т.д? Или в базе просто ссылка на файл? Тогда вам нужен ColladaImport )
 8  Quest3D / Программирование / Re: ColladaImport и DetecMouseCollision : 28 Октября 2010, 11:04:20
Да, ничего особо сложного нет, просто пытался расписать наиболее развернуто. Видимо не получилось.

Не совсем понял вашу задачу. У вас при динамической загрузке должно все происходить? Т.е. вы прямо из своего скомпилированного приложения загружаете модель, потом наводите на каждую поерхность и получаете разные подсказки? Потом загружаете другую модель и получаете другие подсказки?
Тут да, придется малость попариться и да, без ОО не обойтись.

Или у вас модель сначала импортируется в квест? Т.е. динамической загрузки не будет? Если так, то это очень просто.
1. Загружаете модель с несколькими элементами.
2. Подключаете ее к рендеру и т.д. - она начинает отображаться в сцене.
3. На каждый элемент делаете свой 3D Object и подключаете туда матрицу объекта и Surface соответствующего элемента.
4. К каждому объекту подключаете DetectMouseCollision - получается что при наведении на какой-то элемент в соответствующем ему DetectMouseCollision вы получаете 1.
5. Воспользовавшись каналами Trigger или ChannelSwitch спокойно реализуете необходимый функционал.
 9  Quest3D / Программирование / Re: Количество чилдов? : 15 Октября 2010, 01:25:37
Это чисто спортивный интерес. Я в текущем проекте пользуюсь ОО системой. Однако, не совсем понятно как работает динамическая загрузка моделей Collada Import. Есть там такая штука как Convert Group to Import Object. Именно она, как я понял, и раскладывает данные модели в объекты класса. Классы сImportObject, cImportSurface И cImportTexture являются каким-то стандартным набором для этой команды?

Когда непонятно как именно что-то работает в твоей программе - это нервирует ) Поэтому хотел сделать аналог этой команды, чтобы все было предельно ясно, но наткнулся на единственную проблему - нужно знать количество потомков и, в идеале, иметь возможность получить их тип.
 10  Quest3D / Программирование / Re: Количество чилдов? : 14 Октября 2010, 10:43:37
Кто-нибудь нашел решение проблемы подсчета количества чайлдов?
 11  Quest3D / Программирование / Re: LUA Вызов потомка потомка. : 10 Октября 2010, 20:49:43
Да, про вектор я знаю. Просто в моем случае публичный ченел вызывается из другой группы, которая создается автоматом. А сколько у него детей - я изначально не знаю. Мне нужно как раз узнать сколько потомков у чайлда LUA. ) Про вектор знаю.
 12  Quest3D / Программирование / LUA Вызов потомка потомка. : 10 Октября 2010, 20:00:17
Есть такая задача. Нужно вызвать потомка канала, присоединенного к потомку канала LUA.
Ну, например, к LUA присоединен канал Surface. В LUA нужно получить Emissive, Diffuse и Specular. Есть идеи?
 13  Quest3D / Программирование / Re: LUA Динамическая подгрузка 1000 разных объектов : 10 Октября 2010, 10:37:16
Что имеется ввиду под контейнером?
 14  Quest3D / Программирование / Re: File Dialog - Folder (папка) : 09 Октября 2010, 16:24:51
Можно попробовать получить путь к любому из файлов в папке, удалить из полученного пути название файла, получив таким образом путь к папке, и загрузить все файлы из папки, воспользовавшись циклом.
 15  Quest3D / Программирование / Re: ColladaImport и DetecMouseCollision : 29 Сентября 2010, 15:53:11
Итак, как же заставить работать DetectMouseCollision, который работает с 3D Object(и только с ним), когда у нас есть разрозненный пакет данных, полученный в результате работы ColladaImport? В принципе, ответ я уже написал. Надо сделать из полученных данных 3D Object. Все проще пареной репы, приступим.
Работать будем с ОО системой квеста.

Теперь по пунктам с картинками:
1. Изучим, что же мы получаем благодаря ColladaImport:
У нас три класса:
a. cImportObject
b. cImportSurface
c. cImportTexture

в а. формально хранится вся информация, необходимая для создания объекта:
- ImportObject (так и не понял что в нем хранится, но обошелся и без него)
- MotionSet(грубо говоря, это список матриц объекта. используется если объект анимирован. Я не пользовался, т.к. объекты у меня без анимации)
- Normalized Matrix(матрица объекта. Положение, ориентация и масштаб объекта в пространстве. Грубо говоря тот самый Motion).
- Surfaces(Интересная штука. Это OO_Container. Т.е. такая штука, которая содержит множество ОО_Instances. Другими словами, это такой массив в котором содержаться... Внимание!.. ...объекты класса cImportSurface!

В b. Формально хранится вся инфа для создания поверхности:
- Diffuse(Цвет диффуза)
- Emissive(цвет самосвечения)
- Object Data(собственно инфа о вершинах)
- Specular(блеск)
- SpecularPower(сила блеска)
- TextureList(опять же СПИСОК! ClassInstanceContainer объектов класса сImportTexture)

В c. Тут хранится вся информация, необходимая для создания ноды Texture.
- Texture

Таким образом получается следующая иерархия:
cImportObject -> cImportSurface -> cImportTexture

Я намеренно упустил из описания класса cImportSurface один пункт - функцию Draw. Эта функция прорисовывает все поверхности, используя матрицу объекта, получая ее из внешнего параметра-матрицы World.

А теперь давайте посмотрим какие входы есть у ноды 3D Object:
- Matrix (Положение, ориентация и масштаб объекта в пространстве. Грубо говоря тот самый Motion. Обязательная нода)
- Offset Matrix(Дополнительная матрица, которая накладывает свое действие на основную. Другими словами таким образом можно "Припарентить" объект к другому. Не обязательна)
- Surface(Данные о поверхности. Нода множественная и обязательная. Сюда подключается информация о всех поверхностях, составляющих объект)
- Draw object (рисует объект или нет)

Таким образом для создания объекта нам необходимы всего два входа: Matrix и Surface.

Matrix у нас есть. Нет ноды Surface. Зато есть данные для создания этого сюрфейса. Ну, так вперед!

В интерфейсе iImportSurface Содаем новую функцию MakeSurface  типа Channel->Surface:
www.avdeevk.ru/3qdLess/001.jpg
http://www.avdeevk.ru/3qdLess/002.jpg
http://www.avdeevk.ru/3qdLess/003.jpg
Убеждаемся что все точно как у меня.
http://www.avdeevk.ru/3qdLess/004.jpg

Обратите внимание что в поле Target стоит Target not found!
Это означает, что у этой функции есть объявление, но нету исполняемой части. Теперь эту часть и надо сделать.

Нажмите кнопку F2 на клаве, переведя Quest в режим Dual ChannelGraph. В верхней части выберите OO Editor, в нижней группу OO 3D Object Template. И просто перетащите функцию MakeSurface сверху из OO Editor'a в ChannelGraph внизу.
Получите следующее:
http://www.avdeevk.ru/3qdLess/005.jpg
Сверху нода Surface, а снизу указатель на то от какого элемента класса надо брать параметры diffuse, emissive и т.д. Вы же помните, что поверхностей в объекте может быть много, следовательно у каждой из них будут свои параметры.
Именно для этого и служит нода THIS.

Теперь надо перетащить в ChannelGraph необходимые параметры. Делается это следующим образом. Откройте закладку ProjectTree.

Раскройте папку Include, в ней раскройте группу OO 3D Object Template. Внутри которой раскройте класс cImportSurface и увидите все параметры и функции, присутствующие в этом классе.
http://www.avdeevk.ru/3qdLess/006.jpg
http://www.avdeevk.ru/3qdLess/007.jpg
Перетащите из этого списка в ChannelGraph следующие параметры:
- Diffuse
- Emissive
- Specular
- SpecularPower
- ObjectData
TextureList перетаскивать не надо, т.к. для коллизии с мышью нас текстуры мало интересуют.

Получите следующий набор:
http://www.avdeevk.ru/3qdLess/008.jpg
Важный момент: у каждого из параметров снизу есть вход под названием OOClassInstance. Сюда надо подключить нашу ноду THIS, указывающую на то, параметры какого представителя класса(в данном случае поверхности) нас интересуют. Поэтому присоедините THIS ко всем параметрам:
http://www.avdeevk.ru/3qdLess/009.jpg
Также создайте новую ноду Material, удалите у нее всех Child'ов и подсоедините к ней наши соответствующие параметры:
http://www.avdeevk.ru/3qdLess/010.jpg
а затем к главной ноде подсоедините ноды ObjectData и Material.
http://www.avdeevk.ru/3qdLess/011.jpg
Вот и готова функция создания поверхности.

Для проверки DetecMouseCollision создадим функцию CheckMouseCollision.
Эта функция будет заниматься только одним: менять значение параметра MouseOver с 0 на 1, если мышь над этим объектом.
Первоначальные действия примерно такие же:
1. добавляем в интерфейс iImportObject параметр типа Value с именем MouseOver.
2. добавляем в интерфейс iImportObject функцию CheckMouseCollision, оставляя стандартный ChannelCaller.

 Назовем ее CheckMouseCollision.
http://www.avdeevk.ru/3qdLess/013.jpg
Перетащим новую функцию в ChannelGraph прямо из этого списка.

Нет времени дальше так подробно расписывать. Вот вся функция с описанием блоков:
красная рамка: Логика функции. Если есть коллизия -> параметр MouseOver=1, если нет параметр MouseOver=0.

Синяя рамка: По идее должен быть цикл. Но цикл работать так и не захотел. Все время выдавал одну поверхность объекта, а не все. Поэтому я забил в проекте 20 таких штук. По идее должно хватить.

Зеленая рамка. Решение некой корявости NormilizedMatrix в ColladaImport. т.е. я просто пересоздаю матрицу заново. В своем проекте сделал это при импорте.
http://www.avdeevk.ru/3qdLess/014.jpg
Теперь самое интересное: У меня нода 3D Object соединена с главной нодой. Это дает возможноть увидеть объект для коллизи во вьюпорте. т.е. так как это объект он начинает визуализироваться. Очень удобно для дебага.

Теперь как это все вписывается и где вызывается:
http://www.avdeevk.ru/3qdLess/015.jpg

Пояснения:
Красная рамка вызов функции.
Зеленая рамка: изменеие в алгоритме рендеринга. Вместо матрицы World мы подставляем матрицу NormiliaedMatrix нашего объекта.

Все работает. Можно убедиться, запустив прогу и перейдя в группу OO 3D Object Template.

А еще лучше сделав функцию HighLight в классе cImportObject
Типа Этой:
http://www.avdeevk.ru/3qdLess/015.jpg

В зеленой рамке у меня параметр функции цвета. Если непонятно, можно заменить на ValueVector со значениями RGB.

Вот ссылка на проект без Функции HighLight.
http://www.avdeevk.ru/3qdLess/less.zip

Спасибо за внимание. Извините, что не расписал полностью - начальник пришел ))

Задавайте вопросы.

У меня заодно вопрос. Можно ли как-то отследить у FileDialog была нажата кнопка ОК или Отмена?
[1] 2