继续调试,看看TransientUserDataStore何时存储的,在当前配置下存储了些什么
启动后果然触发了,倒回去看
可以看key = osgEarth.Horizon的cullVisitor。水平裁剪?
继续向前看
看看Horizon类的成员变量
可以看到Horizon类是个操作。涉及到了眼睛到中心点和水平的距离。似乎验证了这点。但是,还是有点不知所云。
把成员函数也拷贝过来。
从成员函数可以看到对水平面剔除的操作。
说人话就是:如果在平面上,水平望去,如果站在一个高楼上,影响视野的只是六棱锥。
但是,现在是在椭球体上,即使站在高楼上,六棱锥内的物体也看不完整。因为球体遮挡了。
这个类就是几个灵魂拷问。
在这个水平遮挡操作过程中,我在哪个椭球体上?椭球体半径多少?我允许站在多高的楼上看?对于某个指定的点或者球体,我能不能看得到?如果看得到,我离这个点或者球体的水平距离多少?
另外,这个水平遮挡操作与Nodevisitor关联,也与水平面相关。
继续向上层看
可以看到,这应该是进行水平面剔除操作的平面了。它与Cullvisitor相关,从Cullvisitor中获得摄像机所能看到的数据。再进行水平剔除操作,操作时是通过将“oe_ClipPlane_plane”传递到GPU中实现,当然,既然是摄像机,那也会随之更新。
看看相关类
我感觉这个类还是挺人性化的,给出了用法
椭球体默认为wgs84,当然其他也可以。
从这里看到,node就是mapNode
继续向上
这里涉及到了osgEarth的摄像机,传递"oe_Camera"到GPU
看看这个类,属于回调
继续向上,
正好熟悉了下流程
跳回来
总结下,这里说的是
TerrainCuller->visitorData->TransientUserDataStore->存储了水平剔除osgEarth.Horizon
那么紧接着问题来了,到底TransientUserDataStore总共存储了几种类型?存储了多少个?
由于是每帧调用,所以,先显示出来地球,再设置断点
可以看到有存储了两个裁剪。都是osgEarth.Horizon
再看看它们的差别在哪里,
第一个
第二个
这两个相同,说明只有一个水平裁剪面,只是first和second的其他不同
总结下:
在目前环境里,
visitorData->TransientUserDataStore里面只存储了一个水平面裁剪方式,所以上一节TerrainCuller的osgEarth.Spy查找不到是正常的。
就这样吧。