1

我有一个从原点(0x,0y,0z)指向 3D 空间中某处的向量的大小。我也有一个角度,向量在 X 和 Z 轴上的投影在其自身和 Y 轴之间形成。换句话说,我有一个操纵杆,它读取 X 角(从 -35 到 35 度)用于左右移动和 Z 角(从 -35 到 35 度)用于前后移动。当操纵杆处于初始位置时,它返回 0。我得到一个幅度读数(绳子从操纵杆拉出多远)。我需要找到字符串末尾点的坐标(假设 1 厘米大小等于单位向量)。点将始终位于 xz 轴平面上方。幅度永远不会是 0。

我会很欣赏 Java 上的算法或一段代码,即使指向额外材料的链接也很好。有关于旋转角度和矩阵的问答,但看起来我有一个不同的问题。

UPD:角度不在矢量和 x、y、z 轴之间。它们是向量在轴上的投影与 Y 轴形成的角度。

UPD1:操纵杆可以左右前后移动:

    +z
     |            
-x -- -- +x       -x --'-- +x
     |
    -z
Top view          Side view (along z-axis)

以及在中间有一个可扩展的字符串:

    +z                +s (+y)
     |                 |
-x -- -- +x       -x --'-- +x
     |
    -z
Top view          Side view (along z-axis)

当字符串被扩展时,在 3D 中形成一个点 (P)

    +z               +y                 +y
     | P              |  P               |  P
     |/               | /                | /
-x --/-- +x           |/                 |/
     |           -x --'-- +x        -z --'-- +z
    -z
Top view          Side view          Side view
               (along z-axis)      (along x-axis)

我收到以下格式的坐标:

- x-axis angle (call it alpha) [-1 1] in reality between [-35 and 35] degrees
- y-axis angle (call it theta) [-1 1] in reality between [-35 and 35] degrees
- magnitude of vector OP (call it magnitude) [-1 1] in reality between 0[ and 305] cm
4

3 回答 3

4

听起来您有 2 个角度和一个幅度,即球坐标。您正在寻找将球坐标转换为笛卡尔坐标:

转换

更多信息在这里

编辑:

在进一步检查这个问题后,我发现这个问题更加奇怪。您有两个分量向量 (0,y,z) 和 (x,y,0) 在 y 轴上的投影,它们描述了俯仰和滚动。我确信操纵杆为偏航提供了另一个组件,但是它没有在 OP 中指定。奇怪的是,这些分量实际上不可能是 (x,y,z) 向量的向量分量,因为这样 y 投影将是相同的。我认为OP 正在寻找的是由这些给定的组件点和原点创建的新平面的法线。为此,必须给我投影起源的向量的大小。由于未指定,我假设它们是单位向量。

Vector xPrime=Vector(sqrt(1-xProj^2),xProj,0);
Vector zPrime=Vector(0,y,sqrt(1-zProj^2));
Vector ans=cross(zPrime,xPrime);

叉积方程。答案可能需要根据 OP 中的符号约定否定某些组件。

于 2013-05-09T01:08:05.870 回答
0

这似乎没有按预期工作。我正在努力寻找解决方案。

设 Y 轴与向量在 X 轴上的投影之间的角度为“alpha”,而 Y 轴与向量在 Z 轴上的投影之间的角度为 (theta)。x 轴上的线(投影)有一个方程:

y = (1/tan(alpha) * x) + (0 * z)

直线(z 轴上的投影有一个方程:

y = (0 * x) + (1/tan(theta) * z)

所以我们可以重新排列它们以获得以下等式:

x = (z * tan(alpha)) / tan(theta)
z = (x * tan(theta)) / tan(alpha)

如果我们在向量的大小方程中替换除一个以外的所有未知数:

|v| = sqrt(x^2 + y^2 + z^2)

我们得到一个可以用 x 重新排列的方程:

         /   magnitude^2 + tan^2(alpha)    \
x = sqrt |---------------------------------|
         \ tan^2(alpha) + tan^2(theta) + 1 /

好看的等式:

http://latex.codecogs.com/gif.latex ?\sqrt{}\frac{\left%20|vector\right%20|^2%20+%20tan^2%28xy%29}{tan^2 %28xy%29%20+%20tan^2%28zy%29%20+%201}

(复制 - 粘贴链接)

然后我们可以替换前面方程中的 x 得到 z 和 y。

于 2013-05-11T16:10:16.240 回答
0

Here's a solution from my case (different axis, but the principle is the same)

enter image description here

Assuming:

OK = LT' = x [unknown]
OL = T'K = y [unknown]
OT = 1 [unit vector]
^TKT' = ^a
^TLT' = ^b

We figure out relation between x and y:

y = x * (tan(b) / tan(a))

With OT being a unit vector, x can be found by:

x = sqrt{ tan^2(a) * cos^2(b) / (tan^2(a) + sin^2(b)) }
y = 1 / sqrt{ tan^2(a) / sin^2(b) + 1 }

And z (TT') is:

z = x * tan(b)
于 2020-05-14T13:14:53.763 回答