TangentSpace的法线转换到ViewSpace

本文探讨了在三维图形渲染中,从对象空间到视图空间变换时,顶点的法线为何不能直接使用Model-View矩阵变换。通过数学推导,解释了如何正确变换法线以保持其与切线的垂直关系,并指出了特殊情况下的变换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片稍后补上
对于顶点来说,从object Space转换到eye space, 使用model-view矩阵就好了.那么顶点的法线是否也可以直接使用model-view矩阵转化?
  通常情况下是不行的.
  如下两张图是顶点的tangent和normal向量使用m-v矩阵从object space到eye space的变换:
  
  可以看到在eye-space中,tangent的方向仍符合定义,normal则不再垂直于tangent了.m-v矩阵不适用于normal.
  令T为tangent,MV为model-view矩阵.P1, P2为tangent联系的2个顶点.
  T = P2 - P1
  T’ = T * MV = (P2 - P1) * MV = P2 * MV - P1 * MV = P2’ - P1’
  因此T’保留了tangent的定义.但对于normal,你也可以找到N=Q2-Q1代表它,但是变换后Q2’-Q1’却不能保证垂直于T’.object space到view space,角度关系被改变了.
  如何求出normal的变换,维持与tangent垂直?假设该变换为G.
  normal与tangent垂直:
  N’.T’ = (GN).(MT) = 0
  由于GN相乘是一个向量,向量等于他自己的转置:GN = (GN)T
  (GN).(MT) = (GN)T * (MT) = (GN)T(MT) = (NTGT)(MT) = NTGTMT = 0
  注意到NTT为0:
  若GTM = I,则上式成立.因此G=(M-1)T.
  即normal matrix是model-view矩阵的逆矩阵的转置矩阵.
  若model-view矩阵是一个正交矩阵,则G=M.这便是例外情况下normal matrix为model-view矩阵.

### Unity 坐标系详解 在开发过程中,理解不同坐标系的作用对于创建复杂场景至关重要。Unity 提供了几种不同的坐标空间用于描述物体的位置和方向。 #### 本地坐标系 (Local Space) 每个 GameObject 都有自己的局部坐标系,该坐标系相对于其父级对象而言。当一个对象作为另一个对象的孩子时,它的位置、旋转和平移都是基于父级定义的空间来进行计算[^1]。 #### 世界坐标系 (World Space) 这是全局性的参照框架,在此之下所有物体最终都会被转换到这一标准体系里表示它们的实际存在地点。无论任何情况下,整个游戏世界的原点固定不变,通常位于舞台中心或者由开发者自行设定。 #### 相机坐标系/视图坐标系 (View Space 或 Camera Space) 也称为观察者视角下的坐标系统;它反映了摄像机所见的内容——即将屏幕上的图像映射回三维环境的过程。在这个坐标系中,“前方”总是指向-Z轴负向,而Y轴向上保持一致。 #### 投影坐标系 (Projection Space) 经过透视变换后的二维平面坐标集,主要用于渲染管线后期处理阶段。这里涉及到将3D数据压缩成适合显示器呈现的形式,即把立体视觉效果转化为平面上的图形。 #### 切线坐标系 (Tangent Space) 特别适用于法线贴图技术等领域,用来表达表面细节变化的方向信息。这种坐标系允许更精细地模拟光照反射特性,增强材质的真实感表现力。 关于手型差异的问题确实值得注意:虽然大多数现代建模工具采用右手定则构建几何结构,但Unity内部却选择了左手版本作为默认设置。这意味着从外部导入资产时可能需要调整以匹配引擎预期的行为模式[^4]。 ```csharp // 示例代码展示如何获取并打印当前Transform的世界坐标 using UnityEngine; public class CoordinateSystemExample : MonoBehaviour { void Start() { Vector3 worldPosition = transform.position; Debug.Log($"Object's position in World Space is {worldPosition}"); // 获取相对父节点的本地坐标 Transform parentTransform = this.transform.parent; if(parentTransform != null){ Vector3 localPosition = this.transform.localPosition; Debug.Log($"Object's position relative to its Parent(Local Space) is {localPosition}"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值