给出 X、Y 和 Z 向量相对于球体的情况,找出球体的自旋。
2009-11-14 4:34:15
收藏:0
阅读:270
评论:2
我正在使用使用带有 Lua 的 Electro 进行一些 3D 模拟,但我遇到了一个数学/算法/物理方面的难点。
我试图找出如何寻找一个绕轴旋转的球的“旋转”。所谓“旋转”,是指沿着球正在旋转的轴的向量,其大小与其旋转速度成比例。我需要这些信息是为了能够通过对球施加反向扭矩来减缓球的旋转,直到它停止旋转。
我唯一可以访问的信息是相对于球的 X、Y 和 Z 单位向量。也就是说,每个帧,我可以调用三个不同的函数,每个函数返回一个指向球模型的本地 X、Y 和 Z 轴方向的单位向量。我可以通过基本上保持每个向量的“先前”值并将其与“新”值进行比较来跟踪每个向量的变化方式。那么问题是,我如何使用这些信息来确定球的旋转?我被难住了。
任何帮助都会很好。谢谢!
原文链接 https://stackoverflow.com/questions/1733284
点赞
stackoverflow用户128940
我赞成unutbu的回答,但我认为有一个更简单的方法足以解决这个问题。
在三个连续帧中,取X轴的单位向量,并将它们进行比较,得到两个增量:
deltaX1 = X2 - X1
deltaX2 = X3 - X2
(这些是矢量方程。X1是一个向量,即时间1时的X轴向量,不是数字。)
现在,取这两个增量的叉积,你将得到一个指向旋转向量方向的向量。
现在计算大小。两个增量之间的角度是一个时间间隔内扫过的角度,因此使用点积:
dx1 = deltaX1/|deltaX1|
dx2 = deltax2/|deltaX2|
costheta = dx1.dx2
theta = acos(costheta)
w = theta/dt
出于精度考虑,你应该选择变化最大的单位向量(X、Y或Z)。
2009-11-15 20:15:22
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我的第一个答案是错的。这是我修改后的答案。
您的单位向量 X、Y 和 Z 可以放在一起组成一个 3x3 的矩阵:
A = [[x1 y1 z1], [x2 y2 z2], [x3 y3 z3]]
由于 X、Y 和 Z 随时间而变化,A 也随时间变化。
A 是一个旋转矩阵!毕竟,如果让 i=(1,0,0) 成为沿 x 轴的单位向量,那么
A i = X
,因此 A 将 i 旋转到 X。同样地,它将 y 轴旋转到 Y,将 z 轴旋转到 Z。A 被称为“方向余弦矩阵”(DCM)。
因此,使用 DCM 到欧拉轴公式
计算
theta = arccos((A_11 + A_22 + A_33 - 1)/2)
theta 是旋转的欧拉角。
角速度的大小,|w|,等于
w = d(theta)/dt ~= (theta(t+dt)-theta(t)) / dt
旋转轴由 e=(e1,e2,e3) 给出,其中
e1 = (A_32 - A_23)/(2 sin(theta)) e2 = (A_13 - A_31)/(2 sin(theta)) e3 = (A_21 - A_12)/(2 sin(theta))