[OSG]如何用Shader得到物体的世界坐标

  最近群里面有个朋友问我关于如何得到OpenGL世界坐标的问题,当时我还弄错了,误以为gl_ModelViewMatrix*gl_Vertex就是世界坐标。因最近也突然遇到了世界坐标的问题,所以花了一些时间来研究这个问题,网上也有人问,但或许没有答案,或许是错的。
其实,OpenGL的转换管道直接将gl_Vertex,也就是物体坐标,用gl_ModelViewMatrix相乘,得到的是眼坐标。如果将gl_ModelViewMatirx拆分为gl_ModelMatrix和gl_ViewMatrix,那么问题就好解决了。但事实上没有提供。要清楚OpenGL其实没有世界坐标系,世界坐标系是应用程序的概念。其实可以将OpenGL的摄像机看作是固定的,其坐标系就是眼坐标系,移动摄像机和移动物体的位置是一个相反的转换,对于观察者来说根本不知道是摄像机在动,还是物体在动(想想大卫的大变自由女神像的魔术吧,呵呵)
说回来,最终的变换是这样的:
eyePos=viewMatrix * modelMatrix * modelVertex
在OpenGL里面viewMatrix和modelMatrix合并了,因为OpenGL里面并没有设置摄像机的参数,所以OpenGL并不知道viewMatrix到底是什么。viewMatrix是用户自己定义的,所以如果能够得到这个viewMatrix并能得到其逆矩阵,就可以得到worldPos:
worldPos=viewMatrixInv * viewMatrix * modelMatrix * modelVertex
传统的OpenGL程序里面,你得自己计算这个viewMatrixInv,还好OSG的Camera提供了一个getViewMatrixInverse()方法,通过这个方法我们就可以轻松的获得viewMatrixInv,然后传递给Vertex Shader(用一个Uniform就可以),然后进行这个计算就可以了。
记得每一帧都需要Update这个viewMatrixInv,只需要一个updateCallBack就可以了。
好了,看几个图,我用3DSMAX创建了两个盒子,为了便于观察,模型的顶点值限制在0-1之间,然后用osgExp导出,没有选中Flatten Static Transform这样就不会把模型定点转换成世界坐标系的顶点。
源代码中可以改变gl_FragColor=的值来修改为相应的坐标系的值显示。
世界坐标系的最终输出,可见颜色连续变换的。

  眼坐标系的图,可见屏幕中间偏左的部分是黑的。因为其值是负的。平移拖动盒子可见相应像素着色不变。

  物体坐标系的图,可见两个盒子的颜色一样,因为其值是相同的。

源代码也附后,可以运行着看看,虽然程序简单,但用到的时候再也不用苦苦思考了,呵呵。

源代码:
www.hesicong.net/blog/upload/2008/5/RenderWorldCoordinate.tar

转载于:https://www.cnblogs.com/hesicong/archive/2008/05/27/1208312.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exposing Windows Forms Controls as ActiveX controls

转:http://www.codeproject.com/cs/miscctrl/exposingdotnetcontrols.asp?df100&forumid2373&exp0&select1359005 Download demo project - 15 Kb This article will describe how to utilise Windows Forms controls outside of .NET. In a recent MS…

知识碎片

JS 部分 基本类型 对于类型的进一步判断, 可以参考js类型判断 # typeof undefined – 未定义 object – 对象或null # null类型 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。这样一来,只要直接检查…

梦之所寄,行之所为——地狱之门就此洞开(读梦断代码有感)

在博客园的精华区看到一篇名为“程序员,对自己好一点”的文章,颇有感触。我只是初涉这个圈子的一个小小的实习生,却也觉得对于程序员而言:累,加班工作,吃青春饭…。为什么要把自己弄得如此狼狈?…

MPLS-L3×××中的公网访问

1.在站点内配置一个代理服务器拥有公网IP做NAT,之后网关写到CE,CE上配置默认路由指向PE,之后PE上做静态的公网跳出路由,即在静态路由的下以跳写public关键字。之后做回程路由跳回,下一跳写站点地址即可,但是…

Vuetable-2使用全纪录

vuetable-2介绍 vuetable2是一款基于vuejs开发的table组件,支持表格加载和翻页、翻页信息展示的组件官方github | 官方API学习 | Tutorialvuetable-2包括三个部分: vuetablevuetablePagination vuetablePaginationDropdownvuetablePaginationMixinvue…

OCP-052考试题库汇总(26)-CUUG内部解答版

Which three of these must be accessible to keep a database open? A)Control file. B)All members of a redo log group. C)SYSTEM tablespace. D)SYSAUX tablespace. E)spfile Answer: ABC 赵: 1 nomount:实例已经启动,进程和内存已经分…

QT_C++

QT_C C 与 C 区别&#xff1a;  面向过程&#xff1a;吃&#xff08;狗&#xff0c;屎&#xff09; 面向对象&#xff1a;狗. 吃&#xff08;屎&#xff09; ^ . ^ 博客&#xff1a;https://www.runoob.com/cplusplus/cpp-tutorial.html 插入符&#xff1a;<< 控制符…

