游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1157|回复: 2

四员数的构造问题

[复制链接]

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2005-11-2 23:20:00 | 显示全部楼层 |阅读模式
    四员数可以用来表示一个绕轴的旋转变换。
    它的几何意义我这么描述:给定一个轴向量 v,一个绕它旋转的角度alpha
    那么四员数的表示这个变换就是 [ sin(alpha/2) * v, w ] w 是标量
    w = cos( alpha/2)
   
    最近看见微软写的CD3DArcBall类中,它没有用我上面的四员数构造方法,他直接就是从两个不共线的矢量叉乘计算出旋转轴作为四员数的矢量部分,点乘得到的余玄值作为标量部分
我的问题是:微软写的四员数构造方法是什么原理啊?

   我写了个构造四员数的代码如下,大家看看有什么问题没有。
        // 四元数表示一个绕轴旋转变换
                // 两个向量叉乘得到的向量的长度是 sin( angle )
        // q = ( s*x, s*y, s*z,   c);
        // s = sin( angle / 2 );
        // c = cos( angle / 2 );
        // 我们现在有了旋转轴 , 转换为四元数的矢量部分需要乘以 ( sin( angle / 2 ) / sin( angle ) )
        // 现在我们计算一个( sin( angle / 2 ) / sin( angle ) )稳定的公式
       
        // 半角公式有 sin( angle / 2 ) = sqrt(  ( 1 - cos( angle ) ) / 2 )
        // sin( angle )^2 + cos( angle )^2 = 1
        // 变换:
        // sin( angle / 2 ) / sin( angle )
        // = sqrt(  ( 1 - cos( angle ) ) / 2 ) / sqrt( 1 - cos( angle )^2 )
        // = 1 / sqrt( 2 * ( 1 + cos( angle ) ) -----ok! 矢量部分
       
        // 半角公式:
        // c = cos( angle / 2 ) = sqrt( 1 + cos( angle ) / 2 )
        //   = sqrt( 2 * ( 1 + cos( angle ) ) / 2 -----ok! 夹角部分
       
        // 把 c 变换位 sqrt( 2 * ( 1 + cos( angle ) ) / 2
        // 是为了减少一次sqrt运算, 使用上一次运算的结果

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2005-11-3 19:05:00 | 显示全部楼层

Re:四员数的构造问题

各位ggjj帮帮忙吧,我真的很想知道微软给出来的方法的原理,帮帮忙啊...
谢谢一万次先。

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2005-11-4 18:51:00 | 显示全部楼层

Re:四员数的构造问题

弟弟好~帮你顶一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 12:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表