Transforming Normal Vector

本文探讨了在计算机图形学中,如何正确地将Vector从ObjectSpace转换到TangentSpace。通过对线性代数原理的回顾及推导,揭示了Vector变换矩阵与Position变换矩阵之间的关系,并解释了为何在纹理映射的shader中需要使用特定的矩阵。

昨天开始写一些经典的Shader来练手,被一个数学问题难住了,把一个Vertex的Position从World Space转到 View 或者 Projection,我们只要执行 mul(pos, worldView) 或者mul(pos, worldViewProjection)就好了,但Vector如果通过这样的运算之后,得出来的结果是明显不正确的,为了解决这个问题,翻了一下大一的线性代数,推导了一下,得出公式,下面来严格的推导一次。

这个运算主要用在Object Space的坐标系和Tangent Space的坐标系的转换,用一个3*3的Matrix去处理一个Vector的结果大概如下:
 

变换之后方向明显不对了。

然后我们可以这样考虑:在Tangent Space上面, Tangent和Normal是垂直的,即有 N·T = 0
存在矩阵M, G,使 T' = M·T, N' = G·N,且 N'·T' = 0
有, N'·T' = (G·N)T·(M·T) = NT·(GT·M)·T= 0 又N·T = NT·T = 0 得 G = (M-1)T 

也就是说,Vector的坐标转换矩阵等于Position的转换矩阵的逆矩阵的转置

 
这样你再去看texture mapping的shader就阔然开朗,”为什么需要这样那样的矩阵呢?“之类的感叹应该尽量减少, 尝试用数学去解决它。

btw,google的信条是算法可以解决一切问题。
我以为,算法和数学是科学的基础,科学是我们的生活方式。face5.gif

转载于:https://www.cnblogs.com/eric720/archive/2007/04/20/721056.html

在 Power BI 中,数据转换是一个关键步骤,它通过 Power Query 编辑器实现。Power Query 提供了丰富的功能来清理、重塑和准备数据以供分析。以下是一些常见的 **Power BI 数据转换技术**: ### 使用 Power Query 进行数据转换 1. **重命名列与选择相关列** 在加载数据后,通常需要重命名列名以提高可读性或符合业务术语。此外,可以选择保留必要的列并删除无关列,从而优化模型性能[^1]。 2. **更改数据类型** 确保每列的数据类型正确(如文本、数字、日期等)对于后续建模和计算至关重要。例如,将字符串格式的日期转换为真正的日期类型可以提升时间智能函数的表现。 3. **处理缺失值** 可以选择删除包含缺失值的行,或者用默认值(如 0 或平均值)填充空值。此操作有助于保持数据完整性并避免计算错误[^1]。 4. **拆分与合并列** 拆分列常用于将复合字段(如全名、地址)分解为多个独立列(如姓氏和名字)。相反,合并列可用于连接多个字段生成新列(如完整地址)。 5. **筛选与排序** Power Query 允许根据特定条件筛选数据,例如只保留某个时间段内的记录。排序功能则有助于按字段顺序组织数据,便于后续处理。 6. **分组与聚合** 分组操作可以对数据进行汇总统计,例如按类别计算总销售额或平均值。这是构建汇总表和预聚合数据的重要手段。 7. **添加自定义列** 用户可以通过公式创建新的计算列,例如使用 `if` 条件语句或数学表达式生成新字段。这为数据增强提供了灵活性。 8. **追加查询** 将多个相似结构的数据源合并为一个统一的数据集,适用于整合来自不同年份或地区的数据。 9. **透视与逆透视** 透视操作将多行数据转换为列,而逆透视则将列转换为属性-值对。这种技术在处理非结构化或半结构化数据时非常有用。 10. **调用外部脚本(R/Python)** 对于复杂的转换任务,Power BI 支持在 Power Query 中调用 R 或 Python 脚本,从而扩展其数据处理能力[^1]。 ### 示例:在 Power Query 中添加自定义列 ```powerquery = Table.AddColumn(#"上一步骤名称", "Total Price", each [Quantity] * [UnitPrice]) ``` 上述代码展示了如何在 Power Query 中创建一个新的“Total Price”列,该列是“Quantity”和“UnitPrice”的乘积。 ### 数据转换的最佳实践 - **保持原始数据不变**:始终在副本上执行转换操作,以便保留原始数据以备审计或回滚。 - **使用查询参数**:定义动态参数可以提高灵活性,例如用于筛选日期范围或数据库连接字符串。 - **启用增量刷新**:对于大型数据集,配置增量刷新策略可以减少每次刷新所需的时间和资源消耗。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值