Ogre碰撞检测
转自:http://blog.csdn.net/weiqubo/article/details/7108363
Ogre采用树桩管理场景中的各种"元素"(摄像机、灯光、物体等),所有的东西都挂在"树"上,不在"树"上的东西不会被渲染。
Ogre::SceneManager就是"树"的管理者,Ogre::SceneNode是从SceneManager中创建的(当然BSP和8*树的管理也和这两个类有关,这暂时不讨论)。
AABB(轴对齐包围盒)
这个东西是碰撞检测的基础,和它类似的还有OBB(有向包围盒),由于OBB创建复杂,所以Ogre采用了AABB。
最简单的碰撞检测:
通过Ogre::SceneNode::_getWorldAABB()可以取得这个叶子节点的AABB(Ogre::AxisAlignedBox),Ogre::AxisAlignedBox封装了对AABB的支持,该类的成员函数Ogre::AxisAlignedBox::intersects()可以判断一个AABB和"球体、点、面以及其他面"的相交情况(碰撞情况)。
m_SphereNode树的叶子,挂了一个"球"
m_CubeNode树的叶子,挂了一个"正方体"
- AxisAlignedBox spbox = m_SphereNode->_getWorldAABB();
- AxisAlignedBox cbbox = m_CubeNode->_getWorldAABB();
- if(spbox.intersects(cbbox))
- {
- //相交
- }
AxisAlignedBox spbox = m_SphereNode->_getWorldAABB();
AxisAlignedBox cbbox = m_CubeNode->_getWorldAABB();
if(spbox.intersects(cbbox))
{
//相交
}
- #include"ExampleApplication.h"
- #include <stdio.h>
- class CollionFrameListener:public ExampleFrameListener
- {
- private:
- SceneNode* m_node;
- SceneNode*m_node2;
- SceneManager* mSceneMgr;
- public:
- CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneNode*node22,SceneManager* manager)
- :ExampleFrameListener(win,cam),m_node(node),m_node2(node22),mSceneMgr(manager)
- {
- }
- bool frameStarted(const FrameEvent& evt)
- {
- AxisAlignedBox spbox=m_node->_getWorldAABB();
- AxisAlignedBox cbbox=m_node2->_getWorldAABB();
- if(spbox.intersects(cbbox))
- {
- m_node2->setScale(10,10,10);
- }
- return ExampleFrameListener::frameStarted(evt);
- }
- };
- class CollionApplication:public ExampleApplication
- {
- protected:
- SceneNode*node1;
- SceneNode* node2;
- void createScene()
- {
- mSceneMgr->setAmbientLight(ColourValue(1,1,1));
- Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");
- node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
- node1->attachObject(ent1);
- Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");
- node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));
- node2->attachObject(ent2);
- }
- void createFrameListener()
- {
- mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,node2,mSceneMgr);
- mFrameListener->showDebugOverlay(true);
- mRoot->addFrameListener(mFrameListener);
- }
- };
- INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
- {
- CollionApplication app;
- app.go();
- }
#include"ExampleApplication.h"
#include <stdio.h>
class CollionFrameListener:public ExampleFrameListener
{
private:
SceneNode* m_node;
SceneNode*m_node2;
SceneManager* mSceneMgr;
public:
CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneNode*node22,SceneManager* manager)
:ExampleFrameListener(win,cam),m_node(node),m_node2(node22),mSceneMgr(manager)
{
}
bool frameStarted(const FrameEvent& evt)
{
AxisAlignedBox spbox=m_node->_getWorldAABB();
AxisAlignedBox cbbox=m_node2->_getWorldAABB();
if(spbox.intersects(cbbox))
{
m_node2->setScale(10,10,10);
}
return ExampleFrameListener::frameStarted(evt);
}
}; class CollionApplication:public ExampleApplication
{
protected:
SceneNode*node1;
SceneNode* node2;
void createScene()
{
mSceneMgr->setAmbientLight(ColourValue(1,1,1));
Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");
node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
node1->attachObject(ent1);
Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");
node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));
node2->attachObject(ent2); }
void createFrameListener()
{
mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,node2,mSceneMgr);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
};
INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
{
CollionApplication app;
app.go();
}
- //创建一个球体查询,这里的100是m_SphereNode挂着的那个球体的半径
- SphereSceneQuery * pQuery=m_SceneMgr->createSphereQuery(Sphere(m_SphereNode->getPosition(),100));
- //执行这个查询
- SceneQueryResult QResult=pQuery->execute();
- //遍历查询列表找出范围内的物体
- for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
- {
- MovableObject* pObject=static_cast<MovableObject*>(*iter);
- if(pObject)
- {
- if(pObject->getMovableType()=="Entity")
- {
- Entity* ent = static_cast<Entity*>(pObject);
- //这里简化了操作,由于只有一个"球体"和一个"正方体",
- //所以只判断了球体和正方体的相交
- if(ent->getName()=="cube")
- {
- //改变位置防止物体重叠
- vtl=-vtl;
- m_SphereNode->translate(vtl);
- break;
- }
- }
- }
- }
//创建一个球体查询,这里的100是m_SphereNode挂着的那个球体的半径
SphereSceneQuery * pQuery=m_SceneMgr->createSphereQuery(Sphere(m_SphereNode->getPosition(),100));
//执行这个查询
SceneQueryResult QResult=pQuery->execute();
//遍历查询列表找出范围内的物体
for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
{
MovableObject* pObject=static_cast<MovableObject*>(*iter);
if(pObject)
{
if(pObject->getMovableType()=="Entity")
{
Entity* ent = static_cast<Entity*>(pObject);
//这里简化了操作,由于只有一个"球体"和一个"正方体",
//所以只判断了球体和正方体的相交 if(ent->getName()=="cube")
{
//改变位置防止物体重叠
vtl=-vtl;
m_SphereNode->translate(vtl);
break;
}
}
}
}
- #include"ExampleApplication.h"
- #include <stdio.h>
- class CollionFrameListener:public ExampleFrameListener
- {
- private:
- SceneNode* m_node;
- SceneManager* mSceneMgr;
- public:
- CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneManager* manager)
- :ExampleFrameListener(win,cam),m_node(node),mSceneMgr(manager)
- {
- }
- bool frameStarted(const FrameEvent& evt)
- {
- SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(m_node->getPosition(),10));
- SceneQueryResult QResult=pQuery->execute();
- for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
- {
- MovableObject* pObject=static_cast<MovableObject*>(*iter);
- if(pObject)
- {
- if(pObject->getMovableType()=="Entity")
- {
- Entity* ent = static_cast<Entity*>(pObject);
- if(ent->getName()=="ogrehead")
- {
- m_node->setScale(10,10,10);
- break;
- }
- }
- }
- }
- return ExampleFrameListener::frameStarted(evt);
- }
- };
- class CollionApplication:public ExampleApplication
- {
- protected:
- SceneNode*node1;
- void createScene()
- {
- mSceneMgr->setAmbientLight(ColourValue(1,1,1));
- Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");
- node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
- node1->attachObject(ent1);
- Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");
- SceneNode* node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));
- node2->attachObject(ent2);
- }
- void createFrameListener()
- {
- mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,mSceneMgr);
- mFrameListener->showDebugOverlay(true);
- mRoot->addFrameListener(mFrameListener);
- }
- };
- INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
- {
- CollionApplication app;
- app.go();
- }
#include"ExampleApplication.h"
#include <stdio.h>
class CollionFrameListener:public ExampleFrameListener
{
private:
SceneNode* m_node;
SceneManager* mSceneMgr;
public:
CollionFrameListener(RenderWindow* win, Camera* cam,SceneNode* node,SceneManager* manager)
:ExampleFrameListener(win,cam),m_node(node),mSceneMgr(manager)
{
}
bool frameStarted(const FrameEvent& evt)
{
SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(m_node->getPosition(),10));
SceneQueryResult QResult=pQuery->execute();
for (SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
{
MovableObject* pObject=static_cast<MovableObject*>(*iter);
if(pObject)
{
if(pObject->getMovableType()=="Entity")
{
Entity* ent = static_cast<Entity*>(pObject);
if(ent->getName()=="ogrehead")
{
m_node->setScale(10,10,10);
break;
}
}
}
}
return ExampleFrameListener::frameStarted(evt);
}
}; class CollionApplication:public ExampleApplication
{
protected:
SceneNode*node1;
void createScene()
{
mSceneMgr->setAmbientLight(ColourValue(1,1,1));
Entity* ent1=mSceneMgr->createEntity("robot","robot.mesh");
node1=mSceneMgr->getRootSceneNode()->createChildSceneNode("robotnode");
node1->attachObject(ent1);
Entity *ent2=mSceneMgr->createEntity("ogrehead","ogreHead.mesh");
SceneNode* node2=mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreheadnode",Vector3(2,0,0));
node2->attachObject(ent2);
}
void createFrameListener()
{
mFrameListener=new CollionFrameListener(mWindow,mCamera,node1,mSceneMgr);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
}; INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
{
CollionApplication app;
app.go();
}
相交查询:
遍历所有的对象,找到一对一对的相交物体(废话呀,相交当然至少两个物体)。
- //创建相交检测
- IntersectionSceneQuery* pISQuery=m_SceneMgr->createIntersectionQuery();
- //执行查询
- IntersectionSceneQueryResult QResult=pISQuery->execute();
- //遍历查询列表找出两个相交的物体
- for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();
- iter != QResult.movables2movables.end();++iter)
- {
- SceneQueryMovableObjectPair pObject=static_cast<SceneQueryMovableObjectPair>(*iter);
- //if(pObject)
- {
- String strFirst=pObject.first->getName();
- String strSecond=pObject.second->getName();
- //下面加入你自己的两个物体相交判断代码,或者简单的用AABB的判断方法,
- }
- }
//创建相交检测
IntersectionSceneQuery* pISQuery=m_SceneMgr->createIntersectionQuery();
//执行查询
IntersectionSceneQueryResult QResult=pISQuery->execute();
//遍历查询列表找出两个相交的物体
for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();
iter != QResult.movables2movables.end();++iter)
{ SceneQueryMovableObjectPair pObject=static_cast<SceneQueryMovableObjectPair>(*iter);
//if(pObject)
{
String strFirst=pObject.first->getName();
String strSecond=pObject.second->getName();
//下面加入你自己的两个物体相交判断代码,或者简单的用AABB的判断方法,
}
}
在Ogre中,可以创建一个查询器,比如球体查询器,AABB查询器,面查询器等。下面我们以最常用的球形查询器为例来说明:
如下面的代码,我们首先创建一个球形查询器,它需要定义一个球体,我们把它的位置,设置为摄像机的位置,半径为10,掩码为第二个参数,默认为-1,
通过掩码,可以把碰撞的物体分成不同的组,比如我们设置球形场景查询器的掩码为0x1,则它只检测和它掩码相同物体的碰撞。该摄像机检测到entity对象后,就把摄像机位置沿摄像机方向,向后移动一个单位,这样会实现碰撞检测,但是摄像机因为向后有个移动,所以会有抖动。
- //创建球形查询器,第二个参数表示掩码,默认情况下为-1
- SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(mCamera->getPosition(),10));
- SceneQueryResult QResult=pQuery->execute();
- for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
- {
- MovableObject* pObject=static_cast<MovableObject*>(*iter);
- if(pObject)
- {
- if(pObject->getMovableType()=="Entity")
- {
- Entity* ent = static_cast<Entity*>(pObject);
- //if(ent->getName()=="Head")
- //{
- // //m_node->setScale(10,10,10);
- // pObject->getParentNode()->scale(0.5,0.5,0.5);
- // break;
- //}
- Ogre::Vector3 v = mCamera->getPosition();
- Ogre::Vector3 d = mCamera->getDirection();
- v = v + d*(-1);
- mCamera->setPosition(v);
- }
- }
- }全部的代码:
//创建球形查询器,第二个参数表示掩码,默认情况下为-1
SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(mCamera->getPosition(),10));
SceneQueryResult QResult=pQuery->execute();
for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
{
MovableObject* pObject=static_cast<MovableObject*>(*iter);
if(pObject)
{
if(pObject->getMovableType()=="Entity")
{
Entity* ent = static_cast<Entity*>(pObject);
//if(ent->getName()=="Head")
//{
// //m_node->setScale(10,10,10);
// pObject->getParentNode()->scale(0.5,0.5,0.5);
// break;
//}
Ogre::Vector3 v = mCamera->getPosition();
Ogre::Vector3 d = mCamera->getDirection();
v = v + d*(-1);
mCamera->setPosition(v); }
}
}全部的代码:
- #include "ExampleApplication.h"
- RaySceneQuery* raySceneQuery = 0;
- // Event handler to add ability to alter curvature
- class TerrainFrameListener : public ExampleFrameListener
- {
- public:
- SceneManager* mSceneMgr;
- TerrainFrameListener(SceneManager *sceneMgr,RenderWindow* win, Camera* cam)
- : ExampleFrameListener(win, cam)
- {
- // Reduce move speed
- mMoveSpeed = 50;
- mSceneMgr = sceneMgr;
- }
- bool frameRenderingQueued(const FrameEvent& evt)
- {
- if( ExampleFrameListener::frameRenderingQueued(evt) == false )
- return false;
- // clamp to terrain
- static Ray updateRay;
- updateRay.setOrigin(mCamera->getPosition());
- updateRay.setDirection(Vector3::NEGATIVE_UNIT_Y);
- raySceneQuery->setRay(updateRay);
- RaySceneQueryResult& qryResult = raySceneQuery->execute();
- RaySceneQueryResult::iterator i = qryResult.begin();
- if (i != qryResult.end() && i->worldFragment)//把摄像机定在地形10个单位高的地方。
- {
- mCamera->setPosition(mCamera->getPosition().x,
- i->worldFragment->singleIntersection.y + 10,
- mCamera->getPosition().z);
- }
- //创建球形查询器,第二个参数表示掩码,默认情况下为-1
- SphereSceneQuery * pQuery=mSceneMgr->createSphereQuery(Sphere(mCamera->getPosition(),10));
- SceneQueryResult QResult=pQuery->execute();
- for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
- {
- MovableObject* pObject=static_cast<MovableObject*>(*iter);
- if(pObject)
- {
- if(pObject->getMovableType()=="Entity")
- {
- Entity* ent = static_cast<Entity*>(pObject);
- //if(ent->getName()=="Head")
- //{
- // //m_node->setScale(10,10,10);
- // pObject->getParentNode()->scale(0.5,0.5,0.5);
- // break;
- //}
- Ogre::Vector3 v = mCamera->getPosition();
- Ogre::Vector3 d = mCamera->getDirection();
- v = v + d*(-1);
- mCamera->setPosition(v);
- }
- }
- }
- return true;
- }
- };
- class TerrainApplication : public ExampleApplication
- {
- public:
- TerrainApplication() {}
- ~TerrainApplication()
- {
- delete raySceneQuery;
- }
- protected:
- virtual void chooseSceneManager(void)
- {
- // Get the SceneManager, in this case a generic one
- mSceneMgr = mRoot->createSceneManager("TerrainSceneManager");
- }
- virtual void createCamera(void)
- {
- // Create the camera
- mCamera = mSceneMgr->createCamera("PlayerCam");
- // Position it at 500 in Z direction
- mCamera->setPosition(Vector3(128,25,128));
- // Look back along -Z
- mCamera->lookAt(Vector3(0,0,-300));
- mCamera->setNearClipDistance( 1 );
- mCamera->setFarClipDistance( 1000 );
- }
- // Just override the mandatory create scene method
- void createScene(void)
- {
- // Set ambient light
- mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
- // Create a light
- Light* l = mSceneMgr->createLight("MainLight");
- // Accept default settings: point light, white diffuse, just set position
- // NB I could attach the light to a SceneNode if I wanted it to move automatically with
- // other objects, but I don't
- l->setPosition(20,80,50);
- // Fog
- // NB it's VERY important to set this before calling setWorldGeometry
- // because the vertex program picked will be different
- ColourValue fadeColour(0.93, 0.86, 0.76);
- mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
- mWindow->getViewport(0)->setBackgroundColour(fadeColour);
- std::string terrain_cfg("terrain.cfg");
- mSceneMgr -> setWorldGeometry( terrain_cfg );
- // Infinite far plane?
- if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
- {
- mCamera->setFarClipDistance(0);
- }
- // Set a nice viewpoint
- mCamera->setPosition(707,2500,528);
- mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
- //mRoot -> showDebugOverlay( true );
- raySceneQuery = mSceneMgr->createRayQuery(
- Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y));//光线的位置和方向,垂直向下
- Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");
- //创建ogre head实体,测试通过射线查询movable来实现摄像机碰撞检测
- SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("ogreHead");
- headNode->attachObject(ogreHead);
- headNode->setPosition(500.0, 100.0, 500.0);
- headNode->scale(Vector3(2,2,2));
- }
- // Create new frame listener
- void createFrameListener(void)
- {
- mFrameListener= new TerrainFrameListener(mSceneMgr,mWindow, mCamera);
- mRoot->addFrameListener(mFrameListener);
- }
- };
Ogre碰撞检测的更多相关文章
- [比较老的文章]三维渲染引擎 OGRE 与 OSG 的比较综述
1 .引言随着计算机可视化.虚拟现实技术的飞速发展,人们对实时真实感渲染以及场景复杂度提出了更高的要求.传统的直接使用底层图形接口如OpenGL.DirectX开发图形应用的模式越来越暴露出开发复杂性 ...
- MOGRE学习笔记(1) - OGRE简介及在vs2010下配置
由于工作需要,花费了一段时间研究OGRE,但是研究的目的是要在vs2010平台下用c#进行MOGRE的开发,不得已才转到MGRE,步骤是首选熟悉MOGRE的一些基础知识,做到在winform下能用MO ...
- 转:关于 OGRE 与 OSG 的简单比较
1 前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(manual).王锐老师等翻译的<Ope ...
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...
- 关于OGRE与OSG的简单比较【转】
关于OGRE与OSG的简单比较 林乃养 lnychina{at}gmail.com 浙江大学CAD&CG实验室 2010年3月27日 1 前言 我曾经细致阅读过OGRE和OSG官方提供的文档, ...
- 关于 OGRE 与 OSG 的简单比较 (转)
关于 OGRE 与 OSG 的简单比较 1 前言 我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有<Pro OGRE 3D Programming>.OGRE自带手册(man ...
- javascript动画系列第三篇——碰撞检测
前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...
- 使用 JavaScript 和 canvas 做精确的像素碰撞检测
原文地址:Pixel accurate collision detection with Javascript and Canvas 译者:nzbin 我正在开发一个需要再次使用碰撞检测的游戏.我通常 ...
- JavaScript动画-碰撞检测
▓▓▓▓▓▓ 大致介绍 碰撞检测是指在页面中有多个元素时,拖拽一个元素会出现碰撞问题,碰撞检测是以模拟拖拽和磁性吸附中的范围限定为基础的 效果:碰撞检测 ▓▓▓▓▓▓ 碰撞检测 先来看看碰撞检测的原理 ...
随机推荐
- Windows7睡眠后自动唤醒
笔者的电脑(Windows7 64位旗舰版)睡眠后,隔段时间后会自动唤醒.经两项配置后,解决了该问题. 1 禁用唤醒定时器 控制面板里进入"电源选项""更改计划设置&qu ...
- html+asp.net上传文件
type="file" 的name以及id一定要写,并且名字相同 http://niunan.iteye.com/blog/479605 <form id="for ...
- 资源 之 4.3 访问Resource(拾壹)
4.3.1 ResourceLoader接口 ResourceLoader接口用于返回Resource对象:其实现可以看作是一个生产Resource的工厂类. public interface Re ...
- css3实现超过两行文字,超出用三个点显示(兼容性不行,仅供学习)
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- php Composer 报ssl证书错误
CA证书下载地址:http://curl.haxx.se/docs/caextract.html 修改php.ini文件 openssl.cafile= D:/wamp/php/verify/cace ...
- Qt之QSequentialAnimationGroup
简述 QSequentialAnimationGroup类提供动画的串行组. QSequentialAnimationGroup是一个串行运行动画的QAnimationGroup,在另一个动画播放结束 ...
- Hadoop-env.sh[翻译]
说明: 某天 ,把hadoop-env.sh的注释看了看 , 感觉受益匪浅,于是想要写一篇告诉大家,文档是最靠谱的,鉴于我的水平有限,只能翻译大概,切勿吐槽,提建议请留言 摘要: 1.这个文件中只有J ...
- 支持SQL Server数据库又支持MongoDB数据库的数据访问设计
网站整体架构建议采用工厂模式 分别包括:数据访问层DAL,数据访问接口层IDAL,工厂层DALFactory,业务逻辑层,显示层这样的架构方式 在WebConfig配置采用何种数据库的数据访问层 &l ...
- chrome 模拟点击
实现进入一个页面后触发一个<a>的点击事件. 由于safari和chrome不支持<a>的click()所以需要对浏览器进行判断 var Sys = {}; var ua ...
- java 中遇到的问题及解决方法
1.经常发现明明导入jar包,还是会报java.lang.NoSuchMethodError和java.lang.NoClassDefFoundError 试试网上的各种方法,包括重新导入jar包.重 ...