查看: 1149|回复: 11

请问四元素相乘的求角度规则是什么?//没怎么看懂

[复制链接]

该用户从未签到

发表于 2014-4-26 21:24:27 | 显示全部楼层 |阅读模式
本帖最后由 oirrm 于 2014-4-27 20:33 编辑

inline const Quat operator*(const Quat& rhs) const
        {
            return Quat( rhs._v[3]*_v[0] + rhs._v[0]*_v[3] + rhs._v[1]*_v[2] - rhs._v[2]*_v[1],
                 rhs._v[3]*_v[1] - rhs._v[0]*_v[2] + rhs._v[1]*_v[3] + rhs._v[2]*_v[0],
                 rhs._v[3]*_v[2] + rhs._v[0]*_v[1] - rhs._v[1]*_v[0] + rhs._v[2]*_v[3],
                 rhs._v[3]*_v[3] - rhs._v[0]*_v[0] - rhs._v[1]*_v[1] - rhs._v[2]*_v[2] );
        }

该用户从未签到

发表于 2014-4-29 14:56:28 | 显示全部楼层
四元数的四个元素定义了旋转轴和角度,被乘顶点将按照旋转轴旋转这个角度

该用户从未签到

 楼主| 发表于 2014-4-29 15:17:46 | 显示全部楼层
buaahc 发表于 2014-4-29 14:56
四元数的四个元素定义了旋转轴和角度,被乘顶点将按照旋转轴旋转这个角度

rhs._v[3]*_v[3] - rhs._v[0]*_v[0] - rhs._v[1]*_v[1] - rhs._v[2]*_v[2] );
//这句没有看懂。。。

该用户从未签到

发表于 2014-4-29 15:49:40 | 显示全部楼层
const Quat operator*(const Quat& rhs)就是四元数的叠乘,相当于对顶点施加了两次旋转矩阵q1,q2,非要搞清楚代码是怎么实现的,那需要明白四元数的原理以及计算方法,这个还是自己百度吧~

该用户从未签到

 楼主| 发表于 2014-4-29 17:03:26 | 显示全部楼层
本帖最后由 oirrm 于 2014-4-29 17:45 编辑
buaahc 发表于 2014-4-29 15:49
const Quat operator*(const Quat& rhs)就是四元数的叠乘,相当于对顶点施加了两次旋转矩阵q1,q2,非要搞清 ...



inline Vec3d Matrixd::postMult( const Vec3d& v ) const
{
    value_type d = 1.0f/(_mat[3][0]*v.x()+_mat[3][1]*v.y()+_mat[3][2]*v.z()+_mat[3][3]) ;  //这个是什么意思!!!!!!哥们
    return Vec3d( (_mat[0][0]*v.x() + _mat[0][1]*v.y() + _mat[0][2]*v.z() + _mat[0][3])*d,
        (_mat[1][0]*v.x() + _mat[1][1]*v.y() + _mat[1][2]*v.z() + _mat[1][3])*d,
        (_mat[2][0]*v.x() + _mat[2][1]*v.y() + _mat[2][2]*v.z() + _mat[2][3])*d) ;
}

该用户从未签到

发表于 2014-4-30 09:25:55 | 显示全部楼层
矩阵右乘,你可以理解成与逆相乘,朋友数学原理我还是希望您自己好好琢磨琢磨

该用户从未签到

 楼主| 发表于 2014-4-30 15:36:29 | 显示全部楼层
buaahc 发表于 2014-4-30 09:25
矩阵右乘,你可以理解成与逆相乘,朋友数学原理我还是希望您自己好好琢磨琢磨

啥数学原理,4*4矩阵转换成一列矩阵 ?

该用户从未签到

发表于 2014-4-30 16:26:03 | 显示全部楼层
难道向量与矩阵的乘法,还要一一解释么?

该用户从未签到

 楼主| 发表于 2014-5-3 18:16:02 | 显示全部楼层
