如何在3D中放置一个点以便创建一定的角度?

时间:2013-01-23 04:06:44

标签: c++ math 3d rotation trigonometry

我对3D有一个小问题。

以下是我的问题的一个例子。

我有两点:

答:12 4 5 B:6 8 -10

我有另一点: C:5 6 7

我需要变换(?)C点,使角度ABC为48度。

我该怎么做?如果有人可以帮我解决这些公式,或者甚至可以将上面的例子变成一个有效的例子,我将不胜感激。

另一种表达方式:如何变换C.x,C.y和C.z以使角度ABC为48度?

我真的很感激这方面的一些帮助,因为我现在被困住了。

旁注: 我已经实现了一种找到角度的方法:

float Angle( float x1, float y1, float z1,
             float x2, float y2, float z2 )
{
  float x, y, z;
  CrossProduct( x1, y1, z1, x2, y2, z2, &x, &y, &z );

  float result = atan2 ( L2Norm( x, y, z ),
                         DotProduct( x1, y1, z1, x2, y2, z2 ) );

  return result;
}

你用它: 角度(B.x - A.x,B.y - A.y,B.z - A.z,        C.x - B.x,C.y - B.y,C.z - B.z);

2 个答案:

答案 0 :(得分:2)

       A------C    
       |     
 c''   |    c'
       B

由于3D中的三个点定义了一个平面,因此在该平面上只有2个可能的候选变换C - > c'或C - > c''。

然后

c'将是c'= A + t *(BA)+ u *(CA),其约束为Normalize(c'-A)dot Normalize(BA)== cos(48/180 * pi)。< / p>

我首先建议将D =(B-A)归一化,之后:

D dot D+u*(C-A) = 1 * |D+u(C-A)| * cos (48 degrees)

Dx*(Dx+u*(Cx-Ax))+ Dy*(Dy+u*(Cy-Ay))+Dz*(Dz+u*(Cz-Az)) ==
    0.669 * sqrt ((Dx+u*(Cx-Ax))^2+(Dy+u*(Cy-Ay))^2+(Dz+u*(Cz-Az))^2)

这是形式为+ u * b == 0.669 * sqrt(c + du + e * u ^ 2),它将被简化为 u 中的二次多项式侧上。

答案 1 :(得分:0)

C点的轨迹实际上是一个圆锥,可以想象,B是顶点,AB线是圆锥的中心线,意味着3D圆锥在AB上是对称的。