Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何在3D中找到四边形的旋转?_Math_3d_Vector_Geometry_Rotation - Fatal编程技术网

Math 如何在3D中找到四边形的旋转?

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 如何获得

我有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

如何获得我的四边形Z轴的旋转(围绕其中心/法线)?

这是Z轴的旋转矩阵

cos(θ)sin(θ)0

-sin(θ)cos(θ)0

01

  • 你的向量

结果是旋转向量

正常。坦率地说,我仍然不太清楚你在寻找什么,但让我试着澄清这个问题,然后解决我对你真正想要什么的最佳猜测,看看这是否有帮助

如评论线程中所述,旋转是一种变换,它将一组内容(例如向量aBC)映射到另一组内容(a'B'C')。我们可以用一个角度(称之为θ)和一个我们称之为R的旋转轴来定义这个变换

请注意,R不是一个向量,而是一条线。这意味着它有一个位置和一个方向——它被锚定在空间的某个地方——所以你需要两个点或者一个点和一个方向向量来定义它。为简单起见,我们可以假设锚点是原点(0,0,0),因为问题涉及长轴X、Y和Z。但是,通常情况下,情况并非如此-如果要确定围绕任意直线的旋转,通常需要首先平移所有对象,以便轴通过原点。(如果您关心的只是对象的方向,而不是其位置,那么您可能可以忽略这个问题。)

给定一个起始位置a、结束位置a'和一个轴R,从概念上来说,确定角度θ(或角度θ,因为旋转是周期性的,并且有无限多的θs将a带到a')是很简单的,虽然对于generalR来说可能有点麻烦。在最简单的情况下,R是一个主轴,您可以这样做(对于R=Z):

在任何情况下,从您的代码中看,似乎您已经有了这样做的工具--我不熟悉有毒物质,但我可以想象
Vec3D
angleBetween
方法应该会让您找到您想要的答案

然而,前提是你知道AA'R,这似乎是你问题的真正症结所在。首先,您只提到一组点,定义任意四边形。在第二个例子中,我们将法线定义为旋转中心。这两种情况都表明您没有正确指定问题

正如我重复了好几次,旋转是从一件事到另一件事。一组四边形顶点可以定义第一种状态或第二种状态,但不能同时定义两种状态(除非θ为0,在这种情况下,问题无关紧要)。如果要确定“四边形的旋转”,还需要说“从先前位置P”或“到后续位置Q”,这是您没有做的

考虑到所讨论的特定四边形是一个正方形,您可能会认为这涉及到一个直观的其他位置,即:边轴对齐。如果我们可以假设四边形是一个矩形,我们确实可以很容易地确定达到那个方向所需的旋转角度:

但是,您特别指出,您可能正在查看任何任意四边形,对于这些四边形,没有“自然”基准位置可供比较。即使在正方形的情况下,假设一个基线而不明确声明它,坦白说也不是一个好的做法

这让我们回到我最初的问题:你是什么意思?如果你真的能正确地确定这一点,我想你会发现问题本身相对容易解决


编辑:根据下面的评论,您真正想做的是找到一个旋转,使四边形与一个主平面对齐。这相当于旋转四边形的法线以与垂直于该平面的轴对齐:例如,要使四边形平行于XY平面,请将其法线与Z轴对齐

这在理论上可以通过围绕某个计算轴的单个旋转来完成,但在实践中,您将其分解为围绕主轴的两个旋转。第一个绕目标轴旋转,直到向量位于包含该轴和其他轴之一的平面内;然后围绕第三个轴旋转以使法线与其最终对齐。口头描述不可避免地很笨拙,所以让我们正式一点:

假设你有一个平面对象Q,顶点为{v1v2v3,…}(在你的四元模型中有四个,但只要所有点都是共面的,它可以是任意数),单位法线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   ]