Java 从点的矢量与轴及其长度的夹角获取点在三维空间中的坐标

Java 从点的矢量与轴及其长度的夹角获取点在三维空间中的坐标,java,math,vector,3d,geometry,Java,Math,Vector,3d,Geometry,从原点(0x,0y,0z)指向三维空间某处的向量大小。 我还有一个角度,向量在X和Z轴上的投影,在它和Y轴之间。换句话说,我有一个操纵杆,它的左右移动读数为X角(从-35度到35度),前后移动读数为Z角(从-35度到35度)。当操纵杆处于初始位置时,返回0。我得到了一个大小读数(绳子从操纵杆上拔出的距离)。我需要找到字符串末端点的坐标(假设1厘米的大小等于单位向量)。点将始终位于x-z轴平面上方。震级永远不是0 我希望有一个关于Java的算法或一段代码,即使有一个指向额外资料的链接也很好。有Q&

从原点(0x,0y,0z)指向三维空间某处的向量大小。 我还有一个角度,向量在X和Z轴上的投影,在它和Y轴之间。换句话说,我有一个操纵杆,它的左右移动读数为X角(从-35度到35度),前后移动读数为Z角(从-35度到35度)。当操纵杆处于初始位置时,返回0。我得到了一个大小读数(绳子从操纵杆上拔出的距离)。我需要找到字符串末端点的坐标(假设1厘米的大小等于单位向量)。点将始终位于x-z轴平面上方。震级永远不是0

我希望有一个关于Java的算法或一段代码,即使有一个指向额外资料的链接也很好。有Q&A谈论旋转角度和矩阵,但看起来我有一个不同的问题

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

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

    +z
     |            
-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

听起来你有两个角度和一个大小,这是球坐标。您希望将球坐标转换为笛卡尔坐标:

更多信息

编辑:

经进一步研究后,我发现问题更为奇怪。在y轴上有两个分量向量(0,y,z)和(x,y,0)的投影,它们描述俯仰和滚动。我确信操纵杆为偏航提供了另一个组件,但是在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中的符号约定对某些分量求反。

听起来好像有两个角度和一个幅值,即球坐标。您希望将球坐标转换为笛卡尔坐标:

更多信息

编辑:

经进一步研究后,我发现问题更为奇怪。在y轴上有两个分量向量(0,y,z)和(x,y,0)的投影,它们描述俯仰和滚动。我确信操纵杆为偏航提供了另一个组件,但是在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中的符号约定对某些组件进行否定。

这似乎不符合预期。我正试图找到解决办法

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

y = (1/tan(alpha) * x) + (0 * z)
y = (0 * x) + (1/tan(theta) * z)
直线(z轴上的投影有一个方程式:

y = (1/tan(alpha) * x) + (0 * 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 /
漂亮的方程式:

y = (1/tan(alpha) * x) + (0 * z)
y = (0 * x) + (1/tan(theta) * z)
?\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。

这似乎没有达到预期效果。我正在尝试找到解决方案

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

y = (1/tan(alpha) * x) + (0 * z)
y = (0 * x) + (1/tan(theta) * z)
直线(z轴上的投影有一个方程式:

y = (1/tan(alpha) * x) + (0 * 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 /
漂亮的方程式:

y = (1/tan(alpha) * x) + (0 * z)
y = (0 * x) + (1/tan(theta) * z)
?\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。这是我的例子中的一个解(不同的轴,但原理相同)

假设:

OK = LT' = x [unknown]
OL = T'K = y [unknown]
OT = 1 [unit vector]
^TKT' = ^a
^TLT' = ^b
我们计算出xy之间的关系:

y = x * (tan(b) / tan(a))
当OT为单位向量时,x可通过以下方式找到:

x = sqrt{ tan^2(a) * cos^2(b) / (tan^2(a) + sin^2(b)) }
y = 1 / sqrt{ tan^2(a) / sin^2(b) + 1 }
z(TT')是:


这是我的案例中的一个解决方案(不同的轴,但原理相同)

假设:

OK = LT' = x [unknown]
OL = T'K = y [unknown]
OT = 1 [unit vector]
^TKT' = ^a
^TLT' = ^b
我们计算出xy之间的关系:

y = x * (tan(b) / tan(a))
当OT为单位向量时,x可通过以下方式找到:

x = sqrt{ tan^2(a) * cos^2(b) / (tan^2(a) + sin^2(b)) }
y = 1 / sqrt{ tan^2(a) / sin^2(b) + 1 }
z(TT')是:


好奇的是,大小值是否在[1 sqrt(2)]范围内?Aggieboy操纵杆从[-1]返回坐标,我将它们转换为距离原点的距离。我正在尝试为游戏轨迹控制器编程。它重新启动