Python 两矩阵间的半圆运动

Python 两矩阵间的半圆运动,python,math,matrix,Python,Math,Matrix,我试图在3D空间中以弧形运动将一个对象从a点移动到b点。我最近一直在阅读矩阵,我试图了解它们,但无济于事。 比如说: a = (x.100.0,y.200.0,z.300.0) b = (x.-300.0,y.-100.0,z.0.0) c = finding the middle of a,b matrices d = start at a, do something with math.pi and multiplying the c matrices to give you and arc

我试图在3D空间中以弧形运动将一个对象从a点移动到b点。我最近一直在阅读矩阵,我试图了解它们,但无济于事。 比如说:

a = (x.100.0,y.200.0,z.300.0)
b = (x.-300.0,y.-100.0,z.0.0)
c = finding the middle of a,b matrices
d = start at a, do something with math.pi and multiplying the c matrices to give you and arc motion over to b. 

然后计算圆弧位置,c位于圆弧的中间。这样做对吗

u
v
成为你的两个向量。对两个向量进行规格化,分别获得
u'
v'
。计算
u'
v'
的叉积,得到一个与它们正交的向量
w
。规范化
w
以获得
w'

现在需要创建一个关于轴
w'
的旋转
R
,以便
R*u'=v'
。只要
u
v
不共线,就只有两个选项,分别对应于顺时针和逆时针方向。其中一个较短,对应于最佳旋转

Wikipedia的这一部分介绍了如何构建
R


你有轴
w'
,角度是
arccos(点(u',v'))
,因为单位向量的点积是它们之间角度的余弦。

圆心是M=(a+b)/2,半径r=| a-b |/2。当你从M开始沿着垂直于(b-a)的方向移动时,你会发现点c:

v是垂直于(b-a)的任何向量。求垂直向量v的一种方法是取(b-a)与任何不平行于(b-a)的任意向量的叉积,例如

v=(b-a)(x.0,y.0,z.1)

正如前面提到的,这个问题有很多解决方案,取决于v.

看一看,我不确定这是否正是您想要的,但它完全映射到我如何解析您的问题。如果可以的话,也许我也会给出一个答案。在三维空间中,两点之间有无限多的弧。你想要哪一个?谢谢,我会看看那个链接。还有一半,这是一个很好的点,我不知道怎么说,但是,这两个点的“向上”旋转向量是y,比如说,它会在x,y弧内移动。类似于如果它是2d I配偶。我猜,随着3d的增加,位置a将指向位置b,并沿着两个点的“向上”向量弧。我希望这是有道理的。在这个阶段,如果我诚实的话,任何弧线都可以,只是努力去解决它。@MihaiMaruseac,Slerp看起来很有趣。恐怕我不确定如何将其公式或概念应用到我的问题中。如果你有时间,你能帮我吗?你可能知道这主要是为了OP的好处:这会将一个向量旋转到另一个,但通常方向是由向量和角度(或四元数)来描述的。如果你从旋转矩阵开始,这个答案只完成了一半,如果你想把一个向量旋转成另一个向量,或者你有一个轴对称,这个答案就可以了。@Hooked谢谢你注意到了。现在你已经指出了这一点,这是有道理的。在这个阶段,我很乐意让一些东西发挥作用,但我需要你提到的问题的解决方案,当我在某个点上没有轴对称时。@Timothy Shields谢谢你的帮助,这听起来很有希望,我最初认为我可能必须规范化向量,但不确定。如何“创建一个围绕w轴的旋转R,使R*u'=v'”@justachap请参阅更新。如果您仍然感到困惑,我认为这可能不适合继续堆栈溢出…@Timothy Shields谢谢您,很抱歉浪费了您的时间。最难学的东西是你还没有学过的东西,因为不知道R代表什么,所以很难找到解释。但是无论如何谢谢你。。。
c = M + r * v/abs(v)
v = (b-a) <crossproduct> (x.0, y.0, z.1)