|
场景中有一个平面和一条线段。平面是在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()));
}
}
程序执行的结果如图:
|
-
|