纹理切换控制的设计,主要包含两个步骤:第一个步骤是关于动态绘制图形并在图形上设置最新纹理图片,本书设计了函数PublicMember::DrawBoard 来实现该功能;第二个步骤是在VP 主线程中如何使用PublicMember::DrawBoard 函数。
实现PublicMember::DrawBoard 函数的步骤,与本书前面关于材质纹理操作的步骤大体类似。
需要设置图形纹理时,都是通过在状态类vrState 里设置元素值来完成的。首先需要找到纹理文件,在图片产生类的成员函数SaveBmp 中把图片文件默认保存为mm.bmp,在这里就使用该图片文件。
首先,利用纹理工厂类vrTextureFactory 对象加载纹理文件,其代码如下:
vrTextureFactory* pTexFactory=new vrTextureFactory();
vrTexture* treeTex=pTexFactory->read("mm.bmp");
pTexFactory->unref();
其次,设置纹理元素属性,其代码如下:
vrTexture::Element textureElement;
textureElement.m_enable[0] = true;
textureElement.m_texture[0]=treeTex;
接着,设置与材质有关的元素,否则,新绘制的图形会在观察者移动中产生闪烁。
vrState* treeState=new vrState();
treeState->setElement(vrTexture::Element::Id,&textureElement);
treeState->setElement(vrMaterial::Element::Id,&materialElement);
treeState->setElement(vrLightModel::Element::Id,&lightModelElement);
treeState->setElement(vrColorTrack::Element::Id,&colorTrackElement);
其他代码与绘制箱体基本相同,详细代码如图7.5.3所示。其中有一个静态成员变量PublicMember::CTS_pObject_other,它指向绘制物体,后面有关绘制物体的操作都可以使用该指针变量进行操作。(www.daowen.com)
图7.5.3 动态绘制图形并控制纹理代码
使用PublicMember::DrawBoard 函数绘制了一个长方体,并设置了相关纹理和材质,纹理图片文件使用的是默认图片文件mm.bmp,同时用指针PublicMember::CTS_pObject_other 指向了绘制的长方体。
绘制函数设计完成后,还需要在VP 主线程中进行调用。其核心代码如下:
静态变量PublicMember::DrawPicSpan 默认值为零,进入帧循环则先从场景中移除原有长方体,重新运行 PublicMember::DrawBoard 函数进行一次崭新的绘制;然后修改PublicMember::DrawPicSpan的值,以免每一帧都进行绘制。主线程中详细代码如图7.5.4所示,有关动态纹理切换的代码用黑体字体进行了标识。
图7.5.4 动态纹理控制代码
VP 主线程中主要在于通过静态变量PublicMember::DrawPicSpan 判断是否有新图片的产生,从而决定是否移除原有的图形绘制新图形。
新图片的产生,依赖于图片绘制线程的运行。将图片产生类成员函数DrawHDCpicture::GetBitmap 作为线程运行函数,启动代码如图7.5.5所示。
图7.5.5 动态图片绘制线程及其启动
在该线程函数中,每隔1 s 产生一次新图片,同时修改PublicMember::DrawPicSpan的值为零,这样VP 主线程将会移除原有绘制图形,重新进行绘制,从而实时显示最新的内容。其效果如图7.5.6所示。图中白色长方体上的数字将会每隔1 s 进行更新变化。
图7.5.6 动态纹理显示
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。