围绕给定轴旋转任意平面会导致结果不一致
Posted
技术标签:
【中文标题】围绕给定轴旋转任意平面会导致结果不一致【英文标题】:Rotation of arbitrary plane around a given axis results in inconsistent results 【发布时间】:2018-09-24 11:31:15 【问题描述】:我正在尝试围绕某个任意轴旋转和平移任意平面。 出于测试目的,我编写了一个简单的 python 程序,它围绕 X 轴以 度旋转一个随机平面。
不幸的是,在检查平面之间的角度时,我得到了不一致的结果。这是代码:
def angle_between_planes(plane1, plane2):
plane1 = (plane1 / np.linalg.norm(plane1))[:3]
plane2 = (plane2/ np.linalg.norm(plane2))[:3]
cos_a = np.dot(plane1.T, plane2) / (np.linalg.norm(plane1) * np.linalg.norm(plane2))
print(np.arccos(cos_a)[0, 0])
def test():
axis = np.array([1, 0, 0])
theta = np.pi / 2
translation = np.array([0, 0, 0])
T = get_transformation(translation, axis * theta)
for i in range(1, 10):
source = np.append(np.random.randint(1, 20, size=3), 0).reshape(4, 1)
target = np.dot(T, source)
angle_between_planes(source, target)
打印出来:
1.21297144225
1.1614420953
1.48042948278
1.10098697889
0.992418096794
1.16954303911
1.04180591409
1.08015300394
1.51949177153
在调试此代码时,我看到转换矩阵是正确的,因为它表明它是
我不确定出了什么问题,希望在这里得到任何帮助。
* 生成变换矩阵的代码是:
def get_transformation(translation_vec, rotation_vec):
r_4 = np.array([0, 0, 0, 1]).reshape(1, 4)
rotation_vec= rotation_vec.reshape(3, 1)
theta = np.linalg.norm(rotation_vec)
axis = rotation_vec/ theta
R = get_rotation_mat_from_axis_and_angle(axis, theta)
T = translation_vec.reshape(3, 1)
R_T = np.append(R, T, axis = 1)
return np.append(R_T, r_4, axis=0)
def get_rotation_mat_from_axis_and_angle(axis, theta):
axis = axis / np.linalg.norm(axis)
a, b, c = axis
omct = 1 - np.cos(theta)
ct = np.cos(theta)
st = np.sin(theta)
rotation_matrix = np.array([a * a * omct + ct, a * b * omct - c * st, a * c * omct + b * st,
a * b * omct + c * st, b * b * omct + ct, b * c * omct - a * st,
a * c * omct - b * st, b * c * omct + a * st, c * c * omct + ct]).reshape(3, 3)
rotation_matrix[abs(rotation_matrix) < 1e-8] = 0
return rotation_matrix
【问题讨论】:
【参考方案1】:您生成的source
不是向量。为了成为一,它的第四个坐标应该为零。
你可以生成有效的:
source = np.append(np.random.randint(1, 20, size=3), 0).reshape(4, 1)
请注意,当您将代码粘贴到问题中时,无法对其进行测试:例如,get_transformation
中的 vec = vec.reshape(3, 1)
使用了以前未在任何地方定义过的 vec
...
【讨论】:
谢谢,我没有注意到错字,现在更正了。为什么第四个坐标应该是0?,我想用齐次坐标表示平面,基本上是随机的(a,b,c,d) 平面之间的角度是通过计算平面的法线向量之间的角度获得的。它们应该是法线向量,具有 3 个坐标(a、b 和 c)。目前还不清楚p1
和p2
应该在你的angle_between_planes
中。所以,要么你传递这个函数有 3 个坐标的向量,或者你传递你的 4 个齐次坐标,但是更新函数只使用前 3 个坐标。如果你保持不变,传递它 (a1, b1, c1, 0) 和 (a2, b2, c2, 0),法线向量的坐标,做你所期望的:计算它们之间的角度。
哦,我明白了,谢谢。我更改了问题中的代码以匹配您的更正,但我仍然得到不一致的结果..
@ShaulRobinov 您不会在平面之间获得 pi/2 角度,除非它们包含旋转轴的方向。以一个垂直于 X 轴的平面为例:它的旋转图像将是它自己,原始平面与旋转平面之间的角度将为 0。以上是关于围绕给定轴旋转任意平面会导致结果不一致的主要内容,如果未能解决你的问题,请参考以下文章