好久沒有更新了,干脆贴几篇开发笔记吧

 

日期:6/28/2005

完成任务:

1.    特征系统数值算法(MathNew/Numerica/EigenSystem)

2.    高斯点集分布算法(FitMethod/GaussPointFit)

        :只完成的高斯点集分布的3维情况,2维情况还未完成

3.    AABB包围体和OBB包围体创建算法(BoundingMethod/CreateBox3.cpp)

:只完成的3维情况,2维情况未完成

4.    BoudingVolumn的封装策略: 每个Geometric拥有>=3BoundingVolumn(目前只考虑有3个的情况).BoundingVolumn是一个包围体的封装类,具体的几何特性由成员指针指向一个基本几何体(Sphere,AABB,OBB). 主要作用是封装在遍历时需执行的各种操作

判断BV与视锥体平面的关系;由子节点的BV合并得到父节点BV的合并操作.

(framework/BoundVolumn).

5.    AABBOBB的合并操作.(framework/BoundVolumn/AabbBV;OBBBV)

日期:6/29/2005

完成任务:

1.    场景遍历策略设计:

  Update过程: 首先对节点进行Cull,该过程只判断物体是否可见。不作其它行为。

                然后根据上述结果和节点的值(isActiveAlways)来确定是否对这个节点进行标准Update过程。如果该节点可见,则必须Update,如果该节点不可见,而该值为真,则仍然Update。只是不进入渲染通道(参见RenderDevice过程)。否则不对该节点Update。即这种情况下默认该节点和该节点的所有子节点都不变。

                对需要Update的节点进行1:UpdateGeometricState操作,该操作定义在Spatial类中(待修改)。主要作用是更新节点的WorldTransformationWorldBound。因为Bound的更新是从下到上,Transformation的更新是从上到下的。所以该操作分为两步。

                当前的设计策略是:

                    UpdateVisitorapply(Node&)中,先对Node执行TransformationUpdate,然后将该节点的渲染状态压栈。利用Traverse遍历该节点的子节点,然后再Update WorldBound,然后将渲染状态出栈。利用递归函数的特点,在递归完成后的回调过程中Update Bound。这样就在一次遍历中完成的两个操作。

                    applyGeometric&),则同样执行Update Transformation

                然后将渲染状态进行整合,替换节点本身的RenderState,然后将LocalBound更新为WorldBound

  日期:6/30/2005

完成任务:

1.    完成在UpdateVisitor中对LocalBoundWorldBound 的初试化过程。当Root节点第一次进入Update过程时,得到所有节点的LocalBoundWorldBound

2.    修改场景遍历策略设计:

          存在问题:a.Cull过程应该在得到节点的WorldBound之后。

                    b.动态更新Bound树。并使得只有需要的节点被更新

          当前策略: 如图

  

          先考虑G情况。GLocalTransformation改变。因此GWorldBound改变,导致GG.*Parent改变(*为反身代词闭包)。

          考虑N情况。NLocalTransformation改变,导致N.*ChildWorldTrnas

formation改变,同时也导致N.*ChildWorldBound改变。并且N.*ParentWorldBound也改变。  

          基于以上分析,设计出动态更新策略:

          对于Geometirc节点,有布尔值m_bLocalBoundDirty。该值标明该G节点的LocalBound是否需要重新创建。当物体被创建,被赋予顶点,顶点索引,顶点数量等信息时,该值都将被置为true。而UpdateLocalBound执行后,该值被置为false

          对于Spatial节点,有布尔值m_bTransformationDirty。该值标明SN || GLocalTransformationWorldTransformation(通过Modificator已改变。对该值的处理被分派到GN派生类型中。

对于G节点,当该值为true时,首先更新本身的WorldBound(此时,如果m_bLocalBoundDirtyfalse,不需要更新LocalBound) 和 WorldTransformation。然后标示其父节点的m_bWorldBoundDirtytrue。父节点在更新完其所有子节点后判断m_bWorldBoundDirty是否为真,如果是,就更新其WorldBound,并将其父节点m_bWorldBound也置为true

                        对于N节点,当该值为true时,首先更新自身的WorldTrans

Formation,然后更新所有子节点的WorldBoundWorldTransformation(这里不需再对子节点的布尔值进行判断了,除了G点的m_bLocalBoundDirty)。当递归返回后,更新自身的WorldBound,然后将N.^parentm_bWorldBoundDirtytrue

3.    完成以上策略,但未进行测试。

posted @ 2005-07-17 19:42  BadKeeper  阅读(690)  评论(0编辑  收藏  举报