三维中通过一个点和距离与其欧拉角计算另一个点位置

本文详细介绍了如何通过设定俯仰角(Pitch)和偏航角(Yaw)以及点B的坐标,利用三角函数计算三维点A的新坐标,适合三维场景中的动态变换应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在三维中计算一个点通过平移旋转的新点坐标

  在做三维交互的时候,我们也许会需要通过设定一些参数来计算一个三维点坐标到另一个点的变换过程;如,我们对点B(视锥体中心点)设置平移设置欧拉角:俯仰角(Pitch)、偏航角(Yaw)后,需要得到的点A的坐标位置,那么我们应该怎样来进行计算呢?

在这里插入图片描述

步骤分析

  这里我们是要通过F点设置角度与偏移来计算A点的坐标,那么上图中X的偏移量就应该为BI线段(x=BI),Y就应该为IK线段(Y=IK),Z则为AK线段(Z=AK);通过这些信息我们可以很明显的看出来,角KAB就是我们的俯仰角(Pitch),角KBI则是偏航角(Yaw),当前我们已知的信息有AB之间的距离,俯仰角及偏航角。

那么通过分析得出:
KB = SIN∠KAB * AB
z轴偏移量:Z = AK = COS∠KAB * AB
x轴偏移量:X = BI = SIN∠IKB * KB
y轴偏移量:Y = IK = COS∠IKB * KB

这样我们就知道了通过设置俯仰角(Pitch),偏航角(Yaw)和距离所偏移得到的点A的坐标了,那么下面就为大家把代码帖出来供大家取用。

代码实现

osg::Vec3f getNewPoint(osg::Vec3f pointB,double s_pitch,double s_heading, double s_dis)
{
	//这里原本向下为0度,此处减去90度是为了让俯仰角在平视时为0度
	float pitch = osg::DegreesToRadians(s_pitch - 90);
	//偏航角这里由于本人代码中需要进行反转所以将角度进行了反转
	float nAPYaw = (s_heading > 0) ? s_heading - 180 : s_heading + 180;
	float heading = osg::DegreesToRadians(nAPYaw);
	float len = s_dis * sinf(pitch);
	float delt_z = s_dis * cosf(pitch);
	float delt_x = len * sinf(heading);
	float delt_y = len * cosf(heading);
	osg::Vec3f spnt = pointB + osg::Vec3f(delt_x, delt_y, delt_z);
	return spnt;
}

到这里我们的点偏移计算讲解也就结束了,如果大家觉得我的方法还有用的话,也请大家能够点赞鼓励一下,您的鼓励是我分享的动力,谢谢各位!

### 使用欧拉角实现三维空间中一点到一点的旋转变换 为了理解如何使用欧拉角来描述物体在三维空间中的旋转并完成从一个点一个点的变换,可以按照以下方式考虑。 #### 定义初始条件目标位置 假设有一个位于 \( P_0(x_0, y_0, z_0) \) 的点,在应用一系列由欧拉角定义的旋转之后移动到了新的位置 \( P_1(x_1, y_1, z_1) \)[^2]。这里所说的欧拉角具体指的是 yaw (偏航), pitch (俯仰), roll (翻滚),它们分别对应于围绕 Z 轴、Y 轴以及 X 轴发生的旋转角度变化[^3]。 #### 构建旋转矩阵 基于给定的欧拉角参数,构建相应的旋转矩阵 R 来表达这些连续的转动过程: \[R = R_z(\psi) * R_y(\theta) * R_x(\phi)\] 其中, - \(R_x\) 表示沿X轴方向上的基本旋转; - \(R_y\) 是沿着Y轴执行的基础旋转操作; - \(R_z\) 则是在Z轴上实施的标准旋转形式; 而 \((\phi,\theta,\psi)\) 分别代表了上述提到过的三个不同类型的转角量值——即 roll、pitch yaw [^1]。 对于每一个单独的基本旋转而言,其对应的旋转矩阵可写作如下所示的形式: \[R_x (\alpha)=\begin{bmatrix} 1 & 0& 0 \\ 0 & cos{\alpha}& -sin{\alpha}\\ 0 & sin{\alpha}&cos{\alpha}\end{bmatrix},\quad R_y (\beta )=\begin{bmatrix} cos{\beta }& 0& sin{\beta }\\ 0 & 1 & 0\\ -sin{\beta }& 0 & cos{\beta }\end{bmatrix},\quad R_z (\gamma )= \begin{bmatrix} cos{\gamma }& -sin{\gamma }& 0\\ sin{\gamma }& cos{\gamma }& 0\\ 0 & 0 & 1\end{bmatrix} \] 因此,当已知某点的位置向量 p=[x,y,z]^T 并希望计算该点经过指定欧拉角所引起的位移后的最终坐标时,则可以通过下面这个公式来进行求解: \[p' = Rp\] 此处 p’ 即为变换后的新坐标矢量。 ```python import numpy as np def euler_to_rotation_matrix(yaw, pitch, roll): """Convert Euler angles to rotation matrix.""" cy = np.cos(np.radians(yaw)) sy = np.sin(np.radians(yaw)) cp = np.cos(np.radians(pitch)) sp = np.sin(np.radians(pitch)) cr = np.cos(np.radians(roll)) sr = np.sin(np.radians(roll)) Rz_yaw = np.array([[cy,-sy , 0], [sy, cy, 0], [0 , 0 , 1]]) Ry_pitch = np.array([[cp, 0, sp], [0, 1, 0], [-sp, 0,cp]]) Rx_roll = np.array([[1, 0, 0], [0,cr ,-sr ], [0,sr , cr ]]) # Rotation Matrix around fixed frame R = Rz_yaw @ Ry_pitch @ Rx_roll return R point_initial = np.array([1., 0., 0.])[:, None] angles_degrees = {'yaw': 90,'pitch': 45,'roll': 30} rotation_matrix = euler_to_rotation_matrix(**angles_degrees) transformed_point = rotation_matrix.dot(point_initial).flatten() print(f"The transformed point is {tuple(transformed_point)}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值