全局坐标与场景通道屏幕坐标的转换类可以单独设计实现,也可以与窗口鼠标类合并实现。因为通道屏幕显示的数据往往与鼠标操作相关,本书采用了后者,与窗口鼠标类结合实现。因此,通道屏幕坐标转换类在完全利用窗口鼠标类的基础上扩展了部分功能而实现。
对于坐标转换类的设计,采用了多继承的方式,继承的父类为下列 4个:vpInput SourceBoolean::Subscriber,vpInputSourceFloat::Subscriber,vpInputSourceInteger::Subscriber,vsChannel::Subscriber。
重载实现的方法有以下3个,其中前两个与鼠标类完全相同:
void notify(vpInputSourceBoolean::Event event,vpInputSourceBoolean *source),该方法主要用于判断鼠标是否有键被按下。void notify(vpInputSourceInteger::Event,vpInputSourceInteger *source),该方法主要用于获取鼠标坐标值x 和y的大小或鼠标中键滑动方向的变化。void notify(vsChannel::Event event,const vsChannel *channel,vrDrawContext *context),该方法是通道屏幕坐标转换类唯一增加的方法,该方法包含事件event、通道channel 和绘制上下文context,可以完全实现通道屏幕的显示。在该方法中,主要涉及坐标转换和字体设置显示问题。
坐标转换,主要是利用通道内的目标对象PublicMember::pObject_m1_tank的三维坐标,使用vuMatrixf 对象world2screen 转换为通道屏幕坐标。转换后的通道屏幕坐标,以通道屏幕左下角为坐标原点,左下角坐标值为(0,0),左上角坐标为(0,1),右下角坐标为(1,0),右上角坐标为(1,1)。
字体设置显示,主要利用vrFont2D 对象m_font 实现。
字体设置的初始化代码:
m_font=new vrFont2D ("system",25,25,false);
第一个参数为字体类型,可以为系统支持的字体;第二个参数为字的高度,第三个参数为字的宽度;第四个参数控制字是否倾斜。遗憾的是,目前暂不支持中文。
字体显示的代码:
m_font->displayStringAt(context,m_text1.c_str(),color,0.80f,0.09f);
第一个参数为通道绘制上下文,第二个参数为字符串,第三个参数为RGB 值的字体颜色,第四个参数和第五个参数分别为横坐标x 和纵坐标y。需要注意的是,坐标值的范围为[0~1]。
另外,为了使显示位置跟随目标对象一起移动,需要进行更多的转换:
m_font->displayStringAt(context,m_text2.c_str(),color,fx,fy+0.14);
其中的fx 和fy 就是依据目标对象的实际三维坐标转换而来的。(www.daowen.com)
具体代码如图9.4.1所示。
图9.4.1 通道屏幕坐标转换的函数实现
与窗口鼠标类相同,需要设计相关的变量协助处理。首先,设计了两个布尔变量:“bool LeftButtonDown;”“bool RightButtonDown;”。它们用于判断鼠标按下的是左键还是右键,初始值都为false。其次,设计了两个整数变量:“int ValX;”“int ValY;”。它们分别用于记录鼠标的坐标x 值和y 值,依据坐标值的大小变化,判断鼠标滑动的方向,初始值为0。最后,设计了一个浮点变量:“float myChannelAngle;”,用于记录通道视角大小,初始值为16.0,变化量是0.5。另外,还涉及两个操作对象的变量,一个对象是PublicMember::pObject_m1_tank,另一个对象是通道对象PublicMember::myChannel。这两个对象都被设计为PublicMember的静态成员,相当于作为全局变量使用,具体代码如图9.4.2所示。
图9.4.2 通道屏幕坐标转换类
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。