OSG 多视图 实现导航拖拽器

OSG基于多视图实现的导航器。
摘要由CSDN通过智能技术生成

本篇是实现一个拖拽器,通过控制右上角的立方体来选择我们的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_
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值