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】计算朝向之间的分解夹角
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。