查看: 1315|回复: 11

setTransformAsExtents 什么作用?

[复制链接]

该用户从未签到

发表于 2010-12-2 17:07:02 | 显示全部楼层 |阅读模式
请教高手,我定义了一个高度层,看例程需要设置 setTransformAsExtents 和 setOrigin 。
实际运行结果,我发现:
1 setOrigin(osg::Vec3(-2000, -2000, -800)) 后,对场景显示没有变化。
2 locator->setTransformAsExtents(0, 0, 10000, 5000) 改变了高度层显示的位置,但是改变的规律不太明白;
3 setXInterval( 100.0)对场景的改变规律也不是很清晰,我将100改成10,不明白场景的变化情况

相关的定义有:
locator->setCoordinateSystemType(osgTerrain:ocator::GEOGRAPHIC);

该用户从未签到

 楼主| 发表于 2010-12-3 10:26:35 | 显示全部楼层
有高手解决一下吗?
我感觉在应用setTransformAsExtents时,如果我场景中有其他参照物,我将看到地形场景将根据指定的数值相对移动位置。按理说,我觉得移动位置应该是setOrigin函数解决的问题,事实上,采用setOrigin却没有变化

该用户从未签到

 楼主| 发表于 2010-12-3 17:24:45 | 显示全部楼层
看 HeightField 源码,其中只有一个 getVertex 用到了setOrigin和setXInterval,但是这个函数在OSG中没有其他地方调用。
继续考察绘制,发现在DrawShapeVisitor::apply中有:gl.Translated(field.getOrigin().x(),field.getOrigin().y(),field.getOrigin().z());和
float dx = field.getXInterval();
float dy = field.getYInterval();
发现绘制时用到了上述设置。

该用户从未签到

 楼主| 发表于 2010-12-3 17:26:52 | 显示全部楼层
基本明白了, HeightField 本身的绘制应该是没有问题的,关键应该在locator->setTransformAsExtents上,下周继续分析。有高手,请指教一下。谢谢了先。

该用户从未签到

 楼主| 发表于 2010-12-3 17:46:20 | 显示全部楼层
源代码大致是:
osg::ref_ptr<osg::HeightField> hf = createHeightField( );//创建一个高度场
hf->setOrigin(osg::Vec3(-200, -200, -8));
hf->setXInterval( 100);
hf->setYInterval( 100);

osg::ref_ptr<osgTerrain::HeightFieldLayer> heightFieldLayer = new osgTerrain::HeightFieldLayer;
heightFieldLayer->setHeightField(hf.get());       

osg::ref_ptr<osgTerrain:ocator> locator = new osgTerrain::Locator;
locator->setCoordinateSystemType(osgTerrain::Locator::GEOGRAPHIC);
locator->setTransformAsExtents(-300, -300, 300, 300, -100, 200);

heightFieldLayer->setLocator(locator.get());
heightFieldLayer->setValidDataOperator(validDataOperator.get());
terrainTile->setElevationLayer(heightFieldLayer.get());

root->addChild(terrainTile.get());

该用户从未签到

发表于 2010-12-6 10:00:45 | 显示全部楼层
楼主的分析过程很不错,希望继续深入研究,这对于您和大家的学习很有好处

该用户从未签到

 楼主| 发表于 2010-12-6 13:53:41 | 显示全部楼层
采用 setTransformAsExtents(-300, -300, 300, 300),发现地形显示位置正常,拾取坐标也正常

换一种 setTransformAsExtents(-100,-100,100,100),问题出来了,地形显示正常,但是拾取的坐标错误了。
setOrigin和setXInterval还是没有用到,估计,只有HeightField添加到shapedrawable中才能有效,在terrain中是没有效果的

该用户从未签到

 楼主| 发表于 2010-12-6 14:19:52 | 显示全部楼层
在GeometryTechnique::generateGeometry中,发现设置了Transform到HeightField的中心,同时,定义了三角形网,因此setOrigin和setXInterval没有了效果,因为根本就没有用DrawShapeVisitor绘制,但是locator的用途呢?继续探究一下吧,请高手指教。

该用户从未签到

 楼主| 发表于 2010-12-6 14:31:53 | 显示全部楼层
在GeometryTechnique中,利用Locator->convertLocalToModel(centerNDC, centerModel);将高度场中心坐标进行了转换,其中,用到了setTransformAsExtents输入的值,看到这里,找到了根源,原始语句是:world = local * _transform。

可是,究竟是什么意思呢?请教高手。
array在论坛中曾经说过:XY范围来设置从局部坐标系到世界坐标系的变换矩阵。还是有点不明白。继续!

该用户从未签到

 楼主| 发表于 2010-12-6 14:35:32 | 显示全部楼层
范围的设置是:
_transform.set(maxX-minX, 0.0,       0.0, 0.0,
                   0.0,       maxY-minY, 0.0, 0.0,
                   0.0,       0.0,       1.0, 0.0,
                   minX,      minY,      0.0, 1.0);  
为何用两个坐标相减?

该用户从未签到

发表于 2010-12-6 16:15:16 | 显示全部楼层
我没有关注过GeometryTechnique的实现,因此在这里不能给您提供什么帮助。不过对于
world = local * _transform
这一句很明确是从将局部坐标系的一个顶点转换到世界坐标系,而_transform就是转换所用的矩阵。例如下面的节点结构:
root - mtL1 - mtL2

这里任何添加到mtL2下的空间变换节点,其坐标设置均应当使用mtL2的局部坐标系,因为这里的节点结构事实上相当于如下的OpenGL代码:
  1. glMatrixMode( GL_MODELVIEW );
  2. glPushMatrix( mtL1->getMatrix() );
  3.     glPushMatrix( mtL2->getMatrix() );
  4.         DrawYourNode();
  5.     glPopMatrix();
  6. glPopMatrix();
复制代码

该用户从未签到

 楼主| 发表于 2010-12-7 15:23:45 | 显示全部楼层
好的,明白了
_transform.set(maxX-minX, 0.0,       0.0, 0.0,
                   0.0,       maxY-minY, 0.0, 0.0,
                   0.0,       0.0,       1.0, 0.0,
                   minX,      minY,      0.0, 1.0);
X方向缩放到maxX-minX,y方向缩放到maxY-minY,再平移到minx,miny

但是,拾取如何不正常呢?还是迷茫
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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