Unity Shader中获取模型中心点的世界坐标

Unity Shader中获取模型中心点世界坐标的几种写法

unity的世界变化矩阵最后一列是存的Transform里的Position,所以我们可以在shader里提取这部分数据做一些计算,下面是unity支持的几种写法:

float3 center = float3(unity_ObjectToWorld[0].w, unity_ObjectToWorld[1].w, unity_ObjectToWorld[2].w);

float3 center = float3(unity_ObjectToWorld._m03, unity_ObjectToWorld._m13, unity_ObjectToWorld._m23);

float3 center = mul(unity_ObjectToWorld , float(0,0,0,1)).xyz;

float3 center = unity_ObjectToWorld._14_24_34;


————————————————
原文链接:https://blog.csdn.net/qq_17632189/article/details/115397270

### 如何在 Unity获取指定点的世界坐标或屏幕坐标 #### 获取世界坐标 对于获取物体上某一点的世界坐标,在 C# 脚本中可以直接通过 `Transform` 组件来访问。如果目标是在着色器(Shader)内完成这一操作,则可以利用变换矩阵。 当涉及到具体顶点或者更复杂几何体上的任意位置时,可借助于对象的空间转换方法: - 对于简单的场景下直接读取 Transform 的 position 属性即可获得该 GameObject 在世界空间下的坐标[^1]。 ```csharp Vector3 worldPosition = transform.position; ``` 而在 Shader 内部,为了取得模型中心或其他特定部位的世界坐标,存在多种实现方式。一种常见做法是从应用的 ModelViewProjection (MVP) 矩阵解析出所需信息。由于 Unity 支持直接传递 Transformation Matrix 到 Shader,因此能够从中抽取 Position 数据用于进一步运算[^2]: ```hlsl float4x4 _ObjectToWorld; // Object to World transformation matrix provided by Unity float3 modelCenterWorldPos = mul(_ObjectToWorld, float4(0, 0, 0, 1)).xyz; ``` 此代码片段展示了如何基于给定的对象到世界的变换矩阵 `_ObjectToWorld` 来计算模型原点处的世界坐标。 #### 获取屏幕坐标 要将在三维世界中存在的实体映射至二维屏幕上对应的像素位置,通常会经历从世界坐标系向视图(View),再到裁剪(Clip),最后投影(Projected)的过程。Unity 提供了一个便捷的方法 `Camera.WorldToScreenPoint()` 可以一次性完成这个过程[^3]。 ```csharp // 假设有一个名为 target 的游戏对象 Vector3 screenPoint = Camera.main.WorldToScreenPoint(target.transform.position); ``` 上述函数接收一个 Vector3 类型参数表示待转化的世界坐标,并返回一个新的 Vector3 表达其在当前摄像机视角下的屏幕坐标。需要注意的是,默认情况下 Y轴方向正值代表向上移动;而 Z分量则指示了距离摄像头的距离,正数意味着位于前方。 另外,若需反向执行——即将鼠标点击或者其他输入源产生的屏幕坐标转回成对应的真实世界坐标,则应采用 `Camera.ScreenToWorldPoint()` 方法配合合适的深度值(zDepth)。 ```csharp Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { Vector3 worldHitPoint = hit.point; } ``` 这里展示了一种更为精确的方式去确定用户交互所指向的确切地点,特别是面对非平坦表面或多层结构时尤为有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值