本篇是实现一个拖拽器,通过控制右上角的立方体来选择我们的3D模型,通过选择立方体的某一个面,来直接设置模型的朝向, 同时拖拽器只能响应旋转。
我的实现方式主要通过多视图完成。首先我们重写osgGA::TrackballManipulator,只保留旋转事件。
MyTrackballManipulator.h部分实现:
#ifndef __MY_TRACKBALL_MANIPULATOR_H_
#define __MY_TRACKBALL_MANIPULATOR_H_
#include <osgGA/TrackballManipulator>
#include <osgGA/GUIActionAdapter>
#include <osgGA/GUIEventAdapter>
class MyTrackballManipulator : public osgGA::TrackballManipulator
{
public:
virtual bool handleMouseWheel(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us);
virtual bool performMovementLeftMouseButton(const double eventTimeDelta, const double dx, const double dy);
virtual bool performMovementMiddleMouseButton(const double eventTimeDelta, const double dx, const double dy);
virtual bool performMovementRightMouseButton(const double eventTimeDelta, const double dx, const double dy);
virtual bool performMouseDeltaMovement(const float dx, const float dy);
virtual void applyAnimationStep(const double currentProgress, const double prevProgress);
};
#endif
// MyTrackballManipulator.cpp部分实现:
#include "MyTrackballManipulator.h"
bool MyTrackballManipulator::handleMouseWheel(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us)
{
return true;
}
// 重写旋转事件
bool MyTrackballManipulator::performMovementLeftMouseButton(const double eventTimeDelta, const double dx, const double dy)
{
if (getVerticalAxisFixed())
rotateWithFixedVertical(dx, dy);
else
rotateTrackball(_ga_t0->getXnormalized(), _ga_t0->getYnormalized(),
_ga_t1->getXnormalized(), _ga_t1->getYnormalized(),
getThrowScale(eventTimeDelta));
return true;
}
bool MyTrackballManipulator::performMovementMiddleMouseButton(const double eventTimeDelta, const double dx, const double dy)
{
return true;
}
bool MyTrackballManipulator::performMovementRightMouseButton(const double eventTimeDelta, const double dx, const double dy)
{
return true;
}
bool MyTrackballManipulator::performMouseDeltaMovement(const float dx, const float dy)
{
return true;
}
void MyTrackballManipulator::applyAnimationStep(const double currentProgress, const double prevProgress)
{
}
以上就是我们重载漫游器的实现。
下面是View上点击事件的处理,包括点击检查,绘制立方体等。
CHUDPickHandler.h
#ifndef __CHUD_PICK_HANDLER_