该例子演示了osg的场景同步。
需要多台电脑操作演示,一台主机,多台从属机器,通过操作主机,实现多台从属机器的同步操作。
broadcaster这个类用于主机发送信息。
receiver这个类用于从属机器接收信息。
里面主要是socket,计算机之间的通讯,就不做研究,只需记住他们的功能。
STAND_ALONE表示单机,不参与信息的接收于发送;
MASTER主机,发送信息;
SLAVE从属机器,接收信息;
然后定义了socket数目,相机的一些参数。
如果camera_fov>0.0f,调整了一下相机的张角。
CameraPacket类,看看该类的属性就可以知道该类的功能,
_masterKilled主机是否结束运行;
_matrix相机的变换矩阵;
_frameStamp帧;
_events事件
我们大致想想,同步的过程,当操作主机时,主机把这些操作的事件发送给从属机器,从属机器接收这些
事件,然后响应这些事件。
该例子实现的就是这样一个过程,而最关键的就是_events,把主机一帧的所有事件发送给从属相机执行
,完成同步。
osg的一帧中做了一下这些事情:
advance更新了一下时间、帧数
eventTraversal事件
updateTraversal更新
renderingTraversals裁切和渲染
在本例子中eventTraversal之前,需要同步主从属机器的事件,因此,在这里写这样一个循环,实现同步
。
在eventTraversal中读取Events
osgViewer::ViewerBase::Contexts contexts;
viewer.getContexts(contexts);
for
(osgViewer::ViewerBase::Contexts::iterator citr =contexts.begin(); citr != c
需要多台电脑操作演示,一台主机,多台从属机器,通过操作主机,实现多台从属机器的同步操作。
broadcaster这个类用于主机发送信息。
receiver这个类用于从属机器接收信息。
里面主要是socket,计算机之间的通讯,就不做研究,只需记住他们的功能。
STAND_ALONE表示单机,不参与信息的接收于发送;
MASTER主机,发送信息;
SLAVE从属机器,接收信息;
然后定义了socket数目,相机的一些参数。
如果camera_fov>0.0f,调整了一下相机的张角。
CameraPacket类,看看该类的属性就可以知道该类的功能,
_masterKilled主机是否结束运行;
_matrix相机的变换矩阵;
_frameStamp帧;
_events事件
我们大致想想,同步的过程,当操作主机时,主机把这些操作的事件发送给从属机器,从属机器接收这些
事件,然后响应这些事件。
该例子实现的就是这样一个过程,而最关键的就是_events,把主机一帧的所有事件发送给从属相机执行
,完成同步。
osg的一帧中做了一下这些事情:
advance更新了一下时间、帧数
eventTraversal事件
updateTraversal更新
renderingTraversals裁切和渲染
在本例子中eventTraversal之前,需要同步主从属机器的事件,因此,在这里写这样一个循环,实现同步
。
在eventTraversal中读取Events
osgViewer::ViewerBase::Contexts contexts;
viewer.getContexts(contexts);
for
(osgViewer::ViewerBase::Contexts::iterator citr =contexts.begin(); citr != c

该博客介绍了osgcluster的使用示例,通过主机与从属机器的交互实现多台机器的场景同步。主要涉及broadcaster(主机发送信息)和receiver(从属机器接收信息)类,以及STAND_ALONE、MASTER、SLAVE角色定义。关键在于CameraPacket类中的事件同步,通过_event队列在eventTraversal阶段实现主从设备事件同步,确保渲染一致性。
365

被折叠的 条评论
为什么被折叠?



