VP5下的OpenGL绘制

由于VP5不能实现“能量值”跟随效果,只能采用OpenGL来绘制,同时可以限制非中文字符。


#include <vsgu.h>
#include <vp.h>
#include <vpApp.h>
#include <vsChannel.h>
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#include <GL/gl.h>
#include <GL/glu.h>
#include ".\WxpVP.h"

#pragma once
class WxpOpenglDraw:public vsChannel::Subscriber
{
public:
	vsFieldFrameData< vuMatrix< double > >   m_objectPosition;

	string str;

	WxpOpenglDraw(void);
	~WxpOpenglDraw(void);


	void notify(vsChannel::Event event, const vsChannel *channel, vrDrawContext *context) 
	{
		//压栈操作
		vrElement::const_iterator_context it, ite = vrElement::end_context();
		for (it=vrElement::begin_context();it!=ite;++it) 
		{
			if (*it == vrTransform::ElementProjection::Id)
				context->pushElement(*it, false);
			else context->pushElement(*it, true);
		}

		//获取视点矩阵
		vuMatrix<double> modelViewMat = channel->getViewMatrixInverse();
		modelViewMat *= channel->getOffsetMatrix();

		//读取数据
		bool bMod;
		const vuMatrix<double>* mat =  m_objectPosition.getReadBuffer(&bMod,
			vsThread::resolveFrameNumber());

		if (mat == NULL) {	return;        }
		//视角矩阵转换
		modelViewMat.preMultiply(*mat);
		vrTransform::ElementModelView modelViewElement;
		vuMatrixTruncate(&modelViewElement.m_matrix, modelViewMat);
		context->setElement(vrTransform::ElementModelView::Id,&modelViewElement);		

		//绘制单个能量值

		glLineWidth(10.0f);
		glColor3f(1.0f, 0.0f, 0.0f);	
		glEnable(GL_LINE_SMOOTH);
		glBegin(GL_LINES);


		glVertex3f( WxpVP::CurentObjPos.x,
			        WxpVP::CurentObjPos.y,
					WxpVP::CurentObjPos.z+0.1);
		
		glVertex3f( WxpVP::CurentObjPos.x,
			        WxpVP::CurentObjPos.y,
					WxpVP::CurentObjPos.z+0.2);
		

		glEnd();
		glDisable(GL_LINE_SMOOTH);
		glFlush();

        //绘制文字
		glColor3f(1.0f, 1.0f, 1.0f);	
		glEnable(GL_LINE_SMOOTH);
		wglUseFontBitmaps(wglGetCurrentDC(),0,256,1000);
		glListBase(1000);
		glRasterPos3f(WxpVP::CurentObjPos.x,
			        WxpVP::CurentObjPos.y,
					WxpVP::CurentObjPos.z+0.2);
		str=WxpVP::pObjectPicked->getName();
		glCallLists(str.length(),GL_UNSIGNED_BYTE,WxpVP::pObjectPicked->getName());
		//出栈操作
		context->popElements(false);   
	} 
	//
	virtual void notify(vsChannel::Event, const vsChannel *,vsTraversalCull *) 
	{
	}

};

应该注意使用类成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值