关闭

osg中的矩阵计算

标签: 矩阵计算
774人阅读 评论(0) 收藏 举报
分类:

OSG是行矩阵,平移向量在第4行!

4*4矩阵在前,平移向量在后(后乘)

这里的Vec3d需要变为4*4矩阵,平移向量在第4行,其他地方为1和0
inline void Matrixd::postMultTranslate(const Vec3d& v)
{
   for(unsigned i=0;i<3;i++)
   {
    double temp = v[i];
    if(tmp == 0)
    continue;
    _mat[0][i] += tmp*_mat[0][3];
    _mat[1][i] += tmp*_mat[1][3];
    _mat[2][i] += tmp*_mat[2][3];
    _mat[3][i] += tmp*_mat[3][3];
   } 
}

前乘:
inline void Matrixd::pretMultTranslate(const Vec3d& v)
{
   for(unsigned i=0;i<3;i++)
   {
    double temp = v[i];
    if(tmp == 0)
    continue;
    _mat[3][0] += tmp*_mat[i][0];
    _mat[3][1] += tmp*_mat[i][1];
    _mat[3][2] += tmp*_mat[i][2];
    _mat[3][3] += tmp*_mat[i][3];
   } 
}
计算坐标应该是右乘,矩阵在右,坐标在左。注:平移向量位于第四行,则矩阵需要右乘;平移向量位于第四列,则矩阵需要左乘

点绕着基点(2,0,0),法矢(0,1,0)旋转,则变换矩阵应该是M = T(-2,0,0)* R(angle)*T(2,0,0),然后p = p*M

求(ux,uy,uz),(Vx,Vy,Vz),(Nx,Ny,Nz)坐标系在世界坐标系下的位置的矩阵,Tr = {Ux, Uy, Uz ,0

                                                                                                                                                       Vx, Vy, Vz, 0

                                                                                                                                                       Nx, Ny, Nz, 0

                                                                                                                                                        0,   0,    0,  1}

osg中矩阵变换一般是先旋转后平移

osg::Matrix mt1;
mt1.makeTranslate(position);
osg::Matrix mt2;
mt2.makeRotate(osg::Vec3(0.0,0.0,1.0),normal);
osg::Matrix mt3;
mt3 = mt2 * mt1;    //一般是先旋转后平移变换


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:197049次
    • 积分:3061
    • 等级:
    • 排名:第11364名
    • 原创:72篇
    • 转载:284篇
    • 译文:0篇
    • 评论:7条
    最新评论