游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2606|回复: 2

请教关于射线和物体求交的问题

[复制链接]

14

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2007-11-29 16:55:00 | 显示全部楼层 |阅读模式
场景中有一个平面和一条线段。平面是在3DMax中做的一个简单的贴有材质的面,该面垂直于Z轴、过原点;线段从(0.0, 0, 160.0)点到(0.0, 0, 0.0)点。现在想求一条射线和这个平面的交点,射线从(0.0, 0, 160.0)点出发,射向负Z轴方向。应该求得一个交点(0, 0, 0),但我的程序求不到交点。谁能指点一下这是为什么,该怎样正确求交吗?
相关代码如下:(其中画线段的Line3D类参考了http://www.ogre3d.org/wiki/index.php/Line3D)
void XDemoApp::createScene(void)
{
        mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow,
                Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mSceneMgr);
        mGUISystem = new CEGUI::System(mGUIRenderer);
        CEGUI:ogger::getSingleton().setLoggingLevel(CEGUI::Informative);

        CEGUI::SchemeManager::getSingleton().loadScheme(
                (CEGUI::utf8*)"TaharezLookSkin.scheme");
        mGUISystem->setDefaultMouseCursor(
                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
        mGUISystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12");
        CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
        CEGUI::MouseCursor::getSingleton().show( );
        setupEventHandlers();
        // 加载平面模型
        mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
        Entity *ent = mSceneMgr->createEntity("Wall", "wall.mesh");
        SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode("WallNode");
        node->attachObject(ent);
        // 一条线段
        Line3D *myLine = new Line3D();
        myLine->addPoint(Vector3(0.0, 0, 160.0));
        myLine->addPoint(Vector3(0.0, 0, 0.0));
        myLine->drawLines();
        SceneNode *myNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
        myNode->attachObject(myLine);
        // 相机位置和朝向
        mCamera->setPosition(Vector3(0, 20, 200));
        mCamera->lookAt(Vector3(0, 0, 0));
        // Overlay
        overlay = OverlayManager::getSingleton().getByName("Example1/VolTexOverlay");   
        overlay->show();

        Vector3 intersectPoint;
        // 求取交点:从(0.0, 0, 160.0)点发出一条射向负Z轴方向的射线
        RaySceneQuery* raySceneQuery = mSceneMgr->createRayQuery(Ray(Vector3(0.0, 0, 160.0), Vector3::NEGATIVE_UNIT_Z));
        raySceneQuery->setSortByDistance(true);
        RaySceneQueryResult& qryResult = raySceneQuery->execute();

        RaySceneQueryResult::iterator it;
        it = qryResult.begin();
        // 若有交点,在Overlay上显示其坐标
        if(it != qryResult.end() && it->worldFragment)
        {
                intersectPoint = it->worldFragment->singleIntersection;
                OverlayManager::getSingleton().getOverlayElement("Example1/Info/Para1")->setCaption(StringConverter::toString(intersectPoint));
        }
        // 否则,在Overlay上显示求交查询的结果的Size
        else
        {
                OverlayManager::getSingleton().getOverlayElement("Example1/Info/Para1")->setCaption(StringConverter::toString(qryResult.size()));
        }
}
程序执行的结果如图:
sf_20071129165435.jpg

22

主题

75

帖子

112

积分

注册会员

Rank: 2

积分
112
QQ
发表于 2007-11-30 10:55:00 | 显示全部楼层

Re:请教关于射线和物体求交的问题

worldFragment是和Terrain的交点,不是和Entity。你应该使用movable,再利用distance来得到Ray上的点。不过这只是和包裹合的交点。如果你要得到精确的,要么进入到SubEntity自己检测,要么使用已有的库,比如OpCode + OgreOpCode。

14

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2007-11-30 14:10:00 | 显示全部楼层

Re: 请教关于射线和物体求交的问题

多谢指教!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-17 04:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表