我对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);
答案 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上是对称的。