Inverse transpose matrix

对normal进行变换不能直接乘以变换矩阵,必须乘以inverse transpose matrix

给定一个顶点的Normal n,以及过该点的切平面上的一个向量u,且有变换矩阵T。u,n是行向量,T是行矩阵,可知满足如下条件[1]


对于DX,由于使用行矩阵作为变换矩阵,所以直接乘以inverse transpose matrix就可以。对于OpenGL,由于使用列矩阵,所以我们还需要做一下转置。
假设U是列矩阵,且满足


,于是有


所以对于OpenGL,其实需要计算transpose inverse matrix,但是我们注意到,对于可逆矩阵A有,


所以综合上面两个结论,我们可知,对于OpenGL,最后还是可以使用inverse transpose matrix来计算变换后的normal。


Reference:

[1] Geometric Tools for Computer Graphics

### 错误原因 在使用 `numpy` 将旋转矩阵转化为四元数时,出现 'Matrix must be orthogonal, i.e. its transpose should be its inverse' 错误,是因为旋转矩阵需要是正交矩阵。正交矩阵的定义是其转置矩阵等于其逆矩阵,即 $R^T R = I$,其中 $R$ 是旋转矩阵,$I$ 是单位矩阵。当输入的矩阵不满足这个条件时,就会触发该错误。 可能导致矩阵不满足正交条件的原因有: 1. **数据误差**:在实际应用中,由于浮点数运算的精度问题,可能会导致矩阵元素存在微小误差,使得矩阵近似但不完全正交。 2. **矩阵计算错误**:在生成旋转矩阵的过程中,可能存在计算错误,导致矩阵不满足正交性。 3. **输入错误**:输入的矩阵可能并非真正的旋转矩阵,而是其他类型的矩阵。 ### 解决方案 #### 1. 检查矩阵是否正交 在进行旋转矩阵到四元数的转换之前,可以先检查矩阵是否正交。可以通过计算矩阵与其转置矩阵的乘积,检查结果是否接近单位矩阵。 ```python import numpy as np def is_orthogonal(matrix): # 计算矩阵与其转置的乘积 product = np.dot(matrix.T, matrix) # 检查结果是否接近单位矩阵 return np.allclose(product, np.eye(matrix.shape[0])) matrix = np.random.rand(3, 3) if is_orthogonal(matrix): # 进行旋转矩阵到四元数的转换 pass else: print("Matrix is not orthogonal.") ``` #### 2. 矩阵正交化 如果矩阵接近正交,但由于数值误差导致不满足正交条件,可以使用 `numpy` 中的 `np.linalg.qr` 函数对矩阵进行正交化处理。 ```python import numpy as np def orthogonalize(matrix): Q, _ = np.linalg.qr(matrix) return Q matrix = np.random.rand(3, 3) orthogonal_matrix = orthogonalize(matrix) ``` #### 3. 检查输入数据 确保输入的矩阵确实是旋转矩阵。旋转矩阵应该是 3x3 的方阵,并且行列式的值应该接近 1。 ```python import numpy as np def is_rotation_matrix(matrix): # 检查矩阵是否为 3x3 方阵 if matrix.shape != (3, 3): return False # 检查矩阵是否正交 if not is_orthogonal(matrix): return False # 检查行列式的值是否接近 1 det = np.linalg.det(matrix) return np.isclose(det, 1) matrix = np.random.rand(3, 3) if is_rotation_matrix(matrix): # 进行旋转矩阵到四元数的转换 pass else: print("Input is not a valid rotation matrix.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值