zoukankan      html  css  js  c++  java
  • ogre世界坐标鱼屏幕坐标相互转换

    bool worldCoordToScreen(Vector3 objPos, Camera* cam, Vector2 screenRect,  Vector2& screenPos)
    {
    Matrix4 viewMatrix = cam->getViewMatrix();
    Matrix4 projMatrix = cam->getProjectionMatrix();
     
    Vector4 in = Vector4(objPos.x, objPos.y, objPos.z, 1.0);
    Vector4 out = viewMatrix * in;
    out = projMatrix * out;
     
    if(out.w <= 0.0) return false;    // out.w<0时,objPos 在摄像机背面
     
    out.x /= out.w;
    out.y /= out.w;
    out.z /= out.w;
     
    // Map x, y and z to range 0-1
    out.x = out.x * 0.5 + 0.5;
    out.y = out.y * 0.5 + 0.5;
    out.z = out.z * 0.5 + 0.5;
     
    // Map x,y to viewport
    out.x = out.x * screenRect.x;
    out.y = (1-out.y) * screenRect.y;
     
    screenPos.x = out.x;
    screenPos.y = out.y;
     
    return true;
    }

     

      virtual void mousePressed(MouseEvent* e)
        {
            // Left mouse button down
            if (e->getButtonID() & MouseEvent::khyJh"@BUTTON0_MASK)
            {
                // Setup the ray scene query
                Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() );
                mRaySceneQuery->setRay( mouseRay );

                // Execute query
                RaySceneQueryResult &result = mRaySceneQuery->execute();
                RaySceneQueryResult::iterator itr = result.begin( );

                // Get results, create a node/entity on the position
                if ( itr != result.end() && itr-&gkhyJh"@t;worldFragment )
                {
                    char name[16];
                    sprintf( name, "Robot%d", mCount++ );

                    Entity *ent = mSceneMgr->createEntity( name, "robot.mesh" );
                    mCurrentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", itr->worldFragment->singleIntersection );
                    mCurrentObject->attachObject( ent );
                    mCurrekhyJh"@ntObject->setScale( 0.1f, 0.1f, 0.1f );
                } // if

                mLMouseDown = true;
            } // if

            // Right mouse button down
            else if (e->getButtonID() & MouseEvent::BUTTON1_MASK)
            {
                mRMouseDown = true;
                CEGUI::MouseCursor::getSingleton().hide( );
            } // else if
        } // mousePressed

  • 相关阅读:
    rxjs入门7之其它操作符复习
    rxjs入门6之合并数据流
    rxjs入门5之创建数据流
    rxjs入门4之rxjs模式设计
    boost_1.63.0编译VS2013
    c++基础类型之signed、unsigned的一个细节
    【排序】归并排序算法
    【排序】快速排序算法
    【排序】冒泡排序算法
    【排序】堆排序算法
  • 原文地址:https://www.cnblogs.com/kex1n/p/3717958.html
Copyright © 2011-2022 走看看