2022-09-26【Math】计算朝向之间的分解夹角

    private void CalculateLockAngleInternal(Vector3 targetPos, Vector3 myPos, Vector3 myForward,
        out Fix64 yawAngleDif, out Fix64 pitchAngleDif)
    {
        // 计算水平角度差值
        // 角色正朝向
        Vector3 targetYawDirection = targetPos - myPos;
        targetYawDirection.Y = 0;

        var fwd = new Vector3(myForward.X, 0, myForward.Z);
        yawAngleDif = BEPhyHelper.Angle(fwd, targetYawDirection);
        // 目标在角色左侧,需要向左转
        if (Vector3.Cross(fwd, targetYawDirection).Y < 0)
        {
            yawAngleDif *= -1;
        }

        // 计算竖直角度差值
        myForward = BEPhyHelper.TransformDirection(myForward, BEPhyHelper.Euler(0, yawAngleDif, 0));

        Vector3 virtualEyePos = m_Cm.CameraAnchor.PosLogic; //模拟的眼睛位置,根据眼睛位置,计算目标pitch值   todo:不要依赖相机位置,依赖自身位置和相机偏差量做计算

        Vector3 targetPitchDirection = targetPos - virtualEyePos;
        Fix64 targetPitch = BEPhyHelper.Angle(myForward, targetPitchDirection);

        // 目标在角色上方
        if (Vector3.Cross(myForward, Vector3.Cross(myForward, targetPitchDirection)).Y < 0)
        {
            targetPitch *= -1;
        }

        // 限制最大最小角度
        //targetPitch = BEPhyHelper.ClampAngle(targetPitch, cc.input.cameraRotate.MinPitchLimit, cc.input.cameraRotate.MaxPitchLimit);

        pitchAngleDif = cc.input.cameraRotate.Pitch - targetPitch;
    }

你可能感兴趣的:(2022-09-26【Math】计算朝向之间的分解夹角)