Unity中简单实现IK(Generic Inverse Kinematics)算法

1.原理解释:

待补充。。。

2.简单实现Demo:

1.搭建简单场景:

2.实现代码:

算法实现分析:

待补充。。。

主要实现代码如下:

cs 复制代码
 void SolveTwoBoneIK()
 {
     Vector3 targetPosition = target.position;
     Vector3 rootPosition = rootBone.position;

     float targetDistance = Vector3.Distance(rootPosition, targetPosition);
     float chainLength = upperLength + lowerLength;

     if (targetDistance >= chainLength)
     {
         Vector3 direction = (targetPosition - rootPosition).normalized;
         middleBone.position = rootPosition + direction * upperLength;
         endBone.position = rootPosition + direction * chainLength;
         return;
     }

     // 使用余弦定理计算关节角度
     // cos(angle) = (a² + b² - c²) / (2ab)

     float upperSqr = upperLength * upperLength;
     float lowerSqr = lowerLength * lowerLength;
     float targetSqr = targetDistance * targetDistance;

     float upperAngle = Mathf.Acos(
         Mathf.Clamp(
             (upperSqr + targetSqr - lowerSqr) / (2 * upperLength * targetDistance),
             -1f, 1f
         )
     ) * Mathf.Rad2Deg;

     float middleAngle = Mathf.Acos(
         Mathf.Clamp(
             (upperSqr + lowerSqr - targetSqr) / (2 * upperLength * lowerLength),
             -1f, 1f
         )
     ) * Mathf.Rad2Deg;

     Vector3 toBendDirection = Vector3.zero;
     if (poleTarget != null)
     {
         Vector3 toTargetPos = targetPosition - rootPosition;
         Vector3 toPole = poleTarget.position - rootPosition;
         toBendDirection = Vector3.ProjectOnPlane(toPole, toTargetPos).normalized;
     }
     else
     {
         toBendDirection = Vector3.Cross(
             targetPosition - rootPosition,
             Vector3.up
         ).normalized;
     }

     // 5. 应用旋转
     Vector3 toTarget = (targetPosition - rootPosition).normalized;

     Quaternion upperRotation = Quaternion.LookRotation(toTarget, toBendDirection);
     upperRotation *= Quaternion.Euler(-upperAngle, 0, 0);
     rootBone.rotation = Quaternion.Lerp(rootBone.rotation, upperRotation, weight);

     middleBone.position = rootBone.position + rootBone.forward * upperLength;

     Vector3 toEnd = (targetPosition - middleBone.position).normalized;
     middleBone.rotation = Quaternion.Lerp(
         middleBone.rotation,
         Quaternion.LookRotation(toEnd, toBendDirection),
         weight
     );

     endBone.position = Vector3.Lerp(
         endBone.position,
         targetPosition,
         weight
     );
 }

实现结果:

参考链接:

Unity 3D - Generic Inverse Kinematics (IK) - Open Source - Github (youtube.com)

C# Inverse Kinematics in Unity 🎓 (youtube.com)

https://www.youtube.com/watch?v=qqOAzn05fvk

相关推荐
Hello_Pyhx4 小时前
Pavise v3.3.0.8 配置指南:从游戏识别到会话恢复
游戏
探求虚无1 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
johnsong2 天前
Claude Fable 5.2 登顶:65 分、单发做游戏,和一份 $26.54 一单的账单
人工智能·游戏
17岁的勇气2 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船3 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
shadowcz0073 天前
屿北:站在新旧时代交接处,赌一场AI原生无限游戏#Infinite Talk
游戏·ai-native
Martina_03214 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
寂寞的船5 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
java_logo6 天前
Docker 部署 EmulatorJS:轻松搭建浏览器复古游戏平台
游戏·docker·容器·复古游戏·轩辕镜像·emulatorjs·红白机
寂寞的船6 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity