我要发帖 回复

新手上路

4

主题

9

积分

0

专家分

:

私信
发表时间 : 2007-10-14 17:36:49 | 浏览 : 2999    评论 : 10
今天碰到一个很奇怪的问题,请大家帮忙。以下代码看不到我创建的三角形。
#include <osgDB/ReadFile>
#include <osg/Geometry>
#include <osgViewer/Viewer>
osg::ref_ptr<osg::Node> createSceneGraph()
{
    // Create an object to store geometry in.
    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
    // Create an array of three vertices.   
    osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
    geom->setVertexArray( v.get() );
    v->push_back( osg::Vec3( -1.f, 0.f, -1.f ) );
    v->push_back( osg::Vec3( 1.f, 0.f, -1.f ) );
    v->push_back( osg::Vec3( 1.f, 0.f, 1.f ) );   
    // Create an array of three colors.
    osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
    geom->setColorArray( c.get() );
    geom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
    c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
    c->push_back( osg::Vec4( 0.f, 1.f, 0.f, 1.f ) );
    c->push_back( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );   
    // Create an array for the single normal.
    osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
    geom->setNormalArray( n.get() );
    geom->setNormalBinding( osg::Geometry::BIND_OVERALL );
    n->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );
    // Draw a four-vertex quad from the stored data.
    geom->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::TRIANGLES, 0, 3 ) );
    // Add the Geometry (Drawable) to a Geode and return the Geode.
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    geode->addDrawable( geom.get() );
    return geode.get();
}
int main()
{
   osgViewer::Viewer viewer;
   osg::ref_ptr<osg::Group> root = new osg::Group;
   root->addChild(createSceneGraph().get());
   viewer.setSceneData( root.get() );
   osg::Matrixd trans;
   trans.makeTranslate(0.0, -5.0, 0.0);

   osg::Matrixd cam;
   cam.makeRotate(-osg::PI_2, osg::Vec3(1.0, 0.0, 0.0));

   while(!viewer.done())
  {
      osg::Matrixd::inverse(cam);
      viewer.getCamera()->setViewMatrix( cam * rot );
      viewer.frame();
  }
}

说明:
   三角形采用osg的坐标方式,即"Z"向上,相机定位于(0.0, -5.0, 0.0);
  据说viewer.getCamera()->setViewMatrix(...)函数需要opengl坐标方式,即"Y"向上,增加一个选择变换。
但是看不到想要的三角形,请问为啥啊?

最近VR访客

zyjiang 评论于2007-10-14 17:51:23
上述代码的main函数有误,应为以下,但同样看不到结果。
int main()
{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group;
        root->addChild(createSceneGraph().get());
        viewer.setSceneData( root.get() );

        osg::Matrixd cam;
        cam.makeTranslate(0.0, -5.0, 0.0);

        osg::Matrixd rot;
        rot.makeRotate(-osg::PI_2, osg::Vec3(1.0, 0.0, 0.0));

        while(!viewer.done())
        {
                osg::Matrixd::inverse(cam);
                viewer.getCamera()->setViewMatrix( cam * rot );
                viewer.frame();
        }
FlySky 评论于2007-10-14 20:10:56
你的三角形创建是没有错误的~

不过,你在设置CAMERA的投影矩阵及视口矩阵时,有点问题,,先计算一下位置~~~

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
zyjiang 评论于2007-10-15 15:15:27
能说说具体的吗?
FlySky 评论于2007-10-15 15:36:16
写代码之前,先计算一下具体的位置~~~不然,自己都不知道视口在什么地方了~~

OSGQSG的中文版也有一个相关的例子,看一下吧:

osgViewer::Viewer viewer;
viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
viewer.getCamera()->setProjectionMatrixAsPerspective( 40., 1., 1., 100. );
// 创建矩阵,指定到视点的距离。
osg::Matrix trans;
trans.makeTranslate( 0., 0., -12. );
// 旋转一定角度(弧度值)。
double angle( 0. );
while (!viewer.done())
{
// 创建旋转矩阵。
osg::Matrix rot;
rot.makeRotate( angle, osg::Vec3( 1., 0., 0. ) );
angle += 0.01;
// 设置视口矩阵(旋转矩阵和平移矩阵连乘)。
viewer.getCamera()->setViewMatrix( rot * trans );
// 绘制下一帧
viewer.frame();
}

更多详细的内容见:OSGQSG书本的第三章,,,,

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
zyjiang 评论于2007-10-15 15:56:44
我就是按照上述例子来做的。我的三角形位于xz平面上,视点位于y轴负方向-5处,视口的设置采用缺省的(平行透视),
应该是可以看到的,可就是没有显示正确的结果。
zyjiang 评论于2007-10-15 16:12:21
刚刚对main函数中的视点采用LookAt的方式进行设置的话,结果是正确的。
int main()
{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group;
        root->addChild(createSceneGraph().get());
        viewer.setSceneData( root.get() );
       
        osg::Matrixd cam;
        cam.makeLookAt(osg::Vec3(0.0, -5.0, 0.0),
                osg::Vec3(0.0, 0.0, 0.0), osg::Vec3(0.0, 0.0, 1.0));
       
        while(!viewer.done())
        {
                osg::Matrixd::inverse(cam);
                viewer.getCamera()->setViewMatrix( cam );
                viewer.frame();
        }
}
FlySky 评论于2007-10-15 16:49:07
// 创建矩阵,指定到视点的距离。
osg::Matrix trans;
trans.makeTranslate( 0., 0., -12. );

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
zyjiang 评论于2007-10-15 21:35:06
终于找到原因了。哈哈!
请大家慎重使用osg::Matrixd::inverse(cam);  // 通过调试该语句不会求逆,cam矩阵没有改变

int main()
{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group;
        root->addChild(createSceneGraph().get());
        viewer.setSceneData( root.get() );

        osg::Matrixd cam;
        cam.makeTranslate(0.0, -5.0, 0.0);

        osg::Matrixd rot;
        rot.makeRotate(-osg::PI_2, osg::Vec3(1.0, 0.0, 0.0));

        while(!viewer.done())
        {
                osg::Matrixd::inverse(cam);  // 通过调试该语句不会求逆,cam矩阵没有改变
                viewer.getCamera()->setViewMatrix( cam * rot );
                viewer.frame();
        }
}

改为下面的样子就ok了。
int main()
{
        osgViewer::Viewer viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group;
        root->addChild(createSceneGraph().get());
        viewer.setSceneData( root.get() );

        osg::Matrixd cam;
        cam.makeTranslate(0.0, 5.0, 0.0);

        osg::Matrixd rot;
        rot.makeRotate(-osg::PI_2, osg::Vec3(1.0, 0.0, 0.0));

        while(!viewer.done())
        {
                viewer.getCamera()->setViewMatrix( cam * rot );
                viewer.frame();
        }
}
结果为:
trangle.JPG
FlySky 评论于2007-10-15 21:52:40
其实就不是什么求逆不求逆的问题,况且视口的逆矩阵也不是那么求的~

// 创建矩阵,指定到视点的距离。
osg::Matrix trans;
trans.makeTranslate( 0., 0., -12. );

这个距离指的是到视点的距离,,关键是你把东西把视点给放物体的后面,怎么能看见~~~

因此,对相机操作的时候得先计算一下位置~~~~

OSG中国官方网站:http://www.osgChina.org
OSG中国官方讨论区:http://bbs.osgChina.org

OSG专业群-OSG地形研究者 49668412
      OSG地形专业研究 45763709
zyjiang 评论于2007-10-16 09:59:42
你误会我的意思了。本来是想让cam矩阵表示视点的位置和姿态,相当于视图变换,而非模型变换,
最后需要对视图变换做逆变换,这样设置比较通用和直观。

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-10-26 12:05 AM

返回顶部