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】计算朝向之间的分解夹角
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...