Python 如何在三维空间中旋转一组点

Python 如何在三维空间中旋转一组点,python,numpy,math,3d,coordinates,Python,Numpy,Math,3d,Coordinates,我有一组三维坐标,需要旋转它们,以便这些点中的两个特殊点位于相同的y和z方向 points = [[212.0, 383.0, -228.6603240966797], [232.0, 429.0, -215.2471160888672], [251.0, 474.0, -200.294677734375], [264.0, 506.0, -182.71034240722656], [271.0, 545.0, -151.659912109375], [271.0, 571.0, -

我有一组三维坐标,需要旋转它们,以便这些点中的两个特殊点位于相同的y和z方向

    points = [[212.0, 383.0, -228.6603240966797], [232.0, 429.0, -215.2471160888672],
 [251.0, 474.0, -200.294677734375], [264.0, 506.0, -182.71034240722656],
 [271.0, 545.0, -151.659912109375], [271.0, 571.0, -103.2275390625],
 [264.0, 584.0, -49.09677505493164], [264.0, 590.0, 7.094006061553955],
 [297.0, 577.0, 55.64094543457031], [342.0, 545.0, 71.67172241210938],
 [387.0, 506.0, 62.63969421386719], [426.0, 474.0, 44.307640075683594],
 [458.0, 429.0, 26.28571319580078], [465.0, 383.0, 12.79250431060791],
 [465.0, 345.0, 6.777912616729736], [458.0, 299.0, 1.9844478368759155],
 [452.0, 247.0, -5.032294750213623], [115.0, 351.0, -101.5836410522461],
 [103.0, 332.0, -72.67787170410156], [109.0, 319.0, -43.654144287109375],
 [122.0, 312.0, -19.765241622924805], [135.0, 306.0, -1.681771159172058],
 [193.0, 267.0, 55.84020233154297], [212.0, 247.0, 65.46025848388672],
 [232.0, 235.0, 72.62020111083984], [271.0, 222.0, 77.47245025634766],
 [309.0, 222.0, 74.32344818115234], [180.0, 338.0, 39.40024185180664],
 [174.0, 364.0, 57.072181701660156], [174.0, 390.0, 76.49188232421875],
 [174.0, 416.0, 82.25331115722656], [193.0, 442.0, 37.21649169921875],
 [200.0, 442.0, 50.35261535644531], [206.0, 435.0, 63.788761138916016],
 [225.0, 429.0, 70.10556030273438], [238.0, 422.0, 72.33536529541016],
 [141.0, 370.0, -60.250762939453125], [135.0, 357.0, -38.055809020996094],
 [148.0, 351.0, -22.5621395111084], [174.0, 351.0, -12.084064483642578],
 [161.0, 364.0, -19.454940795898438], [141.0, 370.0, -37.95323181152344],
 [238.0, 306.0, 47.747005462646484], [245.0, 286.0, 62.69716262817383],
 [258.0, 273.0, 75.76963806152344], [290.0, 273.0, 73.55001068115234],
 [271.0, 293.0, 74.48524475097656], [251.0, 306.0, 63.64972686767578],
 [206.0, 506.0, 13.387508392333984], [200.0, 487.0, 39.5601806640625],
 [206.0, 474.0, 61.46839904785156], [219.0, 467.0, 71.84937286376953],
 [225.0, 461.0, 78.72380828857422], [264.0, 461.0, 86.57514953613281],
 [303.0, 461.0, 83.29869842529297], [271.0, 480.0, 85.00387573242188],
 [251.0, 500.0, 81.7071304321289], [238.0, 513.0, 71.04291534423828],
 [225.0, 519.0, 57.28331756591797], [212.0, 513.0, 39.4271125793457],
 [212.0, 506.0, 16.236431121826172], [219.0, 487.0, 56.382171630859375],
 [232.0, 480.0, 69.22164916992188], [245.0, 474.0, 77.29556274414062],
 [297.0, 461.0, 79.41549682617188], [245.0, 480.0, 75.18701171875],
 [232.0, 487.0, 65.57536315917969], [219.0, 493.0, 53.41996765136719]]
我需要平衡的两点是索引0和索引16。如何旋转所有坐标,使这两点位于同一z平面和y平面上?请注意,x和y始终为正,其中z可以同时为正

我在我的尝试中提到过,但我无法理解


我该怎么做呢?

p[0]
作为基点,我们要围绕它旋转其他点。
首先,从所有坐标中减去
P[0]
坐标。
现在我们有了新的
P[16]'
坐标xx,yy,zz。
按角度围绕Z轴旋转点
phi=-atan2(yy,zz)

将点绕Y轴旋转角度
theta=-acos(zz/L)
其中
L=P[16]'。长度

将坐标移回初始值
P[0]
(如果需要检索基点)

所以得到的仿射变换矩阵是

 M = Shift(-P[0]) * Rot(phi) * Rot(Theta) * Shift(P[0])