我要发帖 回复

正式会员

12

主题

35

积分

0

专家分

[img]http://wpa.qq.com/pa?p ..

:

私信
发表时间 : 2006-9-7 11:19:49 | 浏览 : 18684    评论 : 99
代码+图片


[cpp]class Picker {

public:



    /**
     * intersect w/ the scene at the given mouse position
     */
    vsNode *pick(vpChannel *channel, float mx, float my)
    {

        float n, f;
        double x, y, z, h, p, r = 0.0, range;
        const vuMatrix<double> &viewMat = channel->getViewMatrix();
        channel->getNearFar(&n, &f);

        // if we've got an orthographic projection, then things are easy.
        // In this case the mouse position gives us the xy location within
        // the orthographic frustum and our isector will run from the near
        // to the far clipping plane.
        if (channel->getProjection() == vrChannel::PROJECTION_ORTHOGRAPHIC) {

            float l, r, b, t;
            channel->getFrustum(&l, &r, &b, &t);

            x = l + ((mx + 1.0f) * 0.5f) * (r - l);
            y = b + ((my + 1.0f) * 0.5f) * (t - b);
            z = viewMat[3][2] + n;
            h = 0.0;
            p = -90.0;
            range = f - n;

        }

     
        else {

            vuVec3<float> mouse(mx, my, -1);
            vuVec3<float> vec;
            vuMatrix<float> projInv;
            projInv.invert(channel->getVrChannel()->getProjectionMatrix());
            projInv.transformPoint(&mouse);
            channel->getVrChannel()->getOffsetMatrixInverse(
                ).transformPoint(&mouse);
            channel->getVrChannel()->getViewMatrix().transformPoint(&mouse);

            // create a vector from the eye point through the mouse position
            x = viewMat[3][0];
            y = viewMat[3][1];
            z = viewMat[3][2];

            vec[0] = mouse[0] - x;
            vec[1] = mouse[1] - y;
            vec[2] = mouse[2] - z;

            // calculate the heading and pitch of this vector
            h = vuRad2Deg(-vuArcTan(vec[0], vec[1]));
            p = vuRad2Deg(vuArcTan(vec[2],
                vuSqrt(vuSq(vec[0]) + vuSq(vec[1]))));

            range = 2 * f;

        }

        // update the isector to align w/ the vector
        m_isector->setTranslate(x, y, z);
        m_isector->setRotate(h, p, 0.0);
        m_isector->setSegmentRange(range);

        // perform the intersection test and see if we hit anything
        vsNode *node = NULL;
        m_isector->update();

        if (m_isector->getHit()) {

          node = m_isector->getHitNode();
          vuVec3<double> *point=new vuVec3<double>;
          if(m_isector->getHitPoint(point)==vsgu::SUCCESS){
                point->get(&x,&y,&z);
           printf("查询三维坐标为:%.3f,%.3f,%.3f\n",(float)x,(float)y,(float)z);
                        }

        }

        return node;

    }

public:

    //Walk up the parents till a vsDOF node is found
    vsNode *getParent(vsNode *child, vuClassType *classType)
    {
        if (child != NULL) {
            vsNode::const_iterator_parent it, ite = child->end_parent();
            for(it=child->begin_parent();it!=ite;++it) {
                if((*it)->isOfClassType(classType))
                    return *it;
                else return getParent(*it, classType);
            }
        }
        return NULL;
    }

    // select either picking of objects or nodes
    Mode m_mode;
    // an isector for use w/ intersection tests
    vuField<vpIsectorLOS*> m_isector;
//        vpIsectorLOS *m_isector;

};

// create a simple render strategy to render highlighted geometry
class HighlightStrategy : public vrRenderStrategy
{

public:

    HighlightStrategy()
    {
        // allocate the color array w/ a single color
        m_color = vuAllocArray<vuVec4<float> >::malloc(1);
        m_color[0].set(1.0f, 0.0f, 0.0f, 0.5f);
        vuRef(m_color);
    }

