python - 具有齐次坐标的 MVP 变换
问题描述
我正在尝试使用 python 和 numpy 计算 MVP 转换,我的代码可能有问题,因为我最终得到 aw=0。我对照 glu 函数检查了我的截头锥体/透视图/lookat,它们似乎是正确的。由于 numpy 数组的 C 顺序,我更改了操作顺序,并按该顺序应用模型、视图和投影。在示例中,转换原点会导致 w=0 的齐次坐标,这当然会阻止我将结果除以 w。
import numpy as np
def frustum(left, right, bottom, top, znear, zfar):
M = np.zeros((4, 4), dtype=np.float32)
M[0, 0] = +2.0 * znear / (right - left)
M[2, 0] = (right + left) / (right - left)
M[1, 1] = +2.0 * znear / (top - bottom)
M[2, 1] = (top + bottom) / (top - bottom)
M[2, 2] = -(zfar + znear) / (zfar - znear)
M[3, 2] = -2.0 * znear * zfar / (zfar - znear)
M[2, 3] = -1.0
return M
def perspective(fovy, aspect, znear, zfar):
h = np.tan(fovy / 360.0 * np.pi) * znear
w = h * aspect
return frustum(-w, w, -h, h, znear, zfar)
def lookat(eye, center, up):
normalize = lambda x: x/np.linalg.norm(x)
M = np.eye(4)
eye = np.asarray(eye)
center = np.asarray(center)
z = normalize(eye-center)
x = normalize(np.cross(up,z))
y = normalize(np.cross(z,x))
M[:3,0], M[:3,1], M[:3,2], M[3,:3] = x, y, z, -eye
return M
proj = perspective(45.0, 1.0, 2.0, 100.0)
model = np.eye(4)
view = lookat([0,0,5], [0,0,0], [0,1,0])
P = [0,0,0,1]
P = proj @ view @ model @ P
print(P) # Probably wrong because P[3] = 0
解决方案
推荐阅读
- android - 如何获取存储在 android 中的 PDF 文件列表?
- javascript - 如何执行 if 语句 toString() ,如果它彼此相等,则不必在 Dart Flutter 中显示输出(android 模拟器,移动应用程序)
- mysql - 在mysql while循环中分配用户声明的变量会导致null
- java - InputStream 有问题
- php - 无法在 laravel 5.8 中下载 laravel/socialite 包
- c# - 当我使用 DownloadProgressChangedEventHandler 时 C# 控制台应用程序关闭
- powerbi - 更改 Power BI 电源查询中的列显示
- javascript - ReactJS 中未定义的变量
- linux - centos7上如何调试rsyslog
- php - 使用 PHP 和 SSH 与外部数据库交互