[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Форум Panda3D - по русски » Panda3D » Общие вопросы » Центр объекта (Как изменять центр объекта в панде?)
Центр объекта
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
Вот в этой теме есть ссылка, движение по сплайну. Не пойму зачем делать из двух половинок eek ? Когда можно сплайн не замыкать.

ООП  -  
 
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.
Прикрепления: nurbs_mopath.7z (49.9 Kb)
 
liquideДата: Воскресенье, 23.03.2014, 17:31 | Сообщение # 12
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
NURBS кривые никак не работают с коллизиями? Просто у меня орбита может двигаться по любому в пространстве, но она в любом случае пересекает плоскость и точки в которых она пересекает эту плоскость нужно отметить, а у меня не получается dry Я построил плоскость с CollisionPlane и все полигональные модели фиксируют коллизию, а вот NURBS нет dry Есть какие нибудь идеи как это обойти можно? У меня есть мысль обложить 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
Да, но это потребует определённое кол-во циклов. Т.е. всё равно по-сути не реалтайм.
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » Центр объекта (Как изменять центр объекта в панде?)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: