当前位置: 首页 > news >正文

osg中相机矩阵到vsg相机矩阵的转换

  前言

        在OSG和VSG中,相机的核心功能主要包括视图变换与投影变换:视图变换负责将世界坐标系中的物体转换到相机坐标系,而投影变换则进一步将相机坐标系中的物体映射到投影空间。由于OpenGL与Vulkan在底层实现上存在差异,Vulkan的深度范围定义为[0, 1],且y轴方向由上向下,这与OpenGL有所不同。因此,本章将重点讨论从OSG相机矩阵到VSG相机矩阵的转换方法,并进一步讨论投影矩阵之间的转换。


目录

  • 1 vsg相机矩阵到CesiumNative间的矩阵转换
  • 2 osg中的相机矩阵到vsg相机矩阵的转换

1 vsg相机矩阵到CesiumNative间的矩阵转换

       vsgCs(https://github.com/timoore/vsgCs/ v1.1.1)中,CesiumNative采用glm::dmat4数据结构来表达矩阵,可通过数值拷贝的方式可实现vsg中view矩阵和投影矩阵间的转换。如下所示:

    std::optional<Cesium3DTilesSelection::ViewState>createViewState(const vsg::ref_ptr<vsg::View>& view, const vsg::ref_ptr<vsg::RenderGraph>& renderGraph){auto* viewData = dynamic_cast<ViewData*>(view->getObject("vsgCsViewData"));if (!viewData){return {};}vsg::dmat4 Pw = vsg::computeTransform(viewData->tilesetPath);vsg::dmat4 PcsInv = TilesetNode::yUp2zUp * view->camera->viewMatrix->transform() * Pw;vsg::dmat4 Pcs = vsg::inverse(PcsInv);glm::dvec3 position(Pcs[3][0], Pcs[3][1], Pcs[3][2]);glm::dvec3 direction(Pcs[1][0], Pcs[1][1], Pcs[1][2]);glm::dvec3 up(Pcs[2][0], Pcs[2][1], Pcs[2][2]);vsg::ref_ptr<vsg::ProjectionMatrix> projMat = view->camera->projectionMatrix;glm::dvec2 viewportSize;if (view->camera->viewportState){VkViewport viewport = view->camera->viewportState->getViewport();viewportSize[0] = viewport.width;viewportSize[1] = viewport.height;}else{viewportSize[0] = renderGraph->renderArea.extent.width;viewportSize[1] = renderGraph->renderArea.extent.height;}Cesium3DTilesSelection::ViewState result =Cesium3DTilesSelection::ViewState(vsg2glm(view->camera->viewMatrix->transform()), vsg2glm(projMat->transform()), viewportSize);return {result};}

2 osg中的相机矩阵到vsg相机矩阵的转换

       osg中采用行优先形式存储矩阵,而vsg中采用列优先形式存储矩阵,以投影矩阵为例,透视投影下两者的计算公式分别如下:

osg投影矩阵
vsg投影矩阵

       从公式上看,值-1.0,两者在同一个位置,但却表达的含义不同,在osg中-1.0所在位置为第三行第四列,而在vsg中为第四行第散列。

       osg矩阵到vsg矩阵的转换代码如下所示:

vsg::dmat4 osg2vsg(const osg::Matrix& osgMat)
{vsg::dmat4 result;std::memcpy(result.data(), osgMat.ptr(), sizeof(double) * 16);return result;
}

       考虑到vsg中投影空间深度范围为0-1,且采用了reversed-z,Y轴从上到下,因此osg的投影矩阵到vsg的投影矩阵转换函数如下:

vsg::dmat4 osg2vsg(const osg::Matrix& osgMat)
{osg::Matrix oToV(1.0, 0.0, 0.0, 0.0,0.0, -1.0, 0.0, 0.0,0.0, 0.0, -0.5, 0,0.0, 0.0, 0.5, 1.0);vsg::dmat4 result;std::memcpy(result.data(), (osgMat* oToV).ptr(), sizeof(double) * 16);return result;
}

文末:本章借助vsgCs中的代码分析了vsg矩阵到CesiumNative矩阵的转换方法,可直接通过值拷贝实现转换。接着讨论了osg到vsg的矩阵转换方法,考虑到了osg中矩阵为行优先,而vsg中矩阵为列优先,在此基础上进一步讨论了两者投影矩阵的转换方法,考虑到了vsg投影空间的投影深度为[1,0],且y轴由上向下的特点。

http://www.dtcms.com/a/438209.html

相关文章:

  • 怎么给网站做seo上海中风险地区什么时候能解除
  • 在IDEA中使用Git
  • IntelliJ IDEA 2025:最新使用图文教程!
  • 十二、SpringMVC
  • 公司营销型网站建设成都建站seo
  • 什么是GO语言里面的GMP调度模型?
  • Traffic Filtering 流过滤 概念及题目
  • 198种组合算法+优化BiGRU双向门控循环单元+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
  • 兼职开发网站开发建设网站需要学什么
  • SQLite 简介
  • TypeScript 中的 JSX 详解
  • Codesys如何读取轴的当前控制模式
  • 高性能网站建设指南 京东模拟网站开发
  • 一元购网站建设教育类网站策划书
  • 2025 AI 落地全景:从技术热潮到产业重构
  • 解析动态数据:如何抓取 JavaScript 加载的 AJAX 内容
  • 聚焦技术落地,展现 AI 重构产业的实践路径。
  • 番禺网站(建设信科网络)小卖部做网站
  • 【氮化镓】P-GaN:提高高温栅极寿命的解决方案
  • 商洛做网站多少钱珠海网站制作哪家便宜
  • 唐山中企动力做网站用php做电子商务网站
  • 05_Pandas数据结构
  • OSPF协议详解3:网络类型、SPF算法、路由选择与特殊区域
  • 10.3总结
  • 算法比赛中的浮点数精度陷阱:从一个货币分解问题说起
  • 昆明手机网站开发不到网站是为什么
  • 反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
  • 爬坑 10 年!京东店铺全量商品接口实战开发:从分页优化、SKU 关联到数据完整性闭环
  • LeetCode每日一题——判断能否形成等差数列
  • springboot整合sa-token报未能获取有效的上下文处理器