Я хочу создать динамическую сферу в OSG, которая была бы создана (перемещена) щелчком левой кнопки мыши в этом месте (в центре) и с динамическим радиусом расстояния текущего местоположения указателя мыши до центра ….
Я понимаю, что по этой причине мне нужно создать объект osgGA :: GUIEventHandler и реализовать функцию виртуального дескриптора, но я скучаю по другим деталям, таким как поиск объекта сферы из сцены и изменение его атрибутов.
Я тоже пытался изменить Пример комплектации но не удалось обнаружить сферу в nodePath или создать новую сферу
Вероятно, я бы начал с создания пользовательского класса, производного от одного из классов манипулятора osgGA.
Вы захотите переопределить метод handle () примерно так:
bool CustomManipulator::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
using namespace osgGA;
if (ea.getEventType()==GUIEventAdapter::FRAME)
{
if (_thrown) aa.requestRedraw();
}
else if (ea.getEventType()==GUIEventAdapter::PUSH)
{
// check if your sphere is picked using LineSegmentIntersector
// (like in the picking example) and set a flag
}
else if (ea.getEventType()==GUIEventAdapter::DRAG)
{
// update the position and radius of your sphere if the flag was set
}
else if (ea.getEventType()==GUIEventAdapter::RELEASE)
{
// release the sphere, unset the flag
}
return false;
}
Затем не забудьте использовать setCameraManipulator () в вашей программе просмотра, чтобы добавить это вместо TrackballManipulator по умолчанию.
Других решений пока нет …