Math 如何在3D中找到四边形的旋转?
我有4个向量的坐标,定义了一个四边形,另一个是法线。我正在试着得到四边形的旋转。我使用法线在X和Y上旋转得到了很好的结果,但是我在得到Z时遇到了困难,因为我只使用了一个向量 以下是我使用and(和)的基本测试: 以下是输出:Math 如何在3D中找到四边形的旋转?,math,3d,vector,geometry,rotation,Math,3d,Vector,Geometry,Rotation,我有4个向量的坐标,定义了一个四边形,另一个是法线。我正在试着得到四边形的旋转。我使用法线在X和Y上旋转得到了很好的结果,但是我在得到Z时遇到了困难,因为我只使用了一个向量 以下是我使用and(和)的基本测试: 以下是输出: xy: 90.0 xz: 0.0 yz: 90.0 angleBetween x: 90.0 angleBetween y: 90.0 angleBetween z: 90.0 atan2 x: 0.0 atan2 y: 0.0 atan2 z: 90.0 如何获得
xy: 90.0 xz: 0.0 yz: 90.0
angleBetween x: 90.0
angleBetween y: 90.0
angleBetween z: 90.0
atan2 x: 0.0
atan2 y: 0.0
atan2 z: 90.0
如何获得我的四边形Z轴的旋转(围绕其中心/法线)?这是Z轴的旋转矩阵 cos(θ)sin(θ)0 -sin(θ)cos(θ)0 01
- 你的向量
结果是旋转向量正常。坦率地说,我仍然不太清楚你在寻找什么,但让我试着澄清这个问题,然后解决我对你真正想要什么的最佳猜测,看看这是否有帮助 如评论线程中所述,旋转是一种变换,它将一组内容(例如向量a,B,C)映射到另一组内容(a',B',C')。我们可以用一个角度(称之为θ)和一个我们称之为R的旋转轴来定义这个变换 请注意,R不是一个向量,而是一条线。这意味着它有一个位置和一个方向——它被锚定在空间的某个地方——所以你需要两个点或者一个点和一个方向向量来定义它。为简单起见,我们可以假设锚点是原点(0,0,0),因为问题涉及长轴X、Y和Z。但是,通常情况下,情况并非如此-如果要确定围绕任意直线的旋转,通常需要首先平移所有对象,以便轴通过原点。(如果您关心的只是对象的方向,而不是其位置,那么您可能可以忽略这个问题。) 给定一个起始位置a、结束位置a'和一个轴R,从概念上来说,确定角度θ(或角度θ,因为旋转是周期性的,并且有无限多的θs将a带到a')是很简单的,虽然对于generalR来说可能有点麻烦。在最简单的情况下,R是一个主轴,您可以这样做(对于R=Z): 在任何情况下,从您的代码中看,似乎您已经有了这样做的工具--我不熟悉有毒物质,但我可以想象
Vec3D
angleBetween
方法应该会让您找到您想要的答案
然而,前提是你知道A、A'和R,这似乎是你问题的真正症结所在。首先,您只提到一组点,定义任意四边形。在第二个例子中,我们将法线定义为旋转中心。这两种情况都表明您没有正确指定问题
正如我重复了好几次,旋转是从一件事到另一件事。一组四边形顶点可以定义第一种状态或第二种状态,但不能同时定义两种状态(除非θ为0,在这种情况下,问题无关紧要)。如果要确定“四边形的旋转”,还需要说“从先前位置P”或“到后续位置Q”,这是您没有做的
考虑到所讨论的特定四边形是一个正方形,您可能会认为这涉及到一个直观的其他位置,即:边轴对齐。如果我们可以假设四边形是一个矩形,我们确实可以很容易地确定达到那个方向所需的旋转角度:
但是,您特别指出,您可能正在查看任何任意四边形,对于这些四边形,没有“自然”基准位置可供比较。即使在正方形的情况下,假设一个基线而不明确声明它,坦白说也不是一个好的做法
这让我们回到我最初的问题:你是什么意思?如果你真的能正确地确定这一点,我想你会发现问题本身相对容易解决
编辑:根据下面的评论,您真正想做的是找到一个旋转,使四边形与一个主平面对齐。这相当于旋转四边形的法线以与垂直于该平面的轴对齐:例如,要使四边形平行于XY平面,请将其法线与Z轴对齐 这在理论上可以通过围绕某个计算轴的单个旋转来完成,但在实践中,您将其分解为围绕主轴的两个旋转。第一个绕目标轴旋转,直到向量位于包含该轴和其他轴之一的平面内;然后围绕第三个轴旋转以使法线与其最终对齐。口头描述不可避免地很笨拙,所以让我们正式一点: 假设你有一个平面对象Q,顶点为{v1,v2,v3,…}(在你的四元模型中有四个,但只要所有点都是共面的,它可以是任意数),单位法线n=(x y z)T。为了解释起见,让我们任意假设我们想要将对象与XY平面对齐,从而将n旋转到Z轴——对于XZ/Y或YZ/X,过程基本相同 围绕Z旋转,使n进入XZ平面。我们可以这样计算所需的角度:
theta1 = -atan2(x,y);
[ c1 s1 0 ]
[ -s1 c1 0 ]
[ 0 0 1 ]
[ c2 0 -s2 ]
[ 0 1 0 ]
[ s2 0 c2 ]
然而,我们只需要正弦和余弦来建立旋转矩阵,我们可以直接计算这些矩阵
theta1 = -atan2(x,y);
hypoXY = sqrt(x*x + y*y);
c1 = x/hypoXY;
s1 = y/hypoXY;
[ c1 s1 0 ]
[ -s1 c1 0 ]
[ 0 0 1 ]
theta2 = -atan2(z, sqrt(x*x + y*y));
c2 = z;
s2 = hypoXY;
[ c2 0 -s2 ]
[ 0 1 0 ]
[ s2 0 c2 ]
[ c2c1 c2s1 -s2 ]
[ -s1 c1 0 ]
[ s2c1 s2s1 c2 ]