Центр объекта
|
|
liquide | Дата: Понедельник, 13.01.2014, 01:34 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
| У меня есть вытянутый овал, который должен вращаться, но центром вращения должен быть не центр фигуры, а почти самый его низ. Я в блендере сделал эллипс, указал что центр фигуры внизу, экспортировал через YABEE в панду, но при вращение, овал крутится по своему центру, а не по краю как я хотел. Как можно указать где находится точка вращения? Добавлено (13.01.2014, 01:34) --------------------------------------------- Задам более наглядный вопрос, как реализовать движение часовых стрелок? Именно момент с их вращением
|
|
| |
serg-kkz | Дата: Понедельник, 13.01.2014, 01:46 | Сообщение # 2 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Просто, создай нод и присоедини относительно его модель. Выполняй вращение нода.
ООП -
Сообщение отредактировал serg-kkz - Понедельник, 13.01.2014, 01:47 |
|
| |
ninth | Дата: Понедельник, 13.01.2014, 03:08 | Сообщение # 3 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Есть другой вариант - получить из загруженного файла именно тот объект который нужен и вращать его. Попробую объяснить что происходит и почему. При экспорте из блендера вы технически выгружаете иерархию с корнем сцены, даже если выделен только один объект, поэтому если вращать непосредственно загруженный файл, то вращаться будет всё относительно центра экспортированной сцены. В данном случае центр сцены совпадает с центром овала. Если же вы возьмёте из загруженного файла конкретный объект, то всё должно пойти как и положено - т.е. относительно центра объекта. Код my_model = loader.loadModel('mymodel') my_object = my_model.find('**/my_object_name') my_object.setR(45) в данном случае my_object_name - это имя модели в блендере
|
|
| |
liquide | Дата: Понедельник, 13.01.2014, 15:28 | Сообщение # 4 |
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
| Ага, спасибо. С нодом прикрепленным к модели получилось, а вот найти название не получается, когда вывожу значение my_object пишет что not found. Правда вот вопрос ('**/my_object_name') звездочки так и должны остаться или их заменить чем то надо? Хотя я все варианты перепробывал. имя объекта у меня в блендере что сам блендер и дал Circle, но он его не найти что то. Еще вопрос Теперь по самому вращение, если использовать вращение .hprInterval и он как то вращает не совсем так как надо. В том смысле что он как то гуляет. Т.е. он не на каком то "стержне" вращается, а еще вращается вокруг какой то точки. Но это не критично, теперь немного другой вопрос.
Возможно ли по координатам объекта пустить другой объект? Т.е. мой вот этот овал это орбита. Я ее устанавилваю как хочу и хочу чтобы по ее координатам стала летать планета. Как это можно сделать? Я нашел на форуме как можно нарисовать линию за движущимся объектом, но у меня по сути обратная задача =\ да и не за линией даже
|
|
| |
ninth | Дата: Понедельник, 13.01.2014, 16:33 | Сообщение # 5 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| В твоём случае должно быть my_object = my_model.find('**/Circle') Хотя было бы проще если бы ты выложил свой EGG файл По звёздочкам и вообще параметрам поиcка http://panda3d.org.ru/publ/1-1-0-17
Цитата liquide ( ) Возможно ли по координатам объекта пустить другой объект? Возможно, но не по мешу, а по сплайну. Попозже - вечером попробую найти/сделать пример.
|
|
| |
liquide | Дата: Понедельник, 13.01.2014, 20:45 | Сообщение # 6 |
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
| Да все понял свою ошибку, все зааботало, но получилась проблемка, что теперь овал превратился обратно в ровную окружность =)
|
|
| |
ninth | Дата: Вторник, 14.01.2014, 00:28 | Сообщение # 7 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Попробую угадать что происходит ) Сам эллипс получен масштабированием по одной из осей внутри блендера в то же время ты его так же пытаешься масштабировать следом внутри панды т.е в итоге заменяешь своим масштабом, который, очевидно пропорционален по всем осям. Здесь несколько решений: 1) Менять масштаб так: my_model.setScale(my_model.getScale() * my_scale) 2) В блендере перед экспортом сделать Object -> Apply -> Scale (дефолтное сочетание Ctrl + A). Это применит масштаб к геометрии и уберёт его из матрицы трансформаций. 3) Масштабировать не объект, а группу вершин в режиме редактирования
С движением сегодня не успеваю. Можешь пока самостоятельно поискать в документации инфу по Mopath и поиграться с NURBS Curve в блендере. Из NURBS Curve будет строится путь по которому можно запустить объект, только учти, что замкнутые кривые не поддерживаются - у движения должны быть начальная и конечная точки, т.е. скорее всего эллипс придётся делать из двух половинок.
|
|
| |
liquide | Дата: Вторник, 14.01.2014, 07:37 | Сообщение # 8 |
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
| Хм, а ведь можно просто подрисовать вдоль эллипса Path? А потом загрузить в панде, единственное не до конца понимаю как загружать путь. Код myMotionPathName = Mopath.Mopath() myMotionPathName.loadFile("File Path") Mopath.Mopath() не совсем понимаю это. что значит первый Mopath? NodePath создается сразу как path, но не понимаю вот этого Mopah.Mopath() или первое это имя модели? А потом мы загружаем собственно саму модель. Или лучше путь создать отдельно и просто накладывать его по тем же координатам, что и эллипс?
|
|
| |
serg-kkz | Дата: Вторник, 14.01.2014, 08:10 | Сообщение # 9 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Вот в этой теме есть ссылка, движение по сплайну. Не пойму зачем делать из двух половинок ? Когда можно сплайн не замыкать.
ООП -
|
|
| |
serg-kkz | Дата: Вторник, 14.01.2014, 08:18 | Сообщение # 10 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| И да, не стоит забывать, что в случае орбит. Можно чисто обойтись математическими расчетами.
ООП -
|
|
| |
ninth | Дата: Вторник, 14.01.2014, 15:59 | Сообщение # 11 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Прикрепляю пример работы с NURBS кривыми. Здесь я правда использую не Mopath, а аналогичный самописный класс. Дело в том, что в Mopath используется старый тип кривых, а я предпочитаю новый, который работает более корректно - обратите внимание на loadPrcFileData("", "egg-load-old-curves 0")
Пример использования находится после if __name__ == "__main__", а класс NURBSMopath можно импортировать в любую свою программу без изменений. В примере я загружаю две дуги и поворачиваю их на 180 градусов друг относительно друга чтобы получить эллипс, затем создаю последовательность из двух соответствующих MopathInterval.
Цитата serg-kkz ( ) Не пойму зачем делать из двух половинок eek ? Когда можно сплайн не замыкать. Можно, но будет тяжело состыковать начало и конец сплайна сохранив при этом симметричность.
Цитата liquide ( ) Mopath.Mopath() не совсем понимаю это. что значит первый Mopath? Стандартный синтаксис питона. В данном случае модуль и класс, находящийся в модуле просто имеют одинаковые имена. Первое - это модуль - находится в <путь_установки панды>\direct\directutil. Второе - класс в этом модуле. Соответственно запись означает создание нового экземпляра класса Mopath из модуля Mopath.
|
|
| |
liquide | Дата: Воскресенье, 23.03.2014, 17:31 | Сообщение # 12 |
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
| NURBS кривые никак не работают с коллизиями? Просто у меня орбита может двигаться по любому в пространстве, но она в любом случае пересекает плоскость и точки в которых она пересекает эту плоскость нужно отметить, а у меня не получается Я построил плоскость с CollisionPlane и все полигональные модели фиксируют коллизию, а вот NURBS нет Есть какие нибудь идеи как это обойти можно? У меня есть мысль обложить NURBS сверху тем же торусом скажем и по нему точки расставлять, но может есть способ легче?
|
|
| |
ninth | Дата: Понедельник, 24.03.2014, 00:34 | Сообщение # 13 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Нет, нурбсы сами по себе не работают с коллизиями. Слишком сложный и тяжеловесный расчёт для реалтайма и боюсь простых вариантов чтобы найти пересечение - нет.
|
|
| |
serg-kkz | Дата: Понедельник, 24.03.2014, 01:08 | Сообщение # 14 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Хм достаточно пустить CollisionSphere вдоль орбиты для снятия координат точек пересечения. По принципу пуль, которые расставляют декали следов. А для экономии ресурсов можно с задержкой, т. е. не каждый кадр.
ООП -
|
|
| |
ninth | Дата: Понедельник, 24.03.2014, 08:56 | Сообщение # 15 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Да, но это потребует определённое кол-во циклов. Т.е. всё равно по-сути не реалтайм.
|
|
| |