int IcoSphere::addToVertices(std::list<VertexPair> *target, const Ogre::Vector3 &position, const Ogre::ColourValue &colour, float scale) { Ogre::Matrix4 transform = Ogre::Matrix4::IDENTITY; transform.setTrans(position); transform.setScale(Ogre::Vector3(scale, scale, scale)); for (int i = 0; i < (int)vertices.size(); i++) target->push_back(VertexPair(transform * vertices[i], colour)); return vertices.size(); }
void BoxCenterMovable::getBoundingBoxCenter() { if(object.lock()->hasProperty("bounding box") && object.lock()->hasProperty("position")) { Ogre::AxisAlignedBox aabb = VariantCast<Ogre::AxisAlignedBox>(object.lock()->getProperty("bounding box")); /*Ogre::Vector3 position = VariantCast<Ogre::Vector3>(object.lock()->getProperty("position")); Ogre::Matrix4 matTrans; matTrans.makeTrans( position ); aabb.transformAffine(matTrans);*/ Ogre::Matrix4 transform = Ogre::Matrix4::IDENTITY; Ogre::Matrix3 rot3x3; if (object.lock()->hasProperty("orientation")) { Ogre::Quaternion orientation = VariantCast<Ogre::Quaternion>(object.lock()->getProperty("orientation")); orientation.ToRotationMatrix(rot3x3); } else { rot3x3 = Ogre::Matrix3::IDENTITY; } Ogre::Matrix3 scale3x3; if (object.lock()->hasProperty("scale")) { Ogre::Vector3 scale = VariantCast<Ogre::Vector3>(object.lock()->getProperty("scale")); scale3x3 = Ogre::Matrix3::ZERO; scale3x3[0][0] = scale.x; scale3x3[1][1] = scale.y; scale3x3[2][2] = scale.z; } else { scale3x3 = Ogre::Matrix3::IDENTITY; } transform = rot3x3 * scale3x3; if (object.lock()->hasProperty("position")) { Ogre::Vector3 position = VariantCast<Ogre::Vector3>(object.lock()->getProperty("position")); transform.setTrans(position); } aabb.transformAffine(transform); mCenterPosWC = aabb.getCenter(); } }
// // 根据输入的平移, 旋转, 缩放分量创建出位置变换矩阵. // void FairyEditorFrame::BuildTransformMatrix(Ogre::Matrix4& Matrix, const Ogre::Vector3& position, const Ogre::Quaternion rotate, const Ogre::Vector3 scale) { Ogre::Matrix4 posMatrix; Ogre::Matrix4 scaleMatrix; Ogre::Matrix4 rotateMatrix(rotate); posMatrix = Ogre::Matrix4::IDENTITY; posMatrix.setTrans(position); scaleMatrix = Ogre::Matrix4::IDENTITY; scaleMatrix.setScale(scale); // 最终的变换矩阵. Matrix = posMatrix * rotateMatrix * scaleMatrix; }
bool Oculus::setupOgre(Ogre::SceneManager *sm, Ogre::RenderWindow *win, Ogre::SceneNode *parent) { m_window = win; m_sceneManager = sm; Ogre::LogManager::getSingleton().logMessage("Oculus: Setting up Ogre"); if(parent) m_cameraNode = parent->createChildSceneNode("StereoCameraNode"); else m_cameraNode = sm->getRootSceneNode()->createChildSceneNode("StereoCameraNode"); m_cameras[0] = sm->createCamera("CameraLeft"); m_cameras[1] = sm->createCamera("CameraRight"); Ogre::MaterialPtr matLeft = Ogre::MaterialManager::getSingleton().getByName("Ogre/Compositor/Oculus"); Ogre::MaterialPtr matRight = matLeft->clone("Ogre/Compositor/Oculus/Right"); Ogre::GpuProgramParametersSharedPtr pParamsLeft = matLeft->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); Ogre::GpuProgramParametersSharedPtr pParamsRight = matRight->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); Ogre::Vector4 hmdwarp; if(m_stereoConfig) { hmdwarp = Ogre::Vector4(m_stereoConfig->GetDistortionK(0), m_stereoConfig->GetDistortionK(1), m_stereoConfig->GetDistortionK(2), m_stereoConfig->GetDistortionK(3)); } else { hmdwarp = Ogre::Vector4(g_defaultDistortion[0], g_defaultDistortion[1], g_defaultDistortion[2], g_defaultDistortion[3]); } pParamsLeft->setNamedConstant("HmdWarpParam", hmdwarp); pParamsRight->setNamedConstant("HmdWarpParam", hmdwarp); pParamsLeft->setNamedConstant("LensCentre", 0.5f+(m_stereoConfig->GetProjectionCenterOffset()/2.0f)); pParamsRight->setNamedConstant("LensCentre", 0.5f-(m_stereoConfig->GetProjectionCenterOffset()/2.0f)); Ogre::CompositorPtr comp = Ogre::CompositorManager::getSingleton().getByName("OculusRight"); comp->getTechnique(0)->getOutputTargetPass()->getPass(0)->setMaterialName("Ogre/Compositor/Oculus/Right"); for(int i=0;i<2;++i) { m_cameraNode->attachObject(m_cameras[i]); if(m_stereoConfig) { // Setup cameras. m_cameras[i]->setNearClipDistance(m_stereoConfig->GetEyeToScreenDistance()); m_cameras[i]->setFarClipDistance(g_defaultFarClip); m_cameras[i]->setPosition((i * 2 - 1) * m_stereoConfig->GetIPD() * 0.5f, 0, 0); m_cameras[i]->setAspectRatio(m_stereoConfig->GetAspect()); m_cameras[i]->setFOVy(Ogre::Radian(m_stereoConfig->GetYFOVRadians())); // Oculus requires offset projection, create a custom projection matrix Ogre::Matrix4 proj = Ogre::Matrix4::IDENTITY; float temp = m_stereoConfig->GetProjectionCenterOffset(); proj.setTrans(Ogre::Vector3(-m_stereoConfig->GetProjectionCenterOffset() * (2 * i - 1), 0, 0)); m_cameras[i]->setCustomProjectionMatrix(true, proj * m_cameras[i]->getProjectionMatrix()); } else { m_cameras[i]->setNearClipDistance(g_defaultNearClip); m_cameras[i]->setFarClipDistance(g_defaultFarClip); m_cameras[i]->setPosition((i*2-1) * g_defaultIPD * 0.5f, 0, 0); } m_viewports[i] = win->addViewport(m_cameras[i], i, 0.5f*i, 0, 0.5f, 1.0f); m_viewports[i]->setBackgroundColour(g_defaultViewportColour); m_compositors[i] = Ogre::CompositorManager::getSingleton().addCompositor(m_viewports[i],i==0?"OculusLeft":"OculusRight"); m_compositors[i]->setEnabled(true); } m_ogreReady = true; Ogre::LogManager::getSingleton().logMessage("Oculus: Oculus setup completed successfully"); return true; }