예제 #1
0
        //-------------------------------------
        //! @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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }