查看: 1487|回复: 18

平移矩阵前乘或后乘vec3d返回一个vec3d有什么用?

[复制链接]

该用户从未签到

发表于 2014-9-25 15:24:14 | 显示全部楼层 |阅读模式
#include <osg/Geometry>
#include <osg/MatrixTransform>
#include <iostream>

#pragma comment( lib, "osgd.lib")   
#pragma comment( lib, "osgViewerd.lib")   
#pragma comment( lib, "osgDBd.lib")   
#pragma comment( lib, "OpenThreadsd.lib")   
#pragma comment( lib, "osgUtild.lib")  
#pragma comment( lib, "osgGAd.lib")
#pragma comment( lib, "osgTextd.lib")
#pragma comment( lib, "osgSimd.lib")


osg::Vec3d postMult(double _mat[][4],osg::Vec3d v)
{
        osg::Vec3d::value_type d = 1.0f/(_mat[3][0]*v.x()+_mat[3][1]*v.y()+_mat[3][2]*v.z()+_mat[3][3]);
        return osg::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);
}

osg::Vec3d preMult(double _mat[][4],osg::Vec3d v)
{
        osg::Vec3d::value_type d = 1.0f/(_mat[0][3]*v.x()+_mat[1][3]*v.y()+_mat[2][3]*v.z()+_mat[3][3]) ;
        return osg::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);
}

int _tmain(int argc, _TCHAR* argv[])
{
        osg::Vec3d b;
        b.set(1,2,3);
        double _mat[4][4] = {
                1,0,0,0,
                0,1,0,0,
                0,0,1,0,
                4,0,1,1
        };
        osg::Vec3d f = preMult(_mat,b);//f=5,2,4
                osg::Vec3d f2 = postMult(_mat,b);//f=0.125,0.25,0.375
        getchar();
        return 0;
}


该用户从未签到

发表于 2014-9-26 10:21:27 | 显示全部楼层
好像只能矩阵前乘一个vec3d,这是一个向量,你用矩阵乘了以后相当于对这个向量做了矩阵变换,比如让这个向量旋转,或者平移了之后的向量

该用户从未签到

发表于 2014-9-26 10:59:39 | 显示全部楼层
osg::Vec3d preMult(double _mat[][4],osg::Vec3d v) 是普通变换,v*m
postMult(double _mat[][4],osg::Vec3d v) 是逆变换,相当于v*m(-1)
osg中只存在左乘(前乘)

该用户从未签到

 楼主| 发表于 2014-9-26 15:37:09 | 显示全部楼层
心灬魔 发表于 2014-9-26 10:21
好像只能矩阵前乘一个vec3d,这是一个向量,你用矩阵乘了以后相当于对这个向量做了矩阵变换,比如让这个向 ...

矩阵pre前乘的结果好像是一个向量,你用矩阵乘了以后相当于对这个向量做了矩阵变换;
那post后乘呢?

该用户从未签到

 楼主| 发表于 2014-10-9 14:44:19 | 显示全部楼层
buaahc 发表于 2014-9-26 10:59
osg::Vec3d preMult(double _mat[][4],osg::Vec3d v) 是普通变换,v*m
postMult(double _mat[][4],osg::Ve ...

postMult(double _mat[][4],osg::Vec3d v) 是逆变换,相当于v*m(-1)
osg中只存在左乘(前乘)

这个postMult(double _mat[][4],osg::Vec3d v) 是逆变换在什么情况下使用呢?

该用户从未签到

发表于 2014-10-9 16:04:31 | 显示全部楼层
本帖最后由 buaahc 于 2014-10-9 16:09 编辑
五十载 发表于 2014-10-9 14:44
postMult(double _mat[][4],osg::Vec3d v) 是逆变换,相当于v*m(-1)
osg中只存在左乘(前乘)


postMuit(M,v)是对v施加矩阵M的逆变换,具体什么时机使用,这看你需要了。举个最简单的例子,比如眼睛空间中的坐标V(eye),你要计算其在世界空间的坐标v(w),那就需要对v(eye)施加视图矩阵的逆变换

该用户从未签到

 楼主| 发表于 2014-10-10 11:15:23 | 显示全部楼层
buaahc 发表于 2014-10-9 16:04
postMuit(M,v)是对v施加矩阵M的逆变换,具体什么时机使用,这看你需要了。举个最简单的例子,比如眼 ...

osg::Matrix _inverseMV;

_inverseMV.invert( cameraMaster->getViewMatrix());


osg::Vec3 ptEye= osg::Vec3 a(  0, 0, 0) * _inverseMV;

postMult(_inverseMV,a);一个意思呗

该用户从未签到

发表于 2014-10-10 14:54:23 | 显示全部楼层
应该osg::Vec3 ptEye= osg::Vec3 a(  0, 0, 0) * _inverseMV与postMult(cameraMaster->getViewMatrix(),a)一个意思,我觉得与其这么打破砂锅问到底,不如自己调试,调试是最好的解决方法

该用户从未签到

 楼主| 发表于 2014-10-13 14:39:36 | 显示全部楼层
buaahc 发表于 2014-10-10 14:54
应该osg::Vec3 ptEye= osg::Vec3 a(  0, 0, 0) * _inverseMV与postMult(cameraMaster->getViewMatrix(),a) ...

不对吧,逆矩阵代码这么麻烦呢 。。。  postMult 怎么回事M-1逆矩阵呢。。。。

bool TAlpha::Inverse3(const float Matrix[3][3], float Inverse[3][3])
{
const double a1 = Matrix[0][0], a2 = Matrix[1][0], a3 = Matrix[2][0];
const double b1 = Matrix[0][1], b2 = Matrix[1][1], b3 = Matrix[2][1];
const double c1 = Matrix[0][2], c2 = Matrix[1][2], c3 = Matrix[2][2];

double m = a1 * (b2 * c3 - c2 * b3) - a2 * (b1 * c3 - c1 * b3) + a3 * (b1 * c2 - c1 * b2);

if (m == 0.0)
  return false;

Inverse[0][0] = (float)((b2 * c3 - c2 * b3) * (m = 1 / m));
Inverse[0][1] = (float)((c1 * b3 - b1 * c3) * m);
Inverse[0][2] = (float)((b1 * c2 - c1 * b2) * m);

Inverse[1][0] = (float)((c2 * a3 - a2 * c3) * m);
Inverse[1][1] = (float)((a1 * c3 - c1 * a3) * m);
Inverse[1][2] = (float)((a2 * c1 - a1 * c2) * m);

Inverse[2][0] = (float)((a2 * b3 - b2 * a3) * m);
Inverse[2][1] = (float)((b1 * a3 - a1 * b3) * m);
Inverse[2][2] = (float)((a1 * b2 - a2 * b1) * m);

return true;
}

该用户从未签到

发表于 2014-10-13 14:54:03 | 显示全部楼层
是我的表述有问题 是转置矩阵,即Matrixd::postMult( const Vec3f& v )是v*M(T)~

该用户从未签到

 楼主| 发表于 2014-10-13 16:07:17 | 显示全部楼层
buaahc 发表于 2014-10-13 14:54
是我的表述有问题 是转置矩阵,即Matrixd::postMult( const Vec3f& v )是v*M(T)~

MatrixTransform对象preMatrix在什么情况下使用,老师能否举个例子说明下呀。

该用户从未签到

发表于 2014-10-13 16:47:30 | 显示全部楼层
本帖最后由 buaahc 于 2014-10-13 16:49 编辑

preMUlt这个使用太多了,只是一般使用两个矩阵相乘即可如
MatrixTransform1->setMatrix(M1),
MatrixTransform2->setMatrix(M2),
MatrixTransform3=MatrixTransform1*MatrixTransform2;
M4=M2.preMatrix(M1);
MatrixTransform4->setMatrix(M4),
MatrixTransform3与MatrixTransform4等价
即m1*m2=m2.premult(m1);
而m1*m2=m1.postmult(m2);

该用户从未签到

 楼主| 发表于 2014-10-14 22:55:12 | 显示全部楼层
buaahc 发表于 2014-10-13 16:47
preMUlt这个使用太多了,只是一般使用两个矩阵相乘即可如
MatrixTransform1->setMatrix(M1),
MatrixTransf ...

老师我这个shader把水牛半透怎么没用呢。。。

  1. #include "stdafx.h"
  2. #include <osg/Material>
  3. #include <osgViewer/Viewer>
  4. #include <osgDB/ReadFile>
  5. #include <osg/geode>
  6. #include <osg/LineWidth>
  7. #include <osg/MatrixTransform>
  8. #pragma comment(lib,"OpenThreadsd.lib")
  9. #pragma comment(lib,"osgd.lib")
  10. #pragma comment(lib,"osgDBd.lib")
  11. #pragma comment(lib,"osgAPExd.lib")
  12. #pragma comment(lib,"osgGAd.lib")
  13. #pragma comment(lib,"osgUtild.lib")
  14. #pragma comment(lib,"osgTextd.lib")
  15. #pragma comment(lib,"osgSimd.lib")
  16. #pragma comment(lib,"osgViewerd.lib")

  17. const char* svShader = {

  18.         "varying vec2 coord;                "
  19.         "void main()                                                "
  20.         "{                                                                        "
  21.         "        coord = gl_MultiTexCoord0.xy;        "
  22.         "        gl_Position = ftransform();        "
  23.         "}                                                                        "
  24. };

  25. const char* sfShader = {

  26.         "varying vec2 coord;                                              "
  27.         "uniform vec4 cor;                                                                                         "
  28.         "uniform sampler2D unit;                                                                                "
  29.         "void main()                                                                                                         "
  30.         "{                                                                                                                                 "
  31.         "        vec4 baseColor = texture2D(unit,coord);                                                 "
  32.         "        gl_FragColor   = cor;                                 "
  33.         "}"
  34. };



  35. int _tmain(int argc, _TCHAR* argv[])
  36. {
  37.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  38.     osg::ref_ptr<osg::Group> g_Root = new osg::Group;
  39.     osg::ref_ptr<osg::Node> pNode = osgDB::readNodeFile("c:\\osg\\data\\cow.osg");
  40.     osg::StateSet* stateSet = pNode->getOrCreateStateSet();
  41.         osg::Shader* vShader = new osg::Shader(osg::Shader::VERTEX,svShader);
  42.         osg::Shader* fShader = new osg::Shader(osg::Shader::FRAGMENT,sfShader);
  43.         osg::ref_ptr<osg::Program> program = new osg::Program;
  44.         program->addShader(vShader);
  45.         program->addShader(fShader);
  46.         osg::Vec4 color;
  47.         color.set(1,0,1,0.0);
  48.         osg::Uniform* uniformcolor = new osg::Uniform("cor",color);
  49.         osg::Uniform* uniformunit = new osg::Uniform("unit",0);
  50.         stateSet->addUniform(uniformcolor,osg::StateAttribute::ON);
  51.         stateSet->addUniform(uniformunit,osg::StateAttribute::ON);
  52.         stateSet->setAttributeAndModes(program,osg::StateAttribute::ON);
  53.        
  54.         g_Root->addChild(pNode);
  55.     viewer->setSceneData(g_Root);
  56.     viewer->run();
  57.         return 0;
  58. }

复制代码

该用户从未签到

发表于 2014-10-16 16:34:10 | 显示全部楼层
你没开启混合blend,还有 你确定你写的这样是对的:vec4 baseColor = texture2D(unit,coord);gl_FragColor   = cor; ?
而不应该是vec4 baseColor = texture2D(unit,coord);gl_FragColor   = baseColor ; ?

该用户从未签到

 楼主| 发表于 2014-10-21 10:58:20 | 显示全部楼层
buaahc 发表于 2014-10-16 16:34
你没开启混合blend,还有 你确定你写的这样是对的:vec4 baseColor = texture2D(unit,coord);gl_FragColor  ...

老师怎么颜色是黑色的? gl_FragColor   = baseColor; 改成原先gl_FragColor   = cor; 模型不见了。。。


  1. #include <osg/Material>
  2. #include <osgViewer/Viewer>
  3. #include <osgDB/ReadFile>
  4. #include <osg/geode>
  5. #include <osg/LineWidth>
  6. #include <osg/MatrixTransform>
  7. #pragma comment(lib,"OpenThreadsd.lib")
  8. #pragma comment(lib,"osgd.lib")
  9. #pragma comment(lib,"osgDBd.lib")
  10. #pragma comment(lib,"osgAPExd.lib")
  11. #pragma comment(lib,"osgGAd.lib")
  12. #pragma comment(lib,"osgUtild.lib")
  13. #pragma comment(lib,"osgTextd.lib")
  14. #pragma comment(lib,"osgSimd.lib")
  15. #pragma comment(lib,"osgViewerd.lib")

  16. const char* svShader = {

  17.         "varying vec2 coord;                "
  18.         "void main()                                                "
  19.         "{                                                                        "
  20.         "        coord = gl_MultiTexCoord0.xy;        "
  21.         "        gl_Position = ftransform();        "
  22.         "}                                                                        "
  23. };

  24. const char* sfShader = {

  25.         "varying vec2 coord;                                              "
  26.         "uniform vec4 cor;                                                                                         "
  27.         "uniform sampler2D unit;                                                                                "
  28.         "void main()                                                                                                         "
  29.         "{                                                                                                                                 "
  30.         "        vec4 baseColor = texture2D(unit,coord);                                                "
  31.         "        gl_FragColor   = baseColor;                                 "
  32.         "}"
  33. };

  34. ;

  35. int _tmain(int argc, _TCHAR* argv[])
  36. {
  37.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  38.         osg::ref_ptr<osg::Group> g_Root = new osg::Group;
  39.         osg::ref_ptr<osg::Node> pNode = osgDB::readNodeFile("c:\\osg\\data\\cow.osg");
  40.         osg::StateSet* stateSet = pNode->getOrCreateStateSet();
  41.         osg::Shader* vShader = new osg::Shader(osg::Shader::VERTEX,svShader);
  42.         osg::Shader* fShader = new osg::Shader(osg::Shader::FRAGMENT,sfShader);
  43.         osg::ref_ptr<osg::Program> program = new osg::Program;
  44.         program->addShader(vShader);
  45.         program->addShader(fShader);
  46.         osg::Vec4 color;
  47.         color.set(1,0,1,0.0);
  48.         osg::Uniform* uniformcolor = new osg::Uniform("cor",color);
  49.         osg::Uniform* uniformunit = new osg::Uniform("unit",0);
  50.         stateSet->addUniform(uniformcolor,osg::StateAttribute::ON);
  51.         stateSet->addUniform(uniformunit,osg::StateAttribute::ON);
  52.         stateSet->setAttributeAndModes(program,osg::StateAttribute::ON);
  53.         stateSet->setMode(GL_BLEND,osg::StateAttribute::ON);
  54.         g_Root->addChild(pNode);
  55.         viewer->setSceneData(g_Root);
  56.         viewer->run();
  57.         return 0;
  58. }

复制代码

该用户从未签到

发表于 2014-10-21 13:44:32 | 显示全部楼层
你设置的color(1,0,1,0.0),透明位是0.0,就是全透明,所以模型才不见

该用户从未签到

 楼主| 发表于 2014-10-26 12:53:56 | 显示全部楼层
buaahc 发表于 2014-10-21 13:44
你设置的color(1,0,1,0.0),透明位是0.0,就是全透明,所以模型才不见

gl_FragColor   = baseColor; //效果不太对呀。。全是黑色
gl_FragColor   = cor;//感觉这个颜色与透明度效果都对呀。。
这俩句有啥区别呢?

该用户从未签到

发表于 2014-10-27 17:06:07 | 显示全部楼层
vec4 baseColor = texture2D(unit,coord);
unit是一个纹理,你貌似没有在主程序里面添加相应的纹理,这样unit是一个空纹理,全黑色是对的,
cor是一个uniform,也就是
osg::Vec4 color;
color.set(1,0,1,0.0);
osg::Uniform* uniformcolor = new osg::Uniform("cor",color);

该用户从未签到

 楼主| 发表于 2014-11-2 14:53:50 | 显示全部楼层
本帖最后由 五十载 于 2014-11-3 11:51 编辑

移除shader,然后恢复shader。怎么报error了。。。

  1. #include "stdafx.h"
  2. #include <osg/Material>
  3. #include <osgViewer/Viewer>
  4. #include <osgDB/ReadFile>
  5. #include <osg/geode>
  6. #include <osg/LineWidth>
  7. #include <osg/MatrixTransform>
  8. #pragma comment(lib,"OpenThreadsd.lib")
  9. #pragma comment(lib,"osgd.lib")
  10. #pragma comment(lib,"osgDBd.lib")
  11. #pragma comment(lib,"osgAPExd.lib")
  12. #pragma comment(lib,"osgGAd.lib")
  13. #pragma comment(lib,"osgUtild.lib")
  14. #pragma comment(lib,"osgTextd.lib")
  15. #pragma comment(lib,"osgSimd.lib")
  16. #pragma comment(lib,"osgViewerd.lib")
  17. //
  18. const char* svShader = {

  19.         "varying vec2 coord;                "
  20.         "void main()                                                "
  21.         "{                                                                        "
  22.         "        coord = gl_MultiTexCoord0.xy;        "
  23.         "        gl_Position = ftransform();        "
  24.         "}                                                                        "
  25. };

  26. const char sfShader[] = {
  27.         "varying vec2 coord;                    \n"
  28.         "uniform vec4 color;                      \n  "
  29.         "uniform sampler2D sampler0;                \n     "
  30.         "void main()                                  \n "
  31.         "{                                      \n"
  32.         "        vec4 baseColor = texture2D(sampler0,coord);      \n"
  33.             "  gl_FragColor = (baseColor + color); \n"
  34.         "}\n"
  35. };
  36. int _tmain(int argc, _TCHAR* argv[])
  37. {
  38.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  39.         osg::ref_ptr<osg::Group> g_Root = new osg::Group;
  40.         osg::ref_ptr<osg::Node> pNode = osgDB::readNodeFile("cow.osg");

  41.         osg::StateSet* stateSet = pNode->getOrCreateStateSet();
  42.         osg::Shader* vShader = new osg::Shader(osg::Shader::VERTEX,svShader);
  43.         osg::Shader* fShader = new osg::Shader(osg::Shader::FRAGMENT,sfShader);
  44.         osg::ref_ptr<osg::Program> program = new osg::Program;
  45.         program->addShader(vShader);
  46.         program->addShader(fShader);
  47.         osg::Vec4 color;
  48.         color.set(1,0,1,0.0);
  49.         osg::Uniform* uniformcolor = new osg::Uniform("color",color);
  50.         osg::Uniform* uniformunit = new osg::Uniform("sampler0",0);
  51.         stateSet->addUniform(uniformcolor,osg::StateAttribute::ON);
  52.         stateSet->addUniform(uniformunit,osg::StateAttribute::ON);
  53.         stateSet->setAttribute(program,osg::StateAttribute::OFF);
  54.         stateSet->setMode(GL_BLEND,osg::StateAttribute::ON);

  55.         stateSet->removeUniform(uniformcolor);
  56.         stateSet->removeUniform(uniformunit);
  57.         stateSet->removeAttribute(program);
  58.        
  59.         stateSet->addUniform(uniformcolor,osg::StateAttribute::ON);
  60.         stateSet->addUniform(uniformunit,osg::StateAttribute::ON);
  61.         stateSet->setAttribute(program);
  62.         g_Root->addChild(pNode);
  63.         viewer->setSceneData(g_Root);
  64.         viewer->run();
  65.         return 0;
  66. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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