bool Panel::injectMouseMoved(const Ogre::Ray& ray) { Ogre::Matrix4 transform; transform.makeTransform(mNode->getPosition(), mNode->getScale(), mNode->getOrientation()); Ogre::AxisAlignedBox aabb = mScreenRenderable->getBoundingBox(); aabb.transform(transform); pair<bool, Ogre::Real> result = Ogre::Math::intersects(ray, aabb); if (result.first == false) { unOverAllElements(); return false; } Ogre::Vector3 a,b,c,d; Ogre::Vector2 halfSize = (mSize/100) * 0.5f; a = transform * Ogre::Vector3(-halfSize.x,-halfSize.y,0); b = transform * Ogre::Vector3( halfSize.x,-halfSize.y,0); c = transform * Ogre::Vector3(-halfSize.x, halfSize.y,0); d = transform * Ogre::Vector3( halfSize.x, halfSize.y,0); result = Ogre::Math::intersects(ray, c, b, a); if (result.first == false) result = Ogre::Math::intersects(ray, c, d, b); if (result.first == false) { unOverAllElements(); return false; } if (result.second > mDistanceFromPanelToInteractWith) { unOverAllElements(); return false; } Ogre::Vector3 hitPos = (ray.getOrigin() + (ray.getDirection() * result.second)); Ogre::Vector3 localPos = transform.inverse() * hitPos; localPos.x += halfSize.x; localPos.y -= halfSize.y; localPos.x *= 100; localPos.y *= 100; // Cursor clip localPos.x = Ogre::Math::Clamp<Ogre::Real>(localPos.x, 0, mSize.x - 10); localPos.y = Ogre::Math::Clamp<Ogre::Real>(-localPos.y, 0, mSize.y - 18); mInternalMousePos = Ogre::Vector2(localPos.x, localPos.y); mMousePointer->position(mInternalMousePos); // Let's actualize the "over" for each elements for (size_t i=0; i < mPanelElements.size(); i++) mPanelElements[i]->isOver(mInternalMousePos); return true; }
// ---------------------------------------------------------------- // gets the location of the specified eye // ---------------------------------------------------------------- Ogre::Matrix4 OgreOpenVR::getHMDMatrixPoseEye(vr::Hmd_Eye nEye) { if (!m_pHMD) return Ogre::Matrix4(); vr::HmdMatrix34_t matEye = m_pHMD->GetEyeToHeadTransform(nEye); Ogre::Matrix4 eyeTransform = convertSteamVRMatrixToOgreMatrix4(matEye); return eyeTransform.inverse(); }
Button* check(const Ogre::Ray& ray, bool& isOver) { isOver = false; Ogre::Matrix4 transform; transform.makeTransform(mNode->getPosition(), mNode->getScale(), mNode->getOrientation()); Ogre::AxisAlignedBox aabb = mScreen->getBoundingBox(); aabb.transform(transform); std::pair<bool, Ogre::Real> result = Ogre::Math::intersects(ray, aabb); if (result.first == false) return 0; Ogre::Vector3 a,b,c,d; Ogre::Vector2 halfSize = mSize * 0.5f; a = transform * Ogre::Vector3(-halfSize.x,-halfSize.y,0); b = transform * Ogre::Vector3( halfSize.x,-halfSize.y,0); c = transform * Ogre::Vector3(-halfSize.x, halfSize.y,0); d = transform * Ogre::Vector3( halfSize.x, halfSize.y,0); result = Ogre::Math::intersects(ray, c, b, a); if (result.first == false) result = Ogre::Math::intersects(ray, c, d, b); if (result.first == false) return 0; if (result.second > 6.0f) return 0; isOver = true; Ogre::Vector3 hitPos = ( ray.getOrigin() + (ray.getDirection() * result.second) ); Ogre::Vector3 localPos = transform.inverse() * hitPos; localPos.x += halfSize.x; localPos.y -= halfSize.y; localPos.x *= 100; localPos.y *= 100; // Cursor clip localPos.x = Ogre::Math::Clamp<Ogre::Real>(localPos.x, 0, (mSize.x * 100) - 10); localPos.y = Ogre::Math::Clamp<Ogre::Real>(-localPos.y, 0, (mSize.y * 100) - 18); mMousePointer->position(localPos.x, localPos.y); for (size_t i=0;i < mButtons.size();i++) { if (mButtons[i]->isOver(mMousePointer->position())) return mButtons[i]; } return 0; }
void PlayerCameraOgre::onRightButtonPressed() { if (!mRightButtonPressedLastFrame) mMousePosLastFrame = mMouse->getPosition(); mp::Vector2i diff = mMouse->getPosition() - mMousePosLastFrame; const mp::Vector3f &playerPos = mPlayer->model()->getPosition(); Ogre::Vector3 pivotPoint(playerPos.getX(), playerPos.getY() + mPivotHeight, playerPos.getZ()); float yaw = (float)diff.getX() * CAMERA_SPEED; float pitch = (float)-diff.getY() * CAMERA_SPEED; Ogre::Quaternion yawQuat; yawQuat.FromAngleAxis(Ogre::Radian(yaw), Ogre::Vector3::UNIT_Y); Ogre::Matrix3 yawMat; yawQuat.ToRotationMatrix(yawMat); Ogre::Vector3 pivotToPos = Ogre::Vector3(mRealPosition.getX(), mRealPosition.getY(), mRealPosition.getZ()) - pivotPoint; Ogre::Matrix4 pos(1, 0, 0, pivotToPos.x, 0, 1, 0, pivotToPos.y, 0, 0, 1, pivotToPos.z, 0, 0, 0, 1); Ogre::Vector3 xz(pivotToPos.x, 0, pivotToPos.z); Ogre::Vector3 norm(-xz.z, 0, xz.x); Ogre::Quaternion pitchQuat; pitchQuat.FromAngleAxis(Ogre::Radian(pitch), norm); Ogre::Matrix3 pitchMat; pitchQuat.ToRotationMatrix(pitchMat); Ogre::Matrix4 toPivot(1, 0, 0, pivotPoint.x, 0, 1, 0, pivotPoint.y, 0, 0, 1, pivotPoint.z, 0, 0, 0, 1); Ogre::Matrix4 newPosMat = pos * pitchMat * yawMat * toPivot; newPosMat = newPosMat.inverse(); Ogre::Vector3 newPos = newPosMat.getTrans(); mRealPosition.set(-newPos.x, -newPos.y, -newPos.z); setPosition(mRealPosition); lookAt(pivotPoint.x, pivotPoint.y, pivotPoint.z); adjustDistance(); mMousePosLastFrame = mMouse->getPosition(); mRightButtonPressedLastFrame = true; }
float3 EC_WaterPlane::GetPointOnPlane(const float3 &point) const { if (node_ == 0) return float3::nan; Ogre::Quaternion rot = node_->_getDerivedOrientation(); Ogre::Vector3 trans = node_->_getDerivedPosition(); Ogre::Vector3 scale = node_->_getDerivedScale(); Ogre::Matrix4 worldTM; worldTM.makeTransform(trans, scale, rot); // In Ogre 1.7.1 we could simply use the following line, but since we're also supporting Ogre 1.6.4 for now, the above // lines are used instead, which work in both. // Ogre::Matrix4 worldTM = node_->_getFullTransform(); // local->world. Ogre::Matrix4 inv = worldTM.inverse(); // world->local Ogre::Vector4 local = inv * Ogre::Vector4(point.x, point.y, point.z, 1.f); local.y = 0; Ogre::Vector4 world = worldTM * local; return float3(world.x, world.y, world.z); }
//----------------------------------------------------------------------------// void OgreRenderTarget::unprojectPoint(const GeometryBuffer& buff, const Vector2& p_in, Vector2& p_out) const { if (!d_matrixValid) updateMatrix(); const OgreGeometryBuffer& gb = static_cast<const OgreGeometryBuffer&>(buff); const Ogre::Real midx = d_area.getWidth() * 0.5f; const Ogre::Real midy = d_area.getHeight() * 0.5f; // viewport matrix const Ogre::Matrix4 vpmat( midx, 0, 0, d_area.d_left + midx, 0, -midy, 0, d_area.d_top + midy, 0, 0, 1, 0, 0, 0, 0, 1 ); // matrices used for projecting and unprojecting points const Ogre::Matrix4 proj(gb.getMatrix() * d_matrix * vpmat); const Ogre::Matrix4 unproj(proj.inverse()); Ogre::Vector3 in; // unproject the ends of the ray in.x = midx; in.y = midy; in.z = -d_viewDistance; const Ogre::Vector3 r1(unproj * in); in.x = p_in.d_x; in.y = p_in.d_y; in.z = 0; // calculate vector of picking ray const Ogre::Vector3 rv(r1 - unproj * in); // project points to orientate them with GeometryBuffer plane in.x = 0.0; in.y = 0.0; const Ogre::Vector3 p1(proj * in); in.x = 1.0; in.y = 0.0; const Ogre::Vector3 p2(proj * in); in.x = 0.0; in.y = 1.0; const Ogre::Vector3 p3(proj * in); // calculate the plane normal const Ogre::Vector3 pn((p2 - p1).crossProduct(p3 - p1)); // calculate distance from origin const Ogre::Real plen = pn.length(); const Ogre::Real dist = -(p1.x * (pn.x / plen) + p1.y * (pn.y / plen) + p1.z * (pn.z / plen)); // calculate intersection of ray and plane const Ogre::Real pn_dot_rv = pn.dotProduct(rv); const Ogre::Real tmp = pn_dot_rv != 0.0 ? (pn.dotProduct(r1) + dist) / pn_dot_rv : 0.0; p_out.d_x = static_cast<float>(r1.x - rv.x * tmp); p_out.d_y = static_cast<float>(r1.y - rv.y * tmp); }
void BoneAim::update(float time){ if (mBone == NULL){ mBone = mGo->getEntity()->getSkeleton()->getBone(mBoneName); mTarget = Level::getSingleton()->getCurrentSegment()->getObjectByName(mTargetName); if (mTarget == NULL){ throw("No such object : "+mTargetName); } } //Ogre::Entity* entity; //mTarget = Level::getSingleton()->getPlayerShip(); Ogre::Matrix4 matrixA = mGo->getNode()->_getFullTransform()*mBone->_getFullTransform(); Ogre::Matrix4 matrix = matrixA; Ogre::Matrix4 transform = matrix.inverse()*mTarget->getNode()->_getFullTransform(); Ogre::Vector3 v = transform.getTrans(); /*Util::Log( "Bone:"+ts(matrixA.getTrans())+ " Ship:"+ts(mTarget->getNode()->_getFullTransform().getTrans())+ " Diff:"+ts(v) ,0 );*/ //targetMatrix = Ogre::Matrix4::IDENTITY; //matrix.setTrans(mTarget->getNode()->_getFullTransform()); //Ogre::Quaternion q = transform.extractQuaternion(); Ogre::Quaternion q; switch (mAxis){ case AXIS_X: q.FromAngleAxis(Ogre::Math::ATan2(v.y, v.z),Ogre::Vector3(-1,0,0)); break; case AXIS_Y: q.FromAngleAxis(Ogre::Math::ATan2(v.x, v.z),Ogre::Vector3(0,1,0)); break; case AXIS_Z: q.FromAngleAxis(Ogre::Math::ATan2(v.x, v.y),Ogre::Vector3(0,0,1)); break; case AXIS_ALL: //q.FromAngleAxis(Ogre::Radian(0),v); q = transform.extractQuaternion();// - matrixA.extractQuaternion(); //q = transform.extractQuaternion() - matrixA.extractQuaternion(); break; } mBone->setManuallyControlled(true); //mBone->setOrientation(q); float slerp = time*mStrength; if (slerp > 1){ slerp = 1; } Ogre::Quaternion r = Quaternion::Slerp(slerp, Ogre::Quaternion::IDENTITY, q); //Level::getSingleton()->getTimeDelta() mBone->rotate(r); /*mBone->yaw(Ogre::Radian(Ogre::Math::RangeRandom(-Math::PI, Math::PI))); mBone->pitch(Ogre::Radian(Ogre::Math::RangeRandom(-Math::PI, Math::PI))); mBone->roll(Ogre::Radian(Ogre::Math::RangeRandom(-Math::PI, Math::PI)));*/ //mBone->_update(true, true); Parent::update(time); //mSpeed += .6*time; //mGo->getNode()->translate(0, 0-mSpeed, 0);*/ }