You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中混合树实现鱼竿弯曲的问题排查与修正方案

鱼竿弯曲混合树参数的正确设置方案

原代码的核心问题是直接在世界空间计算投影与角度符号,当鱼竿在场景中旋转(抬头、转向等)时,世界坐标系与鱼竿本地坐标系脱节,导致参数在全角度场景下失效。以下是稳定可靠的实现方案:

步骤1:将拉力向量转换到鱼竿本地坐标系

先计算从竿尖到鱼饵的拉力向量,再转换到鱼竿自身的本地空间——这一步能彻底消除场景角度对计算的影响:

// 计算竿尖到鱼饵的世界空间向量
Vector3 worldPullVec = _baitHandler.transform.position - _context.rodTip.position;
// 转换为鱼竿本地空间的向量,此时所有计算都基于鱼竿自身朝向
Vector3 localPullVec = _context.rod.transform.InverseTransformDirection(worldPullVec);

步骤2:计算带符号的弯曲角度(混合树参数)

基于本地空间向量,分别计算左右(X轴)和上下(Y轴)的弯曲角度,确保符号与动画片段的方向一致:

// 1. 左右弯曲参数(directionX):计算本地XY平面内,拉力与鱼竿Up的夹角(绕Forward轴)
Vector3 xyPlaneVec = Vector3.ProjectOnPlane(localPullVec, Vector3.forward);
float angleX = Mathf.Atan2(xyPlaneVec.x, xyPlaneVec.y) * Mathf.Rad2Deg;

// 2. 上下弯曲参数(directionY):计算本地YZ平面内,拉力与鱼竿Up的夹角(绕Right轴)
Vector3 yzPlaneVec = Vector3.ProjectOnPlane(localPullVec, Vector3.right);
float angleY = Mathf.Atan2(yzPlaneVec.z, yzPlaneVec.y) * Mathf.Rad2Deg;

步骤3:归一化参数适配混合树

混合树的参数通常需要映射到[-1, 1]或[0, 1]的范围,根据你的动画片段覆盖的角度范围调整。比如假设鱼竿最大弯曲角度为±90度:

// 归一化到[-1, 1]区间
float normalizedDirX = Mathf.Clamp(angleX / 90f, -1f, 1f);
float normalizedDirY = Mathf.Clamp(angleY / 90f, -1f, 1f);

// 赋值给Animator的混合树参数
_animator.SetFloat("directionX", normalizedDirX);
_animator.SetFloat("directionY", normalizedDirY);

关键验证点

  • 确保动画片段是基于鱼竿本地坐标系制作的:比如directionX为正时对应鱼竿右侧弯曲,负时对应左侧;directionY为正时对应鱼竿向上弯,负时对应向下弯。如果方向相反,直接在参数前加负号即可。
  • 测试鱼竿在场景中任意旋转(比如平躺、侧转)的情况,确认参数输出与动画表现一致。

内容的提问来源于stack exchange,提问作者ATHellboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:32:18