Exemple #1
0
	void RenderBoxScene::updateViewport()
	{
		// пр?нуле вылетает
		if ((mCanvas->getWidth() <= 1) || (mCanvas->getHeight() <= 1))
			return;

		if ((nullptr != mEntity) && (nullptr != mCamera))
		{
			// не ¤сн? нужн?ли раст¤гивать камеру, установленну?юзером
			mCamera->setAspectRatio((float)mCanvas->getWidth() / (float)mCanvas->getHeight());

			// вычисл¤ем рассто¤ни? чтоб?бы?виде?весь объект
			Ogre::AxisAlignedBox box;

			box.merge(mEntity->getBoundingBox().getMinimum() + mEntity->getParentSceneNode()->_getDerivedPosition());
			box.merge(mEntity->getBoundingBox().getMaximum() + mEntity->getParentSceneNode()->_getDerivedPosition());

			if (box.isNull()) return;

			Ogre::Vector3 vec = box.getSize();

			float width = sqrt(vec.x*vec.x + vec.z*vec.z); // само?длинно?- диагонал?(если крутит?модель)
			float len2 = width / mCamera->getAspectRatio();
			float height = vec.y;
			float len1 = height;
			if (len1 < len2) len1 = len2;
			len1 /= 0.86; // [sqrt(3)/2] for 60 degrees field of view
			// цент?объект?по вертикал?+ отъехать та? чтоб?влезла ближ?¤ гран?BoundingBox'?+ чуть ввер??ещ?наза?дл¤ красот?
			Ogre::Vector3 result = box.getCenter() + Ogre::Vector3(0, 0, vec.z/2 + len1) + Ogre::Vector3(0, height*0.1, len1*0.2);
			Ogre::Vector3 look = Ogre::Vector3(0, box.getCenter().y /*+ box.getCenter().y * (1-mCurrentScale)*/, 0);

			mCameraNode->setPosition(result);
			mCameraNode->lookAt(look, Ogre::Node::TS_WORLD);
		}
	}
Exemple #2
0
void SimpleRenderContext::repositionCamera()
{
    mEntityNode->_update(true, true);
    Ogre::AxisAlignedBox bbox = mEntityNode->_getWorldAABB();
    if (mCameraPositionMode == CPM_OBJECTCENTER) {
        if (!bbox.isInfinite() && !bbox.isNull()) {
            Ogre::Vector3 center = bbox.getCenter();
            Ogre::Vector3 localCenter = center - mRootNode->getPosition();
            mCameraNode->setPosition(localCenter);
        }
    } else if (mCameraPositionMode == CPM_WORLDCENTER) {
        mCameraNode->setPosition(Ogre::Vector3::ZERO);
    } else {
    }
}
//check startline collision
void
World::updateLaps(){

	bool collision;
	for(int i =0; i<carList.size(); i++){
		Ogre::AxisAlignedBox aab = virtualStartLineNode->_getWorldAABB().intersection((carList[i]->getSceneNode())->_getWorldAABB());
		collision = (!aab.isNull());
		
		Ogre::LogManager::getSingleton().logMessage("lapCollision: " + Ogre::StringConverter::toString(carList[i]->lapCollision) );
		Ogre::LogManager::getSingleton().logMessage("collision boy: " + Ogre::StringConverter::toString(collision) );
		Ogre::LogManager::getSingleton().logMessage("Track number: " + Ogre::StringConverter::toString(carList[i]->getTrackNum(level)) );
		Ogre::LogManager::getSingleton().logMessage("Car id: " + Ogre::StringConverter::toString(carList[i]->carId) );
		Ogre::LogManager::getSingleton().logMessage("Level : " + Ogre::StringConverter::toString(level) );
		if(level == 0){
			if(collision && carList[i]-> mForward && !carList[i]->lapCollision && carList[i]->getTrackNum(level) == 2){
			carList[i]->lapCollision = true;
			
			carList[i]->mCurrentLap = carList[i]->mCurrentLap + 1;
			if(carList[i]->mCurrentLap == 3){
				mGameOver = true;
				carList[i]->mWinner = true;
			}
			
			}
			if(carList[i]->getTrackNum(level) != 2 && carList[i]->lapCollision == true){
				carList[i]->lapCollision = false;
			}
		} else {
			if(collision && carList[i]-> mForward && !carList[i]->lapCollision && carList[i]->getTrackNum(level) == 5){
			carList[i]->lapCollision = true;
			
			carList[i]->mCurrentLap = carList[i]->mCurrentLap + 1;
			if(carList[i]->mCurrentLap == 3){
				mGameOver = true;
				carList[i]->mWinner = true;
			}
			
			}
			if(carList[i]->getTrackNum(level) != 5 && carList[i]->lapCollision == true){
				carList[i]->lapCollision = false;
			}
		}
		
	}

	
}
	void RenderBoxWrap::updateViewport()
	{
		// при нуле вылетает
		if ((mRenderBox->getWidth() <= 1) || (mRenderBox->getHeight() <= 1) ) return;

		if ((nullptr != mEntity) && (nullptr != mRttCam)) {
			// не ¤сно, нужно ли раст¤гивать камеру, установленную юзером
			mRttCam->setAspectRatio((float)mRenderBox->getWidth() / (float)mRenderBox->getHeight());

			//System::Console::WriteLine("Width {0}, Height {1}", getWidth(), getHeight());

			// вычисл¤ем рассто¤ние, чтобы был виден весь объект
			Ogre::AxisAlignedBox box;// = mNode->_getWorldAABB();//mEntity->getBoundingBox();

			VectorEntity::iterator iter = mVectorEntity.begin();

			while (iter != mVectorEntity.end())
			{
				box.merge((*iter)->getBoundingBox().getMinimum() + (*iter)->getParentSceneNode()->_getDerivedPosition());
				box.merge((*iter)->getBoundingBox().getMaximum() + (*iter)->getParentSceneNode()->_getDerivedPosition());
				iter++;
			}

			if (box.isNull()) return;

			//box.scale(Ogre::Vector3(1.41f,1.41f,1.41f));

			//System::Console::WriteLine("Minimum({0}), Maximum({1})",
			//	gcnew System::String(Ogre::StringConverter::toString(box.getMinimum()).c_str()),
			//	gcnew System::String(Ogre::StringConverter::toString(box.getMaximum()).c_str()));

			//box.getCenter();
			Ogre::Vector3 vec = box.getSize();

			// коррекци¤ под левосторонюю систему координат с осью Z направленную вверх
			#ifdef LEFT_HANDED_CS_UP_Z

				float width = sqrt(vec.x*vec.x + vec.y*vec.y); // самое длинное - диагональ (если крутить модель)
				float len2 = width; // mRttCam->getAspectRatio();
				float height = vec.z;
				float len1 = height;
				if (len1 < len2) len1 = len2;
				len1 /= 0.86; // [sqrt(3)/2] for 60 degrees field of view
				// центр объекта по вертикали + отъехать так, чтобы влезла ближн¤¤ грань BoundingBox'а + чуть вверх и еще назад дл¤ красоты
				Ogre::Vector3 result = box.getCenter() - Ogre::Vector3(vec.y/2 + len1, 0, 0) - Ogre::Vector3(len1*0.2, 0, -height*0.1);
				result.x *= mCurrentScale;
				mCamNode->setPosition(result);

				Ogre::Vector3 x = Ogre::Vector3(0, 0, box.getCenter().z + box.getCenter().z * (1-mCurrentScale)) - mCamNode->getPosition();
				Ogre::Vector3 y = Ogre::Vector3(Ogre::Vector3::UNIT_Z).crossProduct(x);
				Ogre::Vector3 z = x.crossProduct(y);
				mCamNode->setOrientation(Ogre::Quaternion(
					x.normalisedCopy(),
					y.normalisedCopy(),
					z.normalisedCopy()));

			#else

				float width = sqrt(vec.x*vec.x + vec.z*vec.z); // самое длинное - диагональ (если крутить модель)
				float len2 = width / mRttCam->getAspectRatio();
				float height = vec.y;
				float len1 = height;
				if (len1 < len2) len1 = len2;
				len1 /= 0.86; // [sqrt(3)/2] for 60 degrees field of view
				// центр объекта по вертикали + отъехать так, чтобы влезла ближн¤¤ грань BoundingBox'а + чуть вверх и еще назад дл¤ красоты
				Ogre::Vector3 result = box.getCenter() + Ogre::Vector3(0, 0, vec.z/2 + len1) + Ogre::Vector3(0, height*0.1, len1*0.2);
				result.z *= mCurrentScale;
				Ogre::Vector3 look = Ogre::Vector3(0, box.getCenter().y /*+ box.getCenter().y * (1-mCurrentScale)*/, 0);

				mCamNode->setPosition(result);
				mCamNode->lookAt(look, Ogre::Node::TS_WORLD);

			#endif
		}
	}