#pragma comment(lib, "osg.lib")
#pragma comment(lib, "osgDB.lib")
#pragma comment(lib, "osgViewer.lib")
#include "osgViewer/Viewer"
#include "osgDB/ReadFile"
#include "osg/Node"
#include "osg/Shape"
#include "osg/Geode"
#include "osg/ShapeDrawable"
int main(){
//初始化视景器
osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer;
//初始化场景根节点
osg::ref_ptr<osg::Group> root=new osg::Group;
//场景数据
osg::ref_ptr<osg::Node> node=osgDB::readNodeFile("glider.osg");
root->addChild(node);
//将场景数据加入视景器中
viewer->setSceneData(root);
//viewer->setCameraManipulator(NULL);
//得到相机默认的参数设置
osg::Vec3d eye,center,up;
viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up);
//将相机参数打印出来
printf("init eye: %f,%f,%f\n",eye._v[0],eye._v[1],eye._v[2]);
printf("init center: %f,%f,%f\n",center._v[0],center._v[1],center._v[2]);
printf("init up: %f,%f,%f\n",up._v[0],up._v[1],up._v[2]);
//修改相机参数
eye=osg::Vec3d(-10.0,0.0,0.0);
center=osg::Vec3d(0.0,0.0,0.0);
up=osg::Vec3d(0.0,0.0,1.0);
//将参数设置给相机,并立即获取相机参数
viewer->getCamera()->setViewMatrixAsLookAt(eye,center,up);
viewer->getCamera()->getViewMatrixAsLookAt(eye,center,up);
//将参数打印出来
printf("eye: %lf,%lf,%lf new\n",eye._v[0],eye._v[1],eye._v[2]);
printf("center: %lf,%lf,%lf new\n",center._v[0],center._v[1],center._v[2]);
printf("up: %lf,%lf,%lf new\n",up._v[0],up._v[1],up._v[2]);
//仿真循环,注意不要使用viewer->run(),如果使用这个参数,上面关于相机的所有更改都会无效
while(!viewer->done())
viewer->frame();
//viewer->run();
return 1;
若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/96973379
Demo运行效果
初始化模型代码
事件管理器代码
工程模板:对应版本号1.14.0
OSG三维开发...
这个问题一直困扰可很久,因为没有认真去看osg源码导致的。
1.在网上收集的资料很多都是 利用osg::carmea 的void setViewMatrixAsLookAt(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up);这样做能够做到,但是前提是不能使用viewer-》run()。因...
严重注意!!!以下设置必须在viewer.realize();之后,否则不起作用!!!!
设置相机的位置,可以通过CameraManipulator(一般是osgGA::TrackballManipulator)设置,
可以使用setTransformation设置
设置相机的其他参数,ViewMatrix,ProjectionMatrix,Viewport
osg::Came...
自定义相机的位置位于世界坐标系下的Y轴正方向斜向下45度观察水平面。
通过按键实现向前(按W)向后(按S)向左(按A)向右(按D)
向上(按PageUp)向下(按PageDown)
相机左右旋转(J/L)、相机上下旋转(I/K)
观察效果如图:
实现相机我们所要用到的知识点有
1.向量,矩阵,四元素等概念
2.OSG坐标系统的知识。
3.视图与相机, 键盘事件消息处理。
最重要的需要自己的空间思维能力,如果对以上的知识点不熟悉的话,可以去相关的网站看看。
这两个函数传递的matrix 互为逆矩阵,因为,对于修改相机位置和修改三维世界,都可以达到相同的效果。
假定,相机不动,我们要看到人前进的效果,那就是不停的移动三维世界;
如果,认为世界不动,我们要看到人前进的效果,需要移动相
若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/96836876
未设置相机的效果(启动默认效果)
光源的位置为(0,-2,-,1)
光源的位置为(0,-10,-,1)
设置相机后的效果(启动...
若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/98964269
Demo工程实现功能
Demo运行效果
操作器概述
初始化默认位置
移动位置
实现简单的漫游器
漫游器代码
MyCam...
在计算机的三维世界中,相机如同我们的眼睛,捕捉眼前的每一副画面,反过来物体要能够被相机在指定的距离和角度下观看到,并通过屏幕像素绘制出来。
在这个过程中,物体的三维空间坐标需要经过好几层矩阵变换,最终转换到二维平面坐标,并通过像素呈现在屏幕中。我们将这几层矩阵变换过程简称为MVPW矩阵变换。
下面我们展开介绍MVPW具体内容 ~
模型(Model)
MVPW中的M是模型顶点在三维场景中的位置。
自OSG 0.9.7发布之后,新的osgGA::MatrixManipulator类(TrackerManipulator)允许用户将摄相机“依附”到场景图形中的节点。这一新增的操纵器类可以高效地替代下面所述的方法。本章教程将继续使用回调和节点路径(NodePath)来检索节点的世界坐标。 本章目标:在一个典型的仿真过程中,用户可能需要从场景中的各种车辆和人物里选择一个进行跟随。本章将介绍