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); } }
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 } }