Lookat旋转问题

铜戈 2003-12-23 05:15:31
现有一个Node, 想让他面向某一个点, 怎样快速的计算出它的旋转矩阵(或者四元数)

1. 这个node可能是个子节点, 所以需要将目标点变换到改Node空间内, 或者将node变换到世界空间然后乘父的逆.
2. 这个节点可能有一个up方向, 或者没有, 也就是说, 如果有up方向, 旋转后该Node的up方向不变(和旋转之前一样). 如果没有up方向, 那么up方向是旋转后的up方向(是不是没说清楚)

我的想法如下(还没有时间去实现):

根据该Node的当前方向和目标方向可以求出旋转轴(叉积), 然后用点积求出旋转角, 然后构造旋转矩阵或者四元数

但是这个方法需要求叉积和反三角函数,有没有更好的办法?

各位有什么方法都请指点一二.

多谢!
...全文
148 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolizi 2003-12-23
  • 打赏
  • 举报
回复
To Lythm (村支书)

你觉得▲函数,反▲函数用起来很慢吗?有做过测试吗?^_^
我之前也以为▲函数肯定效率低下,就自己构造了▲函数表来查表求值,后来和标准库中的▲函数一比较,发现标准库中的函数比我自己的还快一些。^_^


一个4×4的matrix,第一行表示node的右边(right),第二行表示node的上边(up),第三行表示node的前边(face),第四行表示node的位置(position)。

所以如果知道旋转以后的Node的朝向向量,假如为vec_face,
则 vec_right = vec_face × vec_up
所以只要一个叉积就能得到需要的最终矩阵,因为做yaw旋转只是改变矩阵中的face和right分量而不会改变up分量。


^_^
tomb4 2003-12-23
  • 打赏
  • 举报
回复
。。。打错了
{qx,qy,qz} = V/(sqr(2*(1+D))),
tomb4 2003-12-23
  • 打赏
  • 举报
回复
2 Lythm (村支书):
“但是这个方法需要求叉积和反三角函数”:不用反三角函数啊:)
dot(v1,v2)=cos(a)=D
cross(v1,v2)=V

{qx,qy,qz} = V*(sqr(1+D)), qw = sqr((1+D)/2)

参看GEMS1
azheng0305 2003-12-23
  • 打赏
  • 举报
回复
我的分析:
已知量:1、Node的朝向向量;
2、旋转以后的Node的朝向向量;
3、Node的中心坐标,以及所在世界矩阵;
发现1、2之间共同点是,他们的起点都是3。
假如我们把Node的坐标看成原点,那么他们之间的关系就是绕原点旋转了~这个应该知道怎么弄的。
现在的问题就是Node的坐标不是原点那么巧,所以有必要做X/Y/Z的坐标平移,就可以满足要求。

不知道我的想法实现起来容易不容易。

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