XYZ旋转以平移和倾斜
XYZ rotation to pan and tilt
我正试图从电脑上控制一个朝某个方向移动的头部摄像头。相机仅通过平移(540度)和倾斜(280度)进行控制。问题是获得这些平移和倾斜角度的欧拉角。
我有一个方向的三维表示,比方说X、Y和Z旋转(欧勒角)。
现在我想把我的(物理!)云台相机移到同一个方向。但我不知道如何将xyz矢量转换为平移倾斜。
切换到正交齐次4x4变换矩阵
- euler角对于复杂的记忆运动来说很糟糕
- M是您的4x4相机变换矩阵
通过ang:围绕全球X轴的旋转
double c=cos(ang),s=sin(ang);
double Q[16]=
{
1, 0, 0, 0,
0, c,-s, 0,
0, s, c, 0,
0, 0, 0, 1
};
M=M*Q;
通过ang:绕本地相机X轴旋转
double c=cos(ang),s=sin(ang);
double Q[16]=
{
1, 0, 0, 0,
0, c,-s, 0,
0, s, c, 0,
0, 0, 0, 1
};
M=((M^-1)*Q)^-1;
有像glm这样的转换矩阵库,但我更喜欢我自己的
- 我知道很多人会不同意,但我的在这里的时间比其他任何公开的都长
- 我已经习惯了
- 其思想是始终记住M的正矩阵和逆矩阵
- 有一个标志,哪个更新了,哪个没有
- 并且在进行任何操作之前,检查所使用的矩阵是否相关
- 如果不是,则从另一个计算
- 还添加操作计数和达到非法侵入后的计数
- 进行正交性或正交性检查/校正
在这里你可以看到同质(4x4)和正常(3x3+1x3)3D变换矩阵之间的差异:
- https://stackoverflow.com/a/21611264/2521214
现在相机的驱动
- 我将参考4x4变换矩阵上方链接中的图像
- 我通常使用Z轴作为移动/查看方向
- 因此,在开始时,根据需要将矩阵重置为单位或设置为其位置和方向
- 如果要旋转,请使用局部旋转
- 当你想移动时,只需将你想移动的集合(在全局坐标中)添加到位置x0,y0,z0
因此,如果d个单位这样做,则向前移动:
x0+=d*Zx; y0+=d*Zy; z0+=d*Zz;
对于侧面移动,使用X矢量
- 对于向上/向下使用Y矢量
对于不同于X轴的旋转,只需使用不同的Q矩阵
绕Y轴旋转
c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1;
绕Z轴旋转
c,-s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1;
相关文章:
- 与互斥锁相比,旋转锁可以保证上下文切换
- 绘制旋转的三角形
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 发布旋转矩阵(openGL/glm)
- 顺时针迭代旋转 3 位数字
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 子轴围绕父轴而不是他自己的轴旋转
- 将使用太多的纹理插值器 - 带旋转的着色器
- SFML 向下移动时如何围绕屏幕中心旋转?
- 如何在OpenGL中正确旋转和缩放对象?
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 按时间自动旋转形状,同时在 OpenGL 中使用C++移动它们
- 如何使用增强::几何计算多边形的旋转固体体积?
- 使用 GDI+ 旋转位图,然后转换为 HDC
- XYZ旋转以平移和倾斜
- 使用opencv将旋转和倾斜的图像插入到另一个图像的检测矩形中