使用Nodejs搭建server

使用Nodejs搭建server&#xff08;MySQL MongoDB&#xff09; 环境 文件 版本号nodejs8.10.0mysql2.16.0express-generator4.16.0pm23.0.3ejs2.6.1 - 准备工作 安装上述环境依赖使用express-cli快速创建服务&#xff0c;资料 express project-name将express的默认引擎jade调…

静态路由的实现

在路由器A上做如下配置&#xff1a;router(config)#hostname AA(config)#interface f0/0A(config-if)#ip address 192.168.1.1 255.255.255.0 A(config-if)#no shutdownA(config)#interface f0/1A(config-if)#ip address 192.168.2.1 255.255.255.0 A(config-if)#no shutdownA(…

2019-08-09 纪中NOIP模拟赛B组

T1 [JZOJ1035] 粉刷匠 题目描述 windy有N条木板需要被粉刷。 每条木板被分为M个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷&#xff0c;只能选择一条木板上一段连续的格子&#xff0c;然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次&#x…

vue3实现打字机的效果

前言&#xff1a; vue3项目中实现打字机的效果。 实现效果&#xff1a; 实现步骤&#xff1a; 1、安装插件 npm i vue3typed 2、main.js中配置 import vuetyped from vue3typedconst app createApp(App) // 挂载打字机的全局方法 app.use(vuetyped) 3、界面使用 <vuet…

易中天与单田芳的区别在哪儿

单田芳先生是中国著名的评书演员&#xff0c;我非常喜欢听单田芒的评书&#xff0c;在那个没有电视机的时代&#xff0c;收听单田芳先生的评书对我来说就是一种最大的人生享受。所以&#xff0c;“单田芳”这三个字早就镌刻在我的脑海之中。一直到今天我还深深地敬仰着这位全国…

Express + Node 爬取网站数据

前言 因为自己写的demo需要历史天气的统计数据&#xff0c;但是国内很难找到免费的api接口&#xff0c;很多都需要付费和审核。而国外的网站虽然免费但需要提前知道观测站&#xff0c;城市id等信息。所以就有了这么一篇文章的诞生。 准备工作 库 作用superagent发送请求supera…

ajax省级联动 回发或回调参数无效

今天在做项目有个修改内容的&#xff0c;有个地方用到省级联动&#xff0c;现在一般都用ajax&#xff0c;很少用auto什么的那个属性了 想想ajax做省级联动也很简单&#xff0c;就开始做了&#xff0c;没想到在修改的时候提示回发或回调参数无效&#xff0c;然后去网上找了好久 …

虚拟局域网(VLAN)的管理

什么是虚拟局域网&#xff1f;虚拟局域网是一种用逻辑的定义方法&#xff0c;把两个或更多的连在交换网络上的终端规划在一起。 这种逻辑定义方法可以延伸到多个交换机。被规划在一起的终端&#xff0c;可以通过几种网络设置来规划。好像任何一种网络技术一样&#xff0c;了解…

学习antd-design-pro

学习使用react-antd-pro框架(一篇学习中的问题思考记录) 框架介绍 react-antd-pro 大体上等于 react antd pro。官网对于相关技术栈的描述如下&#xff1a; 我们的技术栈基于 ES2015、React、UmiJS、dva、g2 和 antd UmiJS: 可插拔的企业级 react 应用框架 dva: React and r…

SqlZoo.net习题答案:The Join 【Movie】

习题地址&#xff1a;http://sqlzoo.net/3.htm 表结构&#xff1a;  movie(id, title, yr, director)      actor(id, name)      casting(movieid, actorid, ord) 1b.Give year of Citizen Kane. select yr from movie where title Citizen Kane 1c.List all …

汉语编程++

没想到汉语编程又有人开始网上对骂了。一方指另一方骗人&#xff0c;一方吹自已伟大。今天群里头有人又把它翻出来了&#xff0c;刚好无聊&#xff0c;也就发明了一个汉语编程语言&#xff0c;集成到visual studio 2005的IDE中&#xff0c;名字就叫汉语编程&#xff0c;欢迎同样…

hightopo学习系列:hightopo介绍(一)

起因 新的软件主管来公司以后&#xff0c;有整整2周的时间没有搭理前端开发。就在这周一快下班的时候&#xff0c;突然和我说话了。问了我一些以前用的图形库&#xff0c;并让我开始了解hightopo。甩给了我一个全拼&#xff0c;就拂袖而去&#xff0c;留下一脸懵逼的我。 没办…

mongo指令

use admin db.runCommand({logRotate:1}) show dbs; db.currentOp(); db.serverStatus().connections db.killOp(26593769); use adbname db.tblname.ensureIndex({"sendtime":1}) db.tblname.getIndex() 转载于:https://www.cnblogs.com/ccgblog/p/8427972.html