好久沒有更新了,干脆贴几篇开发笔记吧
日期:
完成任务:
1. 特征系统数值算法(MathNew/Numerica/EigenSystem)
2. 高斯点集分布算法(FitMethod/GaussPointFit)
注:只完成的高斯点集分布的3维情况,2维情况还未完成
3. AABB包围体和OBB包围体创建算法(BoundingMethod/CreateBox3.cpp)
注:只完成的3维情况,2维情况未完成
4. BoudingVolumn的封装策略: 每个Geometric拥有>=3个BoundingVolumn(目前只考虑有3个的情况).BoundingVolumn是一个包围体的封装类,具体的几何特性由成员指针指向一个基本几何体(Sphere,AABB,OBB). 主要作用是封装在遍历时需执行的各种操作—
判断BV与视锥体平面的关系;由子节点的BV合并得到父节点BV的合并操作.
(framework/BoundVolumn).
5. AABB和OBB的合并操作.(framework/BoundVolumn/AabbBV;OBBBV)
日期:
完成任务:
1. 场景遍历策略设计:
Update过程: 首先对节点进行Cull,该过程只判断物体是否可见。不作其它行为。
然后根据上述结果和节点的值(isActiveAlways)来确定是否对这个节点进行标准Update过程。如果该节点可见,则必须Update,如果该节点不可见,而该值为真,则仍然Update。只是不进入渲染通道(参见RenderDevice过程)。否则不对该节点Update。即这种情况下默认该节点和该节点的所有子节点都不变。
对需要Update的节点进行1:UpdateGeometricState操作,该操作定义在Spatial类中(待修改)。主要作用是更新节点的WorldTransformation和WorldBound。因为Bound的更新是从下到上,Transformation的更新是从上到下的。所以该操作分为两步。
当前的设计策略是:
在UpdateVisitor的apply(Node&)中,先对Node执行Transformation的Update,然后将该节点的渲染状态压栈。利用Traverse遍历该节点的子节点,然后再Update WorldBound,然后将渲染状态出栈。利用递归函数的特点,在递归完成后的回调过程中Update Bound。这样就在一次遍历中完成的两个操作。
对apply(Geometric&),则同样执行Update Transformation,
然后将渲染状态进行整合,替换节点本身的RenderState,然后将LocalBound更新为WorldBound。
完成任务:
1. 完成在UpdateVisitor中对LocalBound和WorldBound 的初试化过程。当Root节点第一次进入Update过程时,得到所有节点的LocalBound和WorldBound。
2. 修改场景遍历策略设计:
存在问题:a.Cull过程应该在得到节点的WorldBound之后。
b.动态更新Bound树。并使得只有需要的节点被更新
当前策略: 如图
先考虑G情况。G的LocalTransformation改变。因此G的WorldBound改变,导致G的G.*Parent改变(*为反身代词闭包)。
考虑N情况。N的LocalTransformation改变,导致N.*Child的WorldTrnas
formation改变,同时也导致N.*Child的WorldBound改变。并且N.*Parent的WorldBound也改变。
基于以上分析,设计出动态更新策略:
对于Geometirc节点,有布尔值m_bLocalBoundDirty。该值标明该G节点的LocalBound是否需要重新创建。当物体被创建,被赋予顶点,顶点索引,顶点数量等信息时,该值都将被置为true。而UpdateLocalBound执行后,该值被置为false。
对于Spatial节点,有布尔值m_bTransformationDirty。该值标明S(N || G)的LocalTransformation或WorldTransformation(通过Modificator)已改变。对该值的处理被分派到G,N派生类型中。
对于G节点,当该值为true时,首先更新本身的WorldBound(此时,如果m_bLocalBoundDirty为false,不需要更新LocalBound) 和 WorldTransformation。然后标示其父节点的m_bWorldBoundDirty为true。父节点在更新完其所有子节点后判断m_bWorldBoundDirty是否为真,如果是,就更新其WorldBound,并将其父节点m_bWorldBound也置为true。
对于N节点,当该值为true时,首先更新自身的WorldTrans
Formation,然后更新所有子节点的WorldBound和WorldTransformation(这里不需再对子节点的布尔值进行判断了,除了G点的m_bLocalBoundDirty)。当递归返回后,更新自身的WorldBound,然后将N.^parent的m_bWorldBoundDirty置true。
3. 完成以上策略,但未进行测试。