OSG局部坐标系和世界坐标系的理解
对坐标系这个概念相对比较熟悉,但是应用于实践时,发现理解有点偏差,现记录如下:
首先测试代码如下简单的使用了pick显示鼠标点击的位置以及利用computerinterections函数计算与鼠标相交的模型点,从而输出鼠标的窗口值以及这些模型点的全局和局部点坐标。
结果一、如果不设置MatrixTransform矩阵只简单显示一头牛发现,局部坐标和世界坐标的坐标值是完全相同的。
结果二、设置MatrixTranform矩阵出现两头牛,点击经过矩阵变换的牛,点击与第一头牛大致相同的位置,会发现局部坐标是相同的世界坐标发生了变化。
结论:一般情况下用顶点(世界坐标系)建立好模型后,全局和局部坐标系都属于世界坐标系,但是将模型平移旋转和缩放后,世界坐标系会随之发生变化但是局部坐标系不发生变化,局部坐标系应该是属于平移之前的位置
#include"…/common/common.h"
#include
#include <osg/ref_ptr>
#include <osgViewer/Viewer>
#include<osg/ShapeDrawable>
#include<osg/Node>
#include<osg/Geometry>
#include<osg/Geode>
#include<osg/Group>
#include<osg/ClipNode>
#include<osg/PolygonMode>
#include<osg/MatrixTransform>
#include<osg/AnimationPath>
#include<osgUtil/DelaunayTriangulator>
#include <osgDB/ReadFile>
#include<osgDB/WriteFile>
#include <osgFX/Scribe>
#include<osgGA/StateSetManipulator>
#include<osgViewer/ViewerEventHandlers>
#include<osgUtil/Optimizer>
#include<osgUtil/PlaneIntersector>
#include<osg/LineWidth>
#include<osg/PrimitiveSet>
#ifdef _DEBUG
#pragma comment(lib,"…/Debug/common.lib")
#else
#pragma comment(lib,"…/Release/common.lib")
#endif
class mPickHandler:public osgGA::GUIEventHandler
{
public:
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*)
{
_viewer = dynamic_castosgViewer::Viewer*(&aa);
switch (ea.getEventType())
{
case osgGA::GUIEventAdapter::PUSH:
if (ea.getButton() == 1)
{
float X = ea.getX();float Y = ea.getY();std::cout << "x " << X <<" "<<"y " << Y << std::endl;pick(X, Y);}if (ea.getButton() == 2){float X = ea.getXnormalized();float Y = ea.getYnormalized();std::cout << "x " << X << " " << "y " << Y << std::endl;//pick(X, Y);}return true;default:break;}return false;
}
mPickHandler():_viewer(0) {}~mPickHandler() {}
void pick(float x, float y)
{osgUtil::LineSegmentIntersector::Intersections intersections;_viewer->computeIntersections(x, y, intersections);if (!intersections.size()) { std::cout << "error" << std::endl; }for (osgUtil::LineSegmentIntersector::Intersections::iterator itr = intersections.begin(); itr != intersections.end(); ++itr){std::cout << "局部坐标" <<itr->getLocalIntersectPoint().x() << " " << itr->getLocalIntersectPoint().y() << " " << itr->getLocalIntersectPoint().z() << std::endl;std::cout<<"世界坐标" << itr->getWorldIntersectPoint().x() << " "<<itr->getWorldIntersectPoint().y() << " "<<itr->getWorldIntersectPoint().z() << std::endl;}}
private:
osgViewer::Viewer* _viewer;
};
int main()
{
osgViewer::Viewer viewer;
osg::ref_ptrosg::Group root = new osg::Group;
osg::ref_ptrosg::MatrixTransform mat = new osg::MatrixTransform;
osg::ref_ptrosg::Node cow = osgDB::readNodeFile(“cow.osg”);
mat->addChild(cow);
mat->setMatrix(osg::Matrix::translate(10, 0, 0));
root->addChild(mat);
osg::ref_ptrosgFX::Scribe sc = new osgFX::Scribe();
sc->addChild(cow);
root->addChild(cow);
root->addChild(sc);
viewer.setSceneData(root);
viewer.addEventHandler(new mPickHandler);
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
return viewer.run();
}
OSG局部坐标系和世界坐标系的理解相关推荐
- DirectX 3D_基础之模型表示 顶点格式 三角形 索引 虚拟摄像机 投影窗口 绘制流水线 局部坐标系 观察坐标系 世界坐标系 背面消隐 光照 裁剪 投影 视口变换 光栅化
每日一语: 当一切都安于现状后,这个社会就无法发展,也就无法从原始社会发展到现代社会,对于人也是一样,如果我们一直安于现状,就无法有更大更好的发展,我们不要想着,一直可以过安逸的生活,程序员这个职业, ...
- 局部坐标系和全局坐标系
概述 全局坐标系是三维空间物体所在的坐标系,模型的顶点坐标就是基于这个坐标系来表达的.而局部坐标系是一个假想的坐标系,该坐标系与物体的相对位置至始至终是不变的,假想出这个坐标系的目的主要是为了正向理解 ...
- Unity中旋转方式的探究与对万向节死锁(Gimbal Lock)的理解
Gimbal Lock Gimbal Lock的原理网上已经有很多资料,详细可以看介绍视频.视频讲到Gimbal Lock的时候提到x,y,z三个坐标轴是有从属关系(hierarchical syst ...
- 鼠标 ArcBall 局部坐标系 旋转模型
坐标系统 关键词:世界坐标系 模型坐标系 相机坐标系 模型坐标系到世界坐标系的变换举证,世界坐标系到相机坐标系的变换举证,透视投影,成像面与屏幕的比例映射 一般在计算机图形显示中,我们需要三个坐标系构 ...
- OSG 高效渲染 之 多线程模型与渲染
这里以OSG多线程渲染为例,谈谈OSG渲染引擎多线程渲染模式,再说说哪里有点"过时"了需要改进. 先谈点题外话,曾经看到知乎上一篇关于游戏引擎的设计讨论的文章,有位"大大 ...
- OpenGL 坐标变换(2)
1.全局把握-OpenGL中的坐标变换 OpenGL中的点,从用户构造模型的局部坐标系,经过一系列处理最终渲染到屏幕坐标系下,才形成了3D图形. 这里的主要变换过程如下图所示: 注意: 1)OpenG ...
- 【游戏渲染】【译】Unity3D Shader 新手教程(1/6)
http://gad.qq.com/article/detail/7175490 该文章来自用户转载 点击阅读原文 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散, ...
- 第四章 DirectX 渲染流水线(上)
我们在第一章中讲过,一个3D场景中的模型是如何被显示到屏幕上的.这个流程就称之为渲染流水线.这个流程在OpenGL中也是大致如此的.Direct3D的渲染流水线过程如下: 在DirectX 9 中,有 ...
- WebGL简易教程(五):图形变换(模型、视图、投影变换)
文章目录 1. 概述 2. 详论 1) 模型变换 (1) 平移变换 (2) 缩放变换 (3) 旋转变换 (4) 组合变换 2) 视图变换 (1) 原理 (2) 推导 3) 投影变换 (1) 透视投影 ...
最新文章
- 如果只能通过IE写博客【Do we write blog just only with IE?】
- 记录一次postfix无法收取邮件和mysql异常不能启动
- ctype.h(cctype) 头文件函数大全
- linux misc device字符杂项设备驱动
- python运算符中用来计算整商的是什么_零基础学python,看完这篇文章,你的python基础就差不多了...
- Oracle Database 11g Express Edition使用限制,与其他版本的区别
- Java关键字synchronized的简单理解
- 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)
- Spring配置 context:component-scan/ mvc:annotation-driven /
- 国际认可不断增加,国产数据库发展与应用前景如何?
- Java开发笔记(一百三十七)JavaFX的标签
- Microsoft Project项目管理实践
- fgo服务器维护补偿,《FGO》:大版本维护补偿调整,部分石头将变成金苹果!
- 关系型数据库的一对一、一对多、多对一、多对多关系
- mysql查看当前所在库_MySQL查看当前数据库库
- MIS系统(1)- MIS系统的介绍
- argis利用gp工具打包tpk切片包
- MOT:A Higher Order Metric for Evaluating Multi-object Tracking
- 怎样查找某个外文期刊的文献?
- projectManager