    virtual void draw(vrDrawContext *context, const vrDrawFunc::Data &data)
    {

        // do pre draw stuff...
        
        // disabling lighting so that any material specified for the geometry
        // will be ignored, and as a result, our color alone will be used to
        // determine the fragment color of the geometry
        vrStateMgr *stateMgr = context->getStateMgr();
        stateMgr->push(vrLight::Element::Id, context, true);

        // enable transparency so that our highlight color will effect the
        // transparency of the geometry
        vrAlphaBlend::Element alphaBlendElement;
        alphaBlendElement.m_enable = true;
        alphaBlendElement.m_src = vrAlphaBlend::MODE_SRC_ALPHA;
        alphaBlendElement.m_dst = vrAlphaBlend::MODE_INVERSE_SRC_ALPHA;
        stateMgr->push(vrAlphaBlend::Element::Id, context);
        stateMgr->setElement(vrAlphaBlend::Element::Id, &alphaBlendElement, context);

        // render anything whose alpha is greater than 0
        vrAlphaTest::Element alphaTestElement;
        alphaTestElement.m_enable = true;
        alphaTestElement.m_ref = 0.0f;
        alphaTestElement.m_mode = vrAlphaTest::MODE_GREATER;
        stateMgr->push(vrAlphaTest::Element::Id, context);
        stateMgr->setElement(vrAlphaTest::Element::Id, &alphaTestElement, context);

        // draw the geometry...

        // make a local copy of the draw func data and modify it so that
        // we're using an overall color which is our color
        vrDrawFunc::Data d = data;
        d.m_transparent = true;
        d.m_numColors = 1;
        d.m_bindColor = vrDrawFunc::BINDING_OVERALL;
        d.m_color = m_color;

        // resolve the draw func statistics pointer
        vrDrawContext::Statistics *cstats = context->getStatistics();
        vrDrawFunc::Statistics *stats = cstats ? cstats->m_drawFunc : NULL;

        // do the actual rendering
        vrDrawFunc::call(d, stats);

        // do post draw stuff...

        // reset the graphics state
        stateMgr->pop(vrAlphaTest::Element::Id, context);
        stateMgr->pop(vrAlphaBlend::Element::Id, context);
        stateMgr->pop(vrLight::Element::Id, context);

    }

private:

    // the color for our highlight
    vuVec4<float> *m_color;

    VUMEMBASE_HEADER_INCLUDES(HighlightStrategy)

};

// must implement destructor outside of class definition as prescribed by
// VUMEMBASE_HEADER_INCLUDES macro
HighlightStrategy::~HighlightStrategy()
{
    // delete the color attribute array
    vuUnref(m_color);
}



// we need to derive our application class from the vpInputSourceBoolean
// subscriber class so we can be notified of mouse button presses
class myApp : public vpApp, public vpInputSourceBoolean::Subscriber{

public:

    /**
     * Constructor
     */
    myApp(){}

    /**
     * Destructor
     */
    ~myApp()
    {
        // unreference member variables which cache Vega Prime class instances
        m_highlightStrategy->unref();
        delete m_picker;
    }
   
    /**
     * Configure my app
     */
    int configure() {

        // pre-configuration

        // configure vega prime system first
        vpApp::configure();

        m_picker = new Picker(*vpScene::begin());

        // create our highlight render strategy
        m_highlightStrategy = new HighlightStrategy();
        m_highlightStrategy->ref();

        // add a subscriber to the left mouse button so we know when it's been
        // pressed.  Note here that the motion model doesn't create the
        // default mouse input device until the first update so we'll need to
        // specify our own input device for it to use instead.  Note that
        // specifying a channel for the mouse here allows the input to be
        // relative to the channel so the picking will work even if the
        // channel isn't covering the entire window.
        vpInputMouse *mouse = new vpInputMouse();
        mouse->setWindow(*vpWindow::begin());
        mouse->setChannel(*vpChannel::begin());
        vpInputSourceBoolean *leftMouseButton = mouse->getSourceBoolean(
            vpInputMouse::SOURCE_BOOLEAN_BUTTON_LEFT);
        leftMouseButton->addSubscriber(
            vpInputSourceBoolean::EVENT_FALLING_EDGE, this);
        
        return vsgu::SUCCESS;

    }

    /**
     * Override keyboard input
     */
    virtual void onKeyInput(vrWindow::Key key, int mod)
    {

        switch (key) {

        case vrWindow::KEY_SPACE: // select the picking mode
            if (m_picker->getMode() == Picker::MODE_OBJECT) {
                m_picker->setMode(Picker::MODE_GEOMETRY);
                printf("picker is in geometry mode\n");
            }
            else if (m_picker->getMode() == Picker::MODE_GEOMETRY) {
                m_picker->setMode(Picker::MODE_DOF);
                printf("picker is in dof mode\n");
            }
            else if (m_picker->getMode() == Picker::MODE_DOF) {
                m_picker->setMode(Picker::MODE_LOD);
                printf("picker is in lod mode\n");
            }
            else if (m_picker->getMode() == Picker::MODE_LOD) {
                m_picker->setMode(Picker::MODE_OBJECT);
                printf("picker is in object mode\n");
            }
            break;

        default:
            vpApp::onKeyInput(key, mod);
            break;

        }

    }

    /**
     * notification that the left mouse button has been pressed
     */
    virtual void notify(vpInputSourceBoolean::Event,
        vpInputSourceBoolean *source)
    {

        // only pick if the motion model is disabled
        vpObserver *observer = *vpObserver::begin();

        //if (observer->getStrategyEnable() == false) {

            static vsNode *selectedNode = NULL;
            vpInputMouse *mouse = *vpInputMouse::begin();
            vpInputSourceFloat *sourceX = mouse->getSourceFloat(
                vpInputMouse::SOURCE_FLOAT_POSITION_X);
            vpInputSourceFloat *sourceY = mouse->getSourceFloat(
                vpInputMouse::SOURCE_FLOAT_POSITION_Y);
            vsNode *node = m_picker->pick(*vpChannel::begin(),
                sourceX->getValue(), sourceY->getValue());

            // if something is already selected, remove the highlight
            if (selectedNode != NULL)
                setRenderStrategy(selectedNode, NULL);

            // if something new was picked, highlight it
            if ((node != NULL) && (node != selectedNode)) {

                setRenderStrategy(node, m_highlightStrategy);
                selectedNode = node;

            }
            else selectedNode = NULL;

       // }

    }

private:

    /**
     * traversal function for setting the render strategy
     */
    vsTraversal::Result travFuncGeometry(vsNode *node, vrRenderStrategy *strategy)
    {
        vrGeometry *geometry = static_cast<vsGeometry *>(node)->getGeometry();
        geometry->setRenderStrategy(strategy);
        return vsTraversal::RESULT_CONTINUE;
    }

    /**
     * setup a traversal to set the render strategy on all geometries for the
     * given root node
     */
    void setRenderStrategy(vsNode *root, vrRenderStrategy *strategy)
    {
                vsTraversalUser<vrRenderStrategy *,vsTraversalLookUpNodeId> trav(strategy);
                trav.addPreVisit(vsGeometry::getStaticNodeId(), this, &myApp::travFuncGeometry);
                trav.visit(root);      
    }

    // our highlight strategy
    HighlightStrategy *m_highlightStrategy;
    // our picker class
    Picker *m_picker;

};[/cpp]

效果

效果

vp_MFCforxp.rar

175.13 KB, 下载次数: 679

OPENGL disp Chinese Font

最近VR访客

kmustty 评论于2006-9-9 10:27:57
怎么没有人回音啊,这个是鼠标拣选OBJECT和MFC显示VP并用OPENGL显示汉字的代码啊
smstone 评论于2006-9-11 10:40:42
好东西,回去研究,谢谢
kmustty 评论于2006-9-11 21:30:49
没有限制什么啊,应该可以下.
russelcrowe 评论于2006-9-12 13:13:10
请问楼主,你做好的程序显示的速度和在vc中调试的速度是一样的吗,我的就不一样,
不知道是出了什么问题,是有什么需要设置的吗,还是说动态链接库有问题。
谢谢:loveliness: :loveliness:
kmustty 评论于2006-9-12 14:10:12
不大明白你的意思,我的是VP1.2.2版本,第二段代码要把OGL库加进来,第一个是关键代码,你只要补充几句就可以了.具体设置你看VEGA PRIME的说明书
russelcrowe 评论于2006-9-12 14:19:24
我在vc中调试vp驱动,本来因为模型面数很多,运行速度就很慢,但是用vc编译了以后就明显变地更
慢了,我不知道是哪错了
russelcrowe 评论于2006-9-12 14:23:45
vp中的setting我都按照说明书都改了,那速度还慢为什么,
以前用过的opengl的程序也是这样,一直没解决:L :L
kmustty 评论于2006-9-12 14:23:53
调试哪个程序
russelcrowe 评论于2006-9-12 14:53:21
我自己编的,就是简单的在一个平面上实现对几辆复制的飞机姿态的控制
russelcrowe 评论于2006-9-12 14:55:27
东西不是很复杂,但是,在vc中改变他们的位置,就是onkeydown,速度还可以
但是到了.exe速度就没了
kmustty 评论于2006-9-12 17:55:16
可能和你计算机性能有关系.
如果可以的话,把代码贴上来
russelcrowe 评论于2006-9-12 20:39:20
不是机器的问题,我想可能是vc中什么地方设置不对吧
那编译做成.exe的文件速度怎么会减呢,又没添加什么,同时也没运行其他的。:Q
newswordwest 评论于2006-9-14 01:18:50
这样的贴子,是应该顶的
kevinzeng 评论于2006-9-28 12:55:46
楼主,你的汉字显示代码在vc.net2003下编译出现错误,

c:\Documents and Settings\remote\My Documents\Visual Studio Projects\VegaPrime_Desktop_Tutorial\application\GLFont.h(8) : error C2061: 语法错误 : 标识符“LPCTSTR”
c:\Documents and Settings\remote\My Documents\Visual Studio Projects\VegaPrime_Desktop_Tutorial\application\GLFont.cpp(33) : error C2511: “int CGLFont::ShowStringBitmap(LPCTSTR,HFONT,BOOL)” : “CGLFont”中没有找到重载的成员函数
        c:\Documents and Settings\remote\My Documents\Visual Studio Projects\VegaPrime_Desktop_Tutorial\application\GLFont.h(2) : 参见“CGLFont”的声明


怎么回事?

这是cglfont.h的
class CGLFont  
{
public:
        CGLFont();
        virtual ~CGLFont();

public:
        static int ShowStringBitmap(LPCTSTR lpszText,HFONT hFont /*= NULL*/,BOOL bUseDisplayList /*= FALSE*/);
};

这是.cpp的
#include "stdafx.h"
#include "GLFont.h"
#include "windows.h"
#include "gl/gl.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGLFont::CGLFont()
{

}

CGLFont::~CGLFont()
{

}

/********************************************************************
*        
*        Function: ShowStringBitmap
*        Parameters:
*        Return value:
*        Description:位图方式显示字符串(支持中文)
*        Created:  
*        modified:   
*
*********************************************************************/

int CGLFont::ShowStringBitmap(LPCTSTR lpszText,HFONT hFont /* =NULL */,BOOL bUseDisplayList /*=FALSE */)
{
        CBitmap bitmap;
        BITMAP bm;
        SIZE size;
        UCHAR* pBmpBits;
        HFONT hOldFont;
        HDC hdc = wglGetCurrentDC();

        if(!hFont) // use default system font
        {
                hFont = (HFONT)::GetStockObject(SYSTEM_FONT);
        }

        hOldFont = (HFONT)SelectObject(hdc, hFont);
        ::GetTextExtentPoint32(hdc, lpszText, strlen(lpszText), &size);

        bitmap.CreateBitmap(size.cx, size.cy, 1, 1, NULL);

        HDC hMemDC = ::CreateCompatibleDC(hdc);
        if(hMemDC)
        {
                HBITMAP hPrevBmp = (HBITMAP)SelectObject(hMemDC, bitmap);
                HFONT hPrevFont = (HFONT)SelectObject(hMemDC, hFont);
               
                SetBkColor(hMemDC, RGB(0, 0, 0));
                SetTextColor(hMemDC, RGB(255, 255, 255));
                SetBkMode(hMemDC, OPAQUE);
                TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));

                // copy GDI bitmap to DIB
                bitmap.GetBitmap(&bm);
                size.cx = (bm.bmWidth + 31) & (~31);
                size.cy = bm.bmHeight;
                int bufsize = size.cy * (((bm.bmWidth + 31) & (~31)) / 8);
                pBmpBits = new UCHAR[bufsize];
                memset(pBmpBits, 0, sizeof(UCHAR)*bufsize);

                struct {
                        BITMAPINFOHEADER bih;
                        RGBQUAD col[2];
                }bic;
                BITMAPINFO *binf = (BITMAPINFO *)&bic;

                binf->bmiHeader.biSize = sizeof(binf->bmiHeader);
                binf->bmiHeader.biWidth = bm.bmWidth;
                binf->bmiHeader.biHeight = bm.bmHeight;
                binf->bmiHeader.biPlanes = 1;
                binf->bmiHeader.biBitCount = 1;
                binf->bmiHeader.biCompression = BI_RGB;
                binf->bmiHeader.biSizeImage = bufsize;
                binf->bmiHeader.biXPelsPerMeter = 1;
                binf->bmiHeader.biYPelsPerMeter = 1;
                binf->bmiHeader.biClrUsed = 0;
                binf->bmiHeader.biClrImportant = 0;

                ::GetDIBits(hdc, bitmap, 0, bm.bmHeight, pBmpBits, binf, DIB_RGB_COLORS);               
                SelectObject(hMemDC, hPrevBmp);
        }
        : eleteDC(hMemDC);

        //设置当前字体  
        SelectObject(hdc, hOldFont);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

        GLuint displist = 0;
        if(bUseDisplayList)
        {
                displist = glGenLists(1);
                glNewList(displist, GL_COMPILE);
                glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0,pBmpBits);
                glEndList();
        }
        else;
        glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0,        pBmpBits);

        delete pBmpBits;        
        return displist;
}
kevinzeng 评论于2006-9-28 12:58:12
哪错了?请指点
kthe 评论于2006-9-28 17:25:10
xue xi!
kevinzeng 评论于2006-9-29 08:49:32
没有人关注吗?
99daodan 评论于2006-10-9 09:21:11
呵呵,我估计不错
回去研究了先
oceantu 评论于2006-10-12 11:37:15
真是好人,向你学习.

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-4-18 07:17 AM

返回顶部