OGRE屏幕坐标转世界坐标

本文介绍了如何在OGRE中将鼠标点击的屏幕坐标转换为对应的世界坐标,通过监听MouseListener并处理mousePressed事件来实现。在事件处理函数中,使用相机到视口的射线查询,执行RaySceneQuery找到点击位置,并在该位置创建场景节点和对象。

http://download1.youkuaiyun.com/down3/20070604/04105853850.zip

其实这些OGRE已经帮我们做好了。。不多说 看代码

这里关键是要监听类要继承MouseListener

 然后在mousePressed(MouseEvent* e)进行处理,关键是这个函数

    virtual void mousePressed(MouseEvent* e)
    {
        // Left mouse button down
        if (e->getButtonID() & MouseEvent::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->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 );
                mCurrentObject->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

OGRE/OsgEarth中,经纬度换为OSG World坐标通常涉及到地理坐标系统(如WGS84)到游戏引擎的世界空间坐标换。这个过程一般包括以下几个步骤: 1. 将经纬度(经度,纬度)换为三维球面坐标(X,Y,Z)。你可以使用像GeodeticCalculator这样的工具库,它可以根据地球的半径计算出对应的弧度值。 2. 球面坐标需要进一步平移至赤道面上。因为Ogre世界坐标系通常是基于地面平面(0海拔),所以需要将Z轴高度设置为0。 3. 赤道面上的坐标还需要根据地图投影(例如Mercator或UTM)将其换为平面直角坐标,这一步会改变X和Y的值。 4. 最后,为了适应Ogre世界坐标范围(通常从-1到1),你需要对换后的X、Y值进行缩放,并加上世界坐标系的原点位置。 以下是一个简化版的伪代码示例: ```python from osg.geometry import GeodeMath def lat_long_to_world(lat, lon): # 使用合适的地球半径和经纬度换公式 radius = EarthRadiusInMeters x = radius * Math::cos(Math::degToRad(lat)) * Math::cos(Math::degToRad(lon)) y = radius * Math::cos(Math::degToRad(lat)) * Math::sin(Math::degToRad(lon)) z = radius * Math::sin(Math::degToRad(lat)) # 平移到赤道面并调整Z轴 x /= scale_factor y /= scale_factor z = 0 # 加上世界坐标系原点 return (x + world_x_offset, y + world_y_offset, z) # ... 其他变量如地球半径、缩放因子和偏移量需自行设定 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值