首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何计算X和Z上对齐两个向量所需的旋转角度

如何计算X和Z上对齐两个向量所需的旋转角度
EN

Stack Overflow用户
提问于 2020-05-26 07:05:32
回答 1查看 930关注 0票数 1

我正在尝试旋转vector1 (红色),以便它在3D空间中与vector2 (蓝色)对齐。但是,应仅使用绕X轴和Z轴的旋转。

到目前为止,我已经使用优化算法解决了这个问题,该算法试图最小化向量之间围绕X轴和Z轴的角度。这在大多数情况下都工作得很好,但由于我必须计算大量的向量,所以速度太慢。

我用于优化方法的代码:

代码语言:javascript
运行
AI代码解释
复制
vector1 = np.array([0., -1., 0.])
vector2 = np.array([0.2, -0.2, -0.5])

def find_a_c(x, *args):
    vector1, vector2 = args[0], args[1]
    angle_x, angle_z = x[0], x[1]

    # Rotation matrices to rotate around X and Z
    Rx = np.array([[1., 0., 0.],
                  [0., np.cos(angle_x), -np.sin(angle_x)],
                  [0., np.sin(angle_x), np.cos(angle_x)]])

    Rz = np.array([[np.cos(angle_z), -np.sin(angle_z), 0.],
                  [np.sin(angle_z), np.cos(angle_z), 0.],
                  [0., 0., 1.]])

    vector1 = vector1.dot(Rx).dot(Rz)

    # calulate the angle between the vectors around X and Z
    angle_x = angle_between_vectors([vector2[1], vector2[2]], [vector1[1], vector1[2]])
    angle_z = angle_between_vectors([vector2[0], vector2[1]], [vector1[0], vector1[1]])

    return np.abs(angle_x) + np.abs(angle_z)

solution = minimize(fun=find_a_c,
                    x0=[0., 0.],
                    args=(vector1, vector2))

angle_x, angle_z = solution.x[0], solution.x[1]
print("Angle around X: {}°\nAngle around Z: {}°".format(np.rad2deg(angle_x), np.rad2deg(angle_z)))

打印:

代码语言:javascript
运行
AI代码解释
复制
Angle around X: -60.46948402478365°
Angle around Z: -45.0000003467713°

现在我正在寻找一种分析方法来解决我的问题。例如,用两个旋转角(围绕X和Z)形成的旋转矩阵以将vector1与vector2对齐。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-26 21:04:59