oirrm 发表于 2014-4-29 17:03
inline Vec3d Matrixd::postMult( const Vec3d& v ) const
{
    value_type d = 1.0f/(_mat[3][0] ...


这俩个是矩阵转换成向量的???一个矩阵*向量  一个向量*矩阵? d不知道是啥作用。。。

inline Vec3d Matrixd::postMult( const Vec3d& v ) const
{
    value_type d = 1.0f/(_mat[3][0]*v.x()+_mat[3][1]*v.y()+_mat[3][2]*v.z()+_mat[3][3]) ;
    return Vec3d( (_mat[0][0]*v.x() + _mat[0][1]*v.y() + _mat[0][2]*v.z() + _mat[0][3])*d,
        (_mat[1][0]*v.x() + _mat[1][1]*v.y() + _mat[1][2]*v.z() + _mat[1][3])*d,
        (_mat[2][0]*v.x() + _mat[2][1]*v.y() + _mat[2][2]*v.z() + _mat[2][3])*d) ;
}

inline Vec3f Matrixd::preMult( const Vec3f& v ) const
{
    value_type d = 1.0f/(_mat[0][3]*v.x()+_mat[1][3]*v.y()+_mat[2][3]*v.z()+_mat[3][3]) ;
    return Vec3f( (_mat[0][0]*v.x() + _mat[1][0]*v.y() + _mat[2][0]*v.z() + _mat[3][0])*d,
        (_mat[0][1]*v.x() + _mat[1][1]*v.y() + _mat[2][1]*v.z() + _mat[3][1])*d,
        (_mat[0][2]*v.x() + _mat[1][2]*v.y() + _mat[2][2]*v.z() + _mat[3][2])*d);
}

该用户从未签到

发表于 2014-5-3 19:19:06 | 显示全部楼层
是这样的,表达三维的空间,三维向量就可以了。若要变换三维向量,对于旋转和放缩,让该向量乘以3*3的矩阵就可以了,但要是平移,不能用乘法,而要引入加法,这对于空间向量连续变换要付出巨大工作量的代价。

为了让平移变换也能用矩阵乘法,引入了4维向量(x,y,z,w)和四维矩阵m44,向量中的w一般是1,才有几何意义,所以计算出来的(x1,y1,z1,w1)要变成(x1/w1,y1/w1,z1/w1,1)才有意义。这就是d的含义。

我觉得你自己把这个三维向量(xyz)后面再添加一个1变成(xyz1),乘以m44手动推导一下,最后将那个“w”归一化,你就明白了

该用户从未签到

 楼主| 发表于 2014-5-4 14:38:03 | 显示全部楼层
wpsperson 发表于 2014-5-3 19:19
是这样的,表达三维的空间,三维向量就可以了。若要变换三维向量,对于旋转和放缩,让该向量乘以3*3的矩阵 ...

std::string setname;
    while(arguments.read("--allow",setname))
    {
        whiteList->allow(setname);
    }
大哥 这个setname值在命令行里写还是在程序里写?

该用户从未签到

 楼主| 发表于 2014-5-7 19:58:16 | 显示全部楼层
本帖最后由 oirrm 于 2014-5-8 00:05 编辑
wpsperson 发表于 2014-5-3 19:19
是这样的,表达三维的空间,三维向量就可以了。若要变换三维向量,对于旋转和放缩,让该向量乘以3*3的矩阵 ...



大哥 点与矩阵相乘的d的值一直是1 吧?
inline Vec3f Matrixd::preMult( const Vec3f& v ) const
{
    value_type d = 1.0f/(_mat[0][3]*v.x()+_mat[1][3]*v.y()+_mat[2][3]*v.z()+_mat[3][3]) ;
    return Vec3f( (_mat[0][0]*v.x() + _mat[1][0]*v.y() + _mat[2][0]*v.z() + _mat[3][0])*d,
        (_mat[0][1]*v.x() + _mat[1][1]*v.y() + _mat[2][1]*v.z() + _mat[3][1])*d,
        (_mat[0][2]*v.x() + _mat[1][2]*v.y() + _mat[2][2]*v.z() + _mat[3][2])*d);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表