如何解决将平面转换为 XY 平面
我试图找到转换矩阵,这将允许我将给定的平面转移到 XY 平面。基于此 answer,我准备了执行这些计算的小型 Python 函数。但是我不明白为什么最终平面不在 XY 中。 你能帮我告诉我我做错了什么吗?
我的输入平面 (3d view):
390.17 * x + -571.67 * y + -4008.29 * z + 2833797.03 = 0
input = [390.17,-571.67,-4008.29,2833797.03]
z = 0.0973*x - 0.1427*y + 706.9838
在我看来,要将其转移到 XY 平面,应该(首先)完成围绕 X 和 Y 轴的旋转。最后一个元素是沿 Z 轴的平移。
基于此 answer,我准备了我的函数 transform_plane()。 (代码如下)。
2.19436115e+00 1.61044899e+03 4.06772244e+03 -4.20201320e+04 = 0
out = [2.19436115e+00,1.61044899e+03,4.06772244e+03,-4.20201320e+04]
Z = -0.0005*x-0.3959*y+10.3301
看起来,平面只围绕 Y 旋转,为了与 XY 对齐,它还应该围绕 X 轴旋转。 这是否意味着我忘记了某事?或链接答案中提供的矩阵不足以对两个不同的轴进行转换?
编辑:
感谢下面的回答,我能够找到丢失的平方根,但是我仍然不明白为什么我的翻译不够。
我的结果不是 Z = 0,而是 Z = 10。在我看来,也许 -d/c
也应该除以平方根。
我的实现:
import numpy as np
def calc_cos_phi(a,b,c):
return c / sqrt(a*a + b*b + c*c)
def calc_sin_phi(a,c):
return sqrt((a*a + b*b) / (a*a + b*b + c*c))
def calc_u1(a,c):
return b / (a*a + b*b)
def calc_u2(a,c):
return -a / sqrt(a*a + b*b)
def get_transform_matrix(plane):
a,c,d = plane
cos_phi = calc_cos_phi(a,c)
sin_phi = calc_sin_phi(a,c)
u1 = calc_u1(a,c)
u2 = calc_u2(a,c)
out = np.array([
[cos_phi + u1 * u1 * (1 - cos_phi),u1 * u2 * (1 - cos_phi),u2 * sin_phi,0 ],[u1 * u2 * (1 - cos_phi),cos_phi + u2 * u2 * (1 - cos_phi),-u1 * sin_phi,[-u2 * sin_phi,u1 * sin_phi,cos_phi,-d / c ],[0,1 ]
])
return out
def transform_plane(plane):
t = get_transform_matrix(plane)
t_inv = np.linalg.inv(t)
new_plane = np.dot(plane,t_inv)
print("new plane:")
print(new_plane)
return new_plane
测试:
plane = [390.17,2833797.03]
plane_xy = transform_plane(plane)
解决方法
您在这里错过了sqrt
:
def calc_u1(a,b,c):
return b / (a*a + b*b)
应该
def calc_u1(a,c):
return b / sqrt(a*a + b*b)
替换给出 [-1.13686838e-13 0.00000000e+00 4.06760715e+03 -4.19362793e+04]
- x 系数几乎为零,平面平行于 OXY(如 z=-1.05
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。