unity shader 如何获取物体的本地坐标
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity shader 如何获取物体的本地坐标相关的知识,希望对你有一定的参考价值。
[font=Microsoft YaHei, Tahoma, Microsoft Yahei, Simsun] unity shader 如何获取物体的本地坐标 _Object2World 不知道怎么使用,求高手解答
其实,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=的值来修改为相应的坐标系的值显示。
世界坐标系的最终输出,可见颜色连续变换的。 参考技术A v【app -> vertex】.vertex;是物体模型顶点相对模型原点的相对坐标。
mul(unity_ObjectToWorld,v.vertex);得出的是物体模型上的顶点对应的世界坐标。
mul(unity_ObjectToWorld,float4(0,0,0,0));得出的是世界坐标零点;
mul(unity_ObjectToWorld,float4(0,0,0,1));得出的是物体的世界坐标。(后面的0应该是不应用位置平移,1是应用位置平移,所以平移之后的值就是物体的世界坐标)
至于获取本地坐标可以用来干嘛? 参考技术B 通过在C#中计算本地坐标 向shader 中的 uniform 变量 直接传值引用即可,另外 _Object2World是从物体到空间的一个坐标变换矩阵, 想得到理想的效果必须将要进行的数据转换到同一个空间下计算才可以. 参考技术C half3 worldSpaceVertex = mul(_Object2World,(v.vertex)).xyz; v.vertex就是本地顶点坐标啊,乘上_Object2World变成了世界顶点坐标....... 查看更多答案>>本回答被提问者采纳
unity shader 描边
https://zhuanlan.zhihu.com/p/66282034 这个是将整个模型放大 在世界坐标操作
https://blog.csdn.net/ToToTofu/article/details/106441097 静态物体描边
https://blog.csdn.net/linxinfa/article/details/108358127 在试图裁切空间放大
https://blog.csdn.net/puppet_master/article/details/54000951 好几种方法的总结
以上是关于unity shader 如何获取物体的本地坐标的主要内容,如果未能解决你的问题,请参考以下文章
[Unity Shader学习笔记]物体过大导致无法在game视窗显示的问题
[Unity Shader学习笔记]物体过大导致无法在game视窗显示的问题
Unity3DUnity 脚本 ④ ( 游戏物体 GameObject 的坐标 | 修改 游戏物体 GameObject 的本地坐标 )