这是一个相当数学的问题,我不确定如何在这里正确地写数学,但你可以做下面的事情。如果首先围绕X轴旋转,然后围绕Z轴旋转,则最后一次旋转不会更改z投影。如果(a, b, c)是起始法线向量,(x, y, z)是结束法线向量,则可以基于绕X轴的旋转矩阵编写b * sin(f) + c * cos(f) = z,其中f是绕X轴的旋转角度。然后基于equality from wikipedia (看起来不太正确:应该去掉sng(c)部分),你可以找到f的值。因此,您可以计算X轴旋转矩阵,并在应用此旋转(a', b', c')后获得向量。然后将其与Z轴旋转矩阵相乘,并为xy写出等式,您可以得到Z轴旋转角度的sin和cos的值。

代码语言:javascript
运行
AI代码解释
复制
import numpy as np

vector1 = np.array([0., -1., 0.])
vector2 = np.array([0.2, -0.2, -0.5])
vector2 = vector2 / np.linalg.norm(vector2)
a, b, c = vector1
x, y, z = vector2
def angle(b, c, z):
    return np.arccos(z / np.sqrt(b ** 2 + c ** 2)) - np.arctan2(-b, c)

x_angle = angle(b, c, z)
x_after_x_rotation = a
y_after_x_rotation = b * np.cos(x_angle) - c * np.sin(x_angle)

det = np.sqrt(x_after_x_rotation ** 2 + y_after_x_rotation ** 2)
sin = x_after_x_rotation * y - y_after_x_rotation * x
cos = y_after_x_rotation * y + x_after_x_rotation * x
sin /= det
cos /= det
z_angle = np.arctan2(sin, cos)

print(np.rad2deg(x_angle), np.rad2deg(z_angle))
# 60.50379150343357 45.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62016425

复制
相关文章
计算旋转一定角度后的向量
结论 图片 并且它们的模长相等。 推导 仅用到一点点极坐标和和角公式的内容: 图片
kifuan
2022/10/24
1.4K0
计算旋转一定角度后的向量
OpenCV轮廓检测,计算物体旋转角度
http://blog.csdn.net/wangyaninglm/article/details/41864251
流川疯
2019/01/18
4.2K0
第4章-变换-4.2-特殊矩阵变换和运算
在本节中,将介绍和导出对实时图形必不可少的几个矩阵变换和运算。首先,我们介绍了欧拉变换(连同它的参数提取),这是一种描述方向的直观方式。然后我们谈到从单个矩阵中反演一组基本变换。最后,导出了一种方法,可以绕任意轴旋转实体。
charlee44
2022/01/04
3.6K0
第4章-变换-4.2-特殊矩阵变换和运算
Unity基础教程-物体运动(十一)——滚动(Animated Sphere)
这是有关控制角色移动的教程系列的第11部分,也是最后一部分。它把我们毫无特色的球变成了滚动的球。
放牛的星星
2020/11/25
3.4K0
Unity基础教程-物体运动(十一)——滚动(Animated Sphere)
Java 通过向量,计算移动方向,计算线段角度等
向量是指在数学中用于表示大小和方向的量。在计算机科学中,向量通常用于表示物体的位置、速度和加速度等。在Java中,可以使用坐标系中两点之间的差异来计算向量之间的距离。
zinyan.com
2023/07/14
8470
Java 通过向量,计算移动方向,计算线段角度等
如何通过图像消失点计算相机的位姿?
本文主要是个人在学习过程中的笔记和总结,如有错误欢迎留言指出。也欢迎大家能够通过我的邮箱与博主进行交流或者分享一些文章和技术博客。
点云PCL博主
2022/01/27
4.7K0
如何通过图像消失点计算相机的位姿?
WPF 基础 2D 图形学知识 求向量旋转角度
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF-%E5%9F%BA%E7%A1%80-2D-%E5%9B%BE%E5%BD%A2%E5%AD%A6%E7%9F%A5%E8%AF%86-%E6%B1%82%E5%90%91%E9%87%8F%E6%97%8B%E8%BD%AC%E8%A7%92%E5%BA%A6.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
林德熙
2021/03/08
9930
第4章-变换-4.1-基础变换
本节介绍最基本的变换,例如平移、旋转、缩放、剪切、变换级联、刚体变换、法线(normal)变换(不太normal)和逆计算。对于有经验的读者,它可以作为简单变换的参考手册,对于新手,它可以作为对该主题的介绍。这些材料是本章其余部分和本书其他章节的必要背景。我们从最简单的变换开始——平移。
charlee44
2021/12/21
4.1K0
第4章-变换-4.1-基础变换
【笔记】《游戏编程算法与技巧》1-6
本篇是看完《游戏编程算法与技巧》后做的笔记的上半部分. 这本书可以看作是《游戏引擎架构》的入门版, 主要介绍了游戏相关的常见算法和一些基础知识, 很多知识点都在面试中会遇到, 值得一读.
ZifengHuang
2022/08/30
4.2K0
Unity2D游戏开发-常用的计算方法
若正好在区间内则直接返回原值,如果比最大值大则返回最大值,若比最小值小则返回最小值。
码客说
2023/08/08
3590
基础渲染系列(六)——凹凸
(温馨提示:本系列知识是循序渐进的,推荐第一次阅读的同学从第一章看起,链接在文章底部)
放牛的星星
2020/07/10
3.8K0
基础渲染系列(六)——凹凸
cordic的FPGA实现(二) 向量模式与伪旋转处理
本节更新的Coordinate Rorate Digital Computer的向量模式介绍与伪旋转处理,结尾处会总结旋转模式与向量模式的区别,在接下来的系列中会更新乘法器、除法器、sin函数、cos函数的verilog实现与matlab实现原理,并分享verilog与matlab代码。
数字芯片社区
2020/07/20
8350
cordic的FPGA实现(二) 向量模式与伪旋转处理
cordic第二讲、向量模式与伪旋转处理
本节更新的Coordinate Rorate Digital Computer的向量模式介绍与伪旋转处理,结尾处会总结旋转模式与向量模式的区别,在接下来的系列中会更新乘法器、除法器、sin函数、cos函数的verilog实现与matlab实现原理,并分享verilog与matlab代码。
根究FPGA
2020/06/30
1.7K0
cordic第二讲、向量模式与伪旋转处理
Python 进行人脸校正
在做人脸识别的时候,前期的数据处理过程中可能会遇到一个问题,即将人脸从不同尺寸的图像中截取出来,再进行“对齐”操作。这样可以使每一个截取的人脸中的眼睛等位置处于同一位置,会对后面的识别算法起到一定的优化作用。
caoqi95
2019/03/28
2.6K0
Python 进行人脸校正
如何计算DG环境下Redo传输所需的带宽?
MOS有篇文章: How To Calculate The Required Network Bandwidth Transfer Of Redo In Data Guard Environments (Doc ID 736755.1)
Alfred Zhao
2022/12/07
6620
游戏开发中的向量数学
本教程是线性代数的简短实用介绍,因为它适用于游戏开发。线性代数是向量及其用途的研究。向量在2D和3D开发中都有许多应用,并且Godot广泛使用它们。对矢量数学有深入的了解对于成为一名强大的游戏开发者至关重要。
海拥
2021/08/23
1.4K0
图形中的线性代数
本篇介绍下图形学中涉及的线性代数,通过本篇的学习,可以为后续学习图形的各种变换打下坚实的基础。为了避免单纯介绍数学带来的抽象,本篇会以图形的方式来解释数学。那现在就开始吧。
一只小虾米
2022/10/25
9500
图形中的线性代数
M2DP:一种新的三维点云描述子及其在回环检测中的应用
文章:M2DP: A Novel 3D Point Cloud Descriptor and Its Application in Loop Closure Detection
点云PCL博主
2022/12/27
1.1K0
M2DP:一种新的三维点云描述子及其在回环检测中的应用
Cesium入门之九:Cesium加载gltf文件
glTF(Graphics Library Transmission Format)是一种用于存储3D模型和场景的格式。它是一种开放的标准格式,可用于在不同的3D引擎和软件之间传输和交换3D模型和场景数据。
九仞山
2023/10/14
3.4K0
Cesium入门之九:Cesium加载gltf文件
图形学入门(一):坐标变换
将一个物体显示到屏幕上,这个事情似乎非常简单,以至于我们基本上认为它已经天经地义到直接告诉计算机我们要显示什么物体它就会自动显示出来,毕竟我们拍照的时候就是举起相机按下快门就会出现一张图片了。但事实上,相机是基于物理感光元件实现了从三维世界到二维图片的投影,在计算机的程序世界中一切都需要被计算出来,也就是说,我们只有一堆图形的描述信息,我们需要自己将这些图形在二维的平面上绘制的方式告诉操作系统,操作系统才能最终在屏幕上绘制出我们想要的图形。
zhiruili
2021/08/10
1.9K0
图形学入门(一):坐标变换

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档