unity shader 如何获取物体的本地坐标
[font=MicrosoftYaHei,Tahoma,MicrosoftYahei,Simsun]unityshader如何获取物体的本地坐标_Object2World...
[font=Microsoft YaHei, Tahoma, Microsoft Yahei, Simsun] unity shader 如何获取物体的本地坐标 _Object2World 不知道怎么使用,求高手解答
展开
4个回答
展开全部
其实,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=的值来修改为相应的坐标系的值显示。
世界坐标系的最终输出,可见颜色连续变换的。
说回来,最终的变换是这样的:
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=的值来修改为相应的坐标系的值显示。
世界坐标系的最终输出,可见颜色连续变换的。
2019-06-04
展开全部
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是应用位置平移,所以平移之后的值就是物体的世界坐标)
至于获取本地坐标可以用来干嘛?
mul(unity_ObjectToWorld,v.vertex);得出的是物体模型上的顶点对应的世界坐标。
mul(unity_ObjectToWorld,float4(0,0,0,0));得出的是世界坐标零点;
mul(unity_ObjectToWorld,float4(0,0,0,1));得出的是物体的世界坐标。(后面的0应该是不应用位置平移,1是应用位置平移,所以平移之后的值就是物体的世界坐标)
至于获取本地坐标可以用来干嘛?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
通过在C#中计算本地坐标 向shader 中的 uniform 变量 直接传值引用即可,另外 _Object2World是从物体到空间的一个坐标变换矩阵, 想得到理想的效果必须将要进行的数据转换到同一个空间下计算才可以.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
half3 worldSpaceVertex = mul(_Object2World,(v.vertex)).xyz; v.vertex就是本地顶点坐标啊,乘上_Object2World变成了世界顶点坐标....... 查看更多答案>>
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询