|
已知:一个局部坐标系到世界坐标系的变换矩阵M,局部坐标系的一个顶点P,局部坐标系的一个方向向量V
则:1 P点在世界坐标系下的坐标P1 = M.preMult(P); // 测试发现结果正确,没有问题
2 V向量在世界坐标系中的表示,根据OpenGL红宝书上的说法,我理解就是使用M的逆转置矩阵对V做变换,即V1 = osg::Matrixd::inverse(M).posMult(V); 不知道这样理解对不对,不过结果看起来是错误的,得到的向量与正确结果反向,并且模长也不对。
测试代码如下:
osg::Matrixd mat = osg::Matrixd::translate(2, 2, 2);
osg::MatrixTransform* transform = new osg::MatrixTransform;
transform->setMatrix(mat);
transform->addChild(osgDB::readNodeFile("axes.osg"));
root->addChild(transform);
osg::Vec3 pos(0, 0, 0), vec(1, 1, 1);
osg::Vec3 pos0 = mat.preMult(pos);
osg::Matrixd matInv = osg::Matrixd::inverse(mat);
osg::Vec3 vec1 = matInv.postMult(vec);
osg::Vec3 temp = mat.preMult(pos+vec);
osg::Vec3 vec2 = temp-pos0;
root->addChild(createLine(pos0, pos0+vec1, osg::Vec4(1, 0, 0, 1))); // 红色线是用上面提到的对向量多矩阵变换的方法得到的
root->addChild(createLine(pos0, pos0+vec2, osg::Vec4(0, 0, 1, 1))); // 蓝色的线是用两点分别做矩阵变换后求差得到的(这个肯定是正确的)
请问上面2使用的对向量做矩阵变换的方法哪里有问题,正确的对向量做矩阵变换的方法是怎样的?谢谢 |
|