//------------------------------------- //! @name MCBaseCamera 仮想関数 //@{ /// <summary> /// 視錐台内に点があるかの衝突判定 /// </summary> /// <param name="point">点の位置</param> /// <param name="pZ">オブジェクトの位置からカメラのEye位置の値からZ値を取得</param> /// <returns>錐台内に点がある場合はtrueを返す</returns> public override bool CollisionPoint(MCVector3 point, out float z) { MCVector3 vOP = point - m_eye; // vOP と前方ベクトルの内積 z = vOP.Dot(m_viewForward); if (z < m_nearPlane || m_farPlane < z) { return(false); } // vOP と右方ベクトルの内積 float r = vOP.Dot(m_viewRight); float rLimit = m_rightFactor * z; if (r < -rLimit || rLimit < r) { return(false); } // vOP と上方ベクトルの内積 float u = vOP.Dot(m_viewUp); float uLimit = m_upFactor * z; if (u < -uLimit || uLimit < u) { return(false); } // ここまで来れば点は錐台にある return(true); }
/// <summary> /// 視錐台内に球体があるかの衝突判定 /// </summary> /// <param name="sphere"></param> /// <param name="pZ"></param> /// <returns></returns> public override bool CollisionSphere(Sphere sphere, out float z) { MCVector3 vOP = sphere.c - m_eye; // vOP と前方ベクトルの内積 z = vOP.Dot(m_viewForward);// / m_vViewForward.Length(); if (z < m_nearPlane - sphere.r || m_farPlane + sphere.r < z) { return(false); } // 最適化されていないが理解しやすい float r = vOP.Dot(m_viewRight);// / m_vViewRight.Length(); float rLimit = m_rightFactor * (z); float rTop = rLimit + sphere.r; if (r < -rTop || rTop < r) { return(false); } // 最適化 ( 減算処理を取り除いた ) float u = vOP.Dot(m_viewUp);// / m_vViewUp.Length(); float uLimit = m_upFactor * (z); float uTop = uLimit + sphere.r; if (u < -uTop || uTop < u) { return(false); } return(true); }
/// <summary> /// 視錐台内から 指定した点(pvPoint)から Z値を取得する /// </summary> /// <param name="point">点の位置</param> /// <param name="z">オブジェクトの位置からカメラのEye位置の値からZ値を取得するポインタ</param> public void GetZValue(MCVector3 point, out float z) { MCVector3 vOP = point - m_eye; // vOP と前方ベクトルの内積 z = vOP.Dot(m_viewForward); }