• Добро пожаловать на Quest3D - Русскоязычное сообщество.
 

On Left Mouse Down. На мой взгляд ведет себя не понятно.

Автор micB, 26 ноября 2009, 12:38:19

« назад - далее »

micB

Требуется что бы при щелчке на объекте воспроизодилась анимация объекта, на котором щелкнули.
Номер объекта получаю через CollisionRayCheck, затем по щелчку на объекте (On Left Mouse Down)пытаюсь внести номер объекта в канал Value, но это значение всегда 0, как буд-то щелчка не происходит. Заменил CollisionRayCheck на DetectMouse Collision всё работает, но тогда нажимаются все объекты которые под курсором.
Если в UserInput ставить Left Mouse Down тогда тож почти всё работает, кроме щелчка на объекте. Ведь можно щелкнуть в сторонке, а потом навести курсор на объект.
Объясните плиз, где собака порылась, почему в этой схеме при использовании в UserInput  On Left Mouse Down в value всегда приходит 0?
Спасибо.

micB

В общем голову сломал, почему оно так. Сделал немного по другому. Пришлось добавить еще один юзер инпут на OnLeftMouseUp он сбрасывает значение в 0. Остальные значения берутся напрямую с CollisionRayCheck.
Но всё же вопрос остался открытым, я так и не дотумкал почему не работала предыдущая схема.

→|๖ۣۜDen|←

Когда ты используешь Detectmouse collision и CollisionRayCheck - корректного результата можно не добится. И совместное их использование вообще не нужно, во-первых ты нагружаешь цп на дополнительные просчёты, во-вторых детект просто не нужен, если ты используешь колижн рей чек. в твоём случае нужно проверять есть ли столкновения луча с другими объектами, посмотри исходник (4.3), как это работает.
Далее - у тебя импортированный, заанимированый объект. Не знаю пути решения как проверить коллизию заанимированного импортированного из макса объекта, из наблюдений могу сказать, что коллизия проверятся не динамически, вернее, тоже не совсем корректно: Когда анимация объекта проплывает по таймеру, и объект перемещается, коллизия находится в том месте, где объект был в первоначальный момент и минус та часть куска, которой уже нет в данной позиции. Намулевал схематически то что щас наговорил :P (см. рис.) Когда ты переходишь из первой позиции в 3-юю, чтоб вернуться обратно в 1-ую из 3-ей, нужно нажать в жёлтую область, в моём случае кубика (в красную область, как на второй позиции, нажать не получится). Т.к. первоначально в момент нажатия во 2ой позиции можно было и в зелёную и жёлтую. А потом объект исчезает в третьей позиции из зелёной области. Не понятно, почему нельзя в третьей позиции получить коллижн в области где на второй позиции красно...видимо приколы импорта...или просто есть ещё такая проблема у квеста как невозможность считывания данных из моушн сет. Может я не прав...Выход вижу такой - импортировать свой объект из макса в квест, а анимировать непосредственно в квесте. Разработчики бы тебе сказали - юзай колладу...
Не тупи, Denil!ツ Quest3D v4.3.2

Ruslan

Привет!
может я сейчас скажу не в тему, но все же, как вариант, если проблема действительно в анимации, то наверное стоит создать объект "пустышка"(объект, который не будет выводиться на рендер ), и в каждом кадре присваивать данные из матрицы (или матрицу целиком) анимированного объекта в матрицу "пустышки".
CollisionRayCheck проверять с "пустышкой".

micB

#4
Den Первоначально сделал на ДетектМаусКолижн, но когда понял что у них нет никих параметров для определения кол-ва объектов под мышью и работы с этими объектами по отдельности, то решил переделать на КолижнРэйЧек. А из сцены их просто забыл удалить перед тем как выложить. :)
То бишь не было задумки использовать их одновременно.
За то что коллизия проверяется не динамически - спасибо. :) Заметил, что рэй чек себя в моем случае вел как то не адекватно, теперь все встало на свои места. :)

Ruslan Хорошая идея. :)


Попробую оба способа, а там посмотрю чего больше понравится.

Спасибо.

micB

#5
Den Щас потыкал, по моему все проще (я про твою схему с кубиками). Рэй чек всегда срабатывает на то пространство, которое занимал объект в начальной позиции, на твоей схеме это зеленое и желтое поле.

Ruslan Сижу вот репу чешу, как енту матрицу от туда выковырять. ???
Вот тут нашел.
https://guest3d.wohlnet.ru/forum/index.php?topic=704.0
Но чет у меня не коннектится как Viik пишет. Может кто схемку выложит?

Ruslan

#6
ня

DimiS

вы тут немного не в том направлении развиваете мысль
просто On Left Mouse Down у тебя вызываеться 2 раза подряд, первый при проверке тригера и второй при записи значения в переменную. Так вот первый раз он отрабатывает нормально, потому что видит что состояние кнопки поменялось, а вот второй раз он уже воспринимает нажатое состояние кнопки как старое, и соответственно говорит что клика не происходило.
Решение в том чтобы сохранять значение именно колижен рей чека, а не того экспрешен велью. А чтобы всё было совсем правильно, то лучше сохранить значение солижен рей чека в отдельную переменную, и потом работать с этой переменной -- каждый вызов рей чека, это новый просчёт, может стать тормозом производительности если объектов много или они сложные.

micB

DimiS Если правильно тебя понял - на второй схеме оно так и подключено. В переменную заносится колижн рэй чек, а не результат экспрешшн. Ток тепеть мне еще и логику разжевали, почему в первом случае не работает, а во втором работает. :) Спасиб.

Ruslan Спасиб за файл, ток у меня с ним чегот не то. Как я понял ключевой момент - это канал Command с установленным значением Get Matrix From Import Object (судя по названию канала). Когда я захожу в его свойства, то канал пуст, а значения Get Matrix From Import Object в списке вообще нет (в хелпе я его тож не нашел). Может версия чего т не того? У меня 4.2.2
Нашел вот тута: https://guest3d.wohlnet.ru/forum/index.php?topic=691.0
вот это - #000923: Duplicate entry of "Get Matrix From Import Object" in command channel. Это одно из нововведения версии 4.3. То бишь в 4.2.2 такого метода у канала Command апще нету? Можно ли как нить по другому в 4.2.2 получить матрицу объекта?


micB

Ruslan В 4.3 усё получилось. Ток почему то при взятии матрицы у одного объекта и присвоении ее другому объекту, происходило относительное смещение объектов. Хотя все пивоты и углы поворотов у всех объектов в нуле и до присвоения чужой матрицы объекты находились в точности там же где и объекты-доноры.
Почему такое происходит понять не смог, поэтому тупо сделал сабтракт на нужные величины.
Еще раз спасибо за помощь. :)

Ruslan

Есть несколько моментов:
- геометрия должна быть одна и таже.
- Size Vector должен быть 1,1,1

(в примере, разная геометрия и Size Vector 0.3 0.3 0.3  только для наглядности)

micB

#11
Ruslan Про сайз вектор догадался. :)
Я впихнул для рэй чека облегченную геометрию (но она достаточно точно повторяет форму основное геометрии), все равно ж ее видно не будет. А почему геометрия обязательно должна быть одна и таже?

Ruslan

#12
ЦитироватьА почему геометрия обязательно должна быть одна и таже?
Немного не так выразился.. в масштабе должна быть, для CollisionRayCheck.
Не проверял, но наверное, если объект сложный и или объектов много, то стоит сначала проверить кликнул ли ты мышкой в зоне габаритного кантейнера объекта, и если попал, в габаритный контейнер, то тогда уже делать проверку с помощью CollisionRayCheck.

micB

Ruslan Угу. Пост DimiS про оптимизацию тож навел на мысль о проверке рэй чека только во время клика. Хотя в этом "проекте" это излишне - 9 объектов общий полигонаж 1150 поликов и одна дифузная текстура 2048х2048. Будет время, переделаю правильно, в дальнейшем схемка пригодится. :)

micB

#14
Сделал вызов РэйЧека по клику. Фпс был 2900, стал 3100. :) Но самое на мой взгляд важное: раньше при воспроизведении анимации (импортированной из 3д софта) фпс падал с 2900 до 2650 - 2700, теперь же стал снижаться с 3100 всего до 3065. То бишь РэйЧек наиболее мощно поджирает ресурсы при воспроизведении импортированной анимации (с квестовской анимацией не пробовал). Пригодится на более масштабных проектах.
Хотел выложить то что получилось, все таки первая выполненная полностью под заказ и законченная работа (хоть и не большая). Но большое начальство велело не распространять. :(