对坐标系这个概念相对比较熟悉,但是应用于实践时,发现理解有点偏差,现记录如下:
首先测试代码如下简单的使用了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局部坐标系和世界坐标系的理解相关推荐

  1. DirectX 3D_基础之模型表示 顶点格式 三角形 索引 虚拟摄像机 投影窗口 绘制流水线 局部坐标系 观察坐标系 世界坐标系 背面消隐 光照 裁剪 投影 视口变换 光栅化

    每日一语: 当一切都安于现状后,这个社会就无法发展,也就无法从原始社会发展到现代社会,对于人也是一样,如果我们一直安于现状,就无法有更大更好的发展,我们不要想着,一直可以过安逸的生活,程序员这个职业, ...

  2. 局部坐标系和全局坐标系

    概述 全局坐标系是三维空间物体所在的坐标系,模型的顶点坐标就是基于这个坐标系来表达的.而局部坐标系是一个假想的坐标系,该坐标系与物体的相对位置至始至终是不变的,假想出这个坐标系的目的主要是为了正向理解 ...

  3. Unity中旋转方式的探究与对万向节死锁(Gimbal Lock)的理解

    Gimbal Lock Gimbal Lock的原理网上已经有很多资料,详细可以看介绍视频.视频讲到Gimbal Lock的时候提到x,y,z三个坐标轴是有从属关系(hierarchical syst ...

  4. 鼠标 ArcBall 局部坐标系 旋转模型

    坐标系统 关键词:世界坐标系 模型坐标系 相机坐标系 模型坐标系到世界坐标系的变换举证,世界坐标系到相机坐标系的变换举证,透视投影,成像面与屏幕的比例映射 一般在计算机图形显示中,我们需要三个坐标系构 ...

  5. OSG 高效渲染 之 多线程模型与渲染

    这里以OSG多线程渲染为例,谈谈OSG渲染引擎多线程渲染模式,再说说哪里有点"过时"了需要改进. 先谈点题外话,曾经看到知乎上一篇关于游戏引擎的设计讨论的文章,有位"大大 ...

  6. OpenGL 坐标变换(2)

    1.全局把握-OpenGL中的坐标变换 OpenGL中的点,从用户构造模型的局部坐标系,经过一系列处理最终渲染到屏幕坐标系下,才形成了3D图形. 这里的主要变换过程如下图所示: 注意: 1)OpenG ...

  7. 【游戏渲染】【译】Unity3D Shader 新手教程(1/6)

    http://gad.qq.com/article/detail/7175490 该文章来自用户转载 点击阅读原文 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散, ...

  8. 第四章 DirectX 渲染流水线(上)

    我们在第一章中讲过,一个3D场景中的模型是如何被显示到屏幕上的.这个流程就称之为渲染流水线.这个流程在OpenGL中也是大致如此的.Direct3D的渲染流水线过程如下: 在DirectX 9 中,有 ...

  9. WebGL简易教程(五):图形变换(模型、视图、投影变换)

    文章目录 1. 概述 2. 详论 1) 模型变换 (1) 平移变换 (2) 缩放变换 (3) 旋转变换 (4) 组合变换 2) 视图变换 (1) 原理 (2) 推导 3) 投影变换 (1) 透视投影 ...

最新文章

  1. 如果只能通过IE写博客【Do we write blog just only with IE?】
  2. 记录一次postfix无法收取邮件和mysql异常不能启动
  3. ctype.h(cctype) 头文件函数大全
  4. linux misc device字符杂项设备驱动
  5. python运算符中用来计算整商的是什么_零基础学python,看完这篇文章,你的python基础就差不多了...
  6. Oracle Database 11g Express Edition使用限制,与其他版本的区别
  7. Java关键字synchronized的简单理解
  8. 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)
  9. Spring配置 context:component-scan/ mvc:annotation-driven /
  10. 国际认可不断增加,国产数据库发展与应用前景如何?
  11. Java开发笔记(一百三十七)JavaFX的标签
  12. Microsoft Project项目管理实践
  13. fgo服务器维护补偿,《FGO》:大版本维护补偿调整,部分石头将变成金苹果!
  14. 关系型数据库的一对一、一对多、多对一、多对多关系
  15. mysql查看当前所在库_MySQL查看当前数据库库
  16. MIS系统(1)- MIS系统的介绍
  17. argis利用gp工具打包tpk切片包
  18. MOT:A Higher Order Metric for Evaluating Multi-object Tracking
  19. 怎样查找某个外文期刊的文献?
  20. projectManager

热门文章

  1. 糖尿病容易诱发神经病变?要小心这7种神经病变,很可怕!
  2. 矿点三星android版本,三星Android系统文件夹全解
  3. 【脑洞】跳进直通地球另一端的洞中,人会如何运动?
  4. mysql开启数据库审计功能_mysql数据库开启审计功能
  5. MySQL8.0数据库审计
  6. Oracle数据库思维导图
  7. 两矩阵相乘之三层循环问题
  8. 数据透视表+函数搞定Excel中的非重复计数
  9. STM32F103以SPI 驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植
  10. TCP协议学习笔记: