osg--交互

本文介绍了如何在osg中实现自定义事件处理器,包括处理不同类型的事件,以及如何在视图中添加和移除事件处理器。此外,还详细讲解了物体相交的步骤,包括使用IntersectionVisitor进行相交检查和获取相交信息。最后,探讨了图形上下文的创建和使用。
摘要由CSDN通过智能技术生成

自定义事件处理器

  • osgGA::GUIEventHandler 事件处理器/事件遍历器的回调
    • 重载
      • handle
        • 参数osgGA::GUIEventAdapter

          • getEventType

          在这里插入图片描述

          • getModKeyMask 返回MODKEY_CTRL/MODKEY_SHIFT/MODKEY_ALT
          • 注意:相应set方法不适合在handle中出现,用于osg底层显示系统向事件队列添加事件
        • 参数osgGA::GUIActionAdapter

          • osgViewer::Viewer* viewer = dynamic_castosgViewer::Viewer*(&aa);
  • 事件处理管理
    • addEventHandler
    • removeEventHandler
  • 步骤
    • 自定义事件处理器
    • viewer中加入自定义事件处理器
    • 取消viewer主相机控制器
      • viewer.getCamera()->setAllowEventFocus(false);
    • 设置viewer的ViewMatrix
      • viewer.getCamera()->setViewMatrixAsLookAt(osg::Vec3(0.0f,-100.0f,0.0f), osg::Vec3(), osg::Z_AXIS );

示例

#include <osg/MatrixTransform>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventHandler>
#include <osgViewer/Viewer>

class ModelController : public osgGA::GUIEventHandler
{
public:
	ModelController(osg::MatrixTransform* node)
		: _model(node)
	{}
	virtual bool handle(const osgGA::GUIEventAdapter& ea,
		osgGA::GUIActionAdapter& aa);

protected:
	osg::ref_ptr<osg::MatrixTransform> _model;
};
bool ModelController::handle(const osgGA::GUIEventAdapter& ea,
	osgGA::GUIActionAdapter& aa)
{
	if (!_model) return false;
	osg::Matrix matrix = _model->getMatrix();

	switch (ea.getEventType())
	{
	case osgGA::GUIEventAdapter::KEYDOWN:
		switch (ea.getKey())
		{
		case 'a': case 'A':
			matrix *= osg::Matrix::rotate(-0.1f, osg::Z_AXIS);
			break;
		case 'd': case 'D':
			matrix *= osg::Matrix::rotate(0.1f, osg::Z_AXIS);
			break;
		case 'w': case 'W':
			matrix *= osg::Matrix::rotate(-0.1f, osg::X_AXIS);
			break;
		case 's': case 'S':
			matrix *= osg::Matrix::rotate(0.1f, osg::X_AXIS)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值