利用Qt来显示OSG并且设置相机的位置

58 篇文章 27 订阅
#pragma once
#include <qopenglwidget>
#include <osgViewer/Viewer>
#include <osg/Node>

class OsgCanvas2 :public QOpenGLWidget {
public:
	OsgCanvas2(QWidget *parent);
	~OsgCanvas2();

private:
	void init();

	virtual void initializeGL();
	virtual void resizeGL(int w, int h);
	virtual void paintGL();
private:
	osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _graphicsContext;
	osg::ref_ptr<osgViewer::Viewer> _viewer;

	osg::ref_ptr<osg::Group> _root;
};


#include "OsgCanvas2.h"
#include <osgDB/ReadFile>
#include <osgGA/StateSetManipulator>
#include <osgGA/TrackballManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osg/GraphicsContext>

OsgCanvas2::OsgCanvas2(QWidget *parent)
	:QOpenGLWidget(parent){
	init();
}

OsgCanvas2::~OsgCanvas2() {
}

void OsgCanvas2::init() {

	int w = width();
	int h = height();
	//创建显示窗口
	_graphicsContext = new osgViewer::GraphicsWindowEmbedded(0, 0, w, h);

	//读取模型,并且构建模型树
	_root = new osg::Group;
	osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("F:\\OSG_Qt5.10_64\\OpenSceneGraph-Data-3.0.0\\xyz.osgt");
	_root->addChild(cow);

	//创建相机
	osg::ref_ptr<osg::Camera> camera = new osg::Camera;
	//给相机设置显示窗口
	camera->setGraphicsContext(_graphicsContext);
	//设置视口大小
	camera->setViewport(new osg::Viewport(0, 0, w, h));
	//设置投影矩阵-透视投影
	/*
	para1-上下方向角度
	para2-宽度和高度的比值
	para3-近距离面
	para4-远距离面
	*/
	camera->setProjectionMatrixAsPerspective(30.0, w / (double)h, 1.0, 10000.0);
	//设置背景色
	camera->setClearColor(osg::Vec4(0.2, 0.2, 0.6, 0.5));

	_viewer = new osgViewer::Viewer;
#if 1//设置视点位置不能是漫游器同时使用,否则就会不起作用
	const osg::BoundingSphere bs = _root->getBound();
	osg::Vec3d eye = osg::Vec3(bs.center().x(), -bs.center().y()*10, bs.center().z());
	osg::Vec3d center = bs.center();
	osg::Vec3d up = osg::Vec3(0.0, 0.0, 1.0);
	//设置相机位置
	camera->setViewMatrixAsLookAt(eye, center, up);
#else
	_viewer->setCameraManipulator(new osgGA::TrackballManipulator);
#endif

	_viewer->setCamera(camera);
	

	_viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
	_viewer->addEventHandler(new osgViewer::WindowSizeHandler);
	_viewer->setSceneData(_root);
}

void OsgCanvas2::initializeGL() {

}

void OsgCanvas2::resizeGL(int w, int h) {
	_graphicsContext->resized(0, 0, w, h);
}

void OsgCanvas2::paintGL() {
	_viewer->frame();
}

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值