Unity IK로 바닥의 모양에 맞춰 발을 땅에 대세요.
컨디션
Unity2017.3.1p4
Windows10
창고.
다음 링크
Asset/Scripts/FootIK.cs
창고를 공개하고 있습니다.
How to
다음 링크
Asset/Scripts/FootIK.cs
창고를 공개하고 있습니다.
How to
결실
왼쪽에는 UnityChan이 일반이고 오른쪽에는 FootIK가 유효합니다.
출처 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FootIK : MonoBehaviour {
[SerializeField]
private Vector3 offset = new Vector3(0,0.1f,0);
[SerializeField]
private float rayRange = 1f;
[SerializeField]
private string fieldLayerName = "Field";
private Animator animator;
private Transform _transform;
public new Transform transform {
get
{
if (_transform == null)
{
_transform = gameObject.transform;
}
return _transform;
}
}
void Start()
{
animator = GetComponent<Animator>();
}
void OnAnimatorIK()
{
//右足
var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot), -transform.up);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask(fieldLayerName)))
{
Quaternion rightRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
//weightはとりあえず1で固定しておく(0f:元のアニメーション,1f:IKを完全に反映)
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
animator.SetIKPosition(AvatarIKGoal.RightFoot, hit.point + offset);
animator.SetIKRotation(AvatarIKGoal.RightFoot, rightRotation);
}
//左足
ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up);
if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask(fieldLayerName)))
{
Quaternion leftRotaion = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
animator.SetIKPosition(AvatarIKGoal.LeftFoot, hit.point + offset);
animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftRotaion);
}
}
}
하면, 만약, 만약...
3D 모델의 FBX를 선택하고 Rig 태그의 Configure 를 클릭합니다.
매핑이 잘 되고 있는지 확인하는 게 좋을 것 같아요.
Reference
이 문제에 관하여(Unity IK로 바닥의 모양에 맞춰 발을 땅에 대세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/JGS_Developer/items/9798ab28a5e1d82c6ff4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FootIK : MonoBehaviour {
[SerializeField]
private Vector3 offset = new Vector3(0,0.1f,0);
[SerializeField]
private float rayRange = 1f;
[SerializeField]
private string fieldLayerName = "Field";
private Animator animator;
private Transform _transform;
public new Transform transform {
get
{
if (_transform == null)
{
_transform = gameObject.transform;
}
return _transform;
}
}
void Start()
{
animator = GetComponent<Animator>();
}
void OnAnimatorIK()
{
//右足
var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot), -transform.up);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask(fieldLayerName)))
{
Quaternion rightRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
//weightはとりあえず1で固定しておく(0f:元のアニメーション,1f:IKを完全に反映)
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
animator.SetIKPosition(AvatarIKGoal.RightFoot, hit.point + offset);
animator.SetIKRotation(AvatarIKGoal.RightFoot, rightRotation);
}
//左足
ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up);
if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask(fieldLayerName)))
{
Quaternion leftRotaion = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
animator.SetIKPosition(AvatarIKGoal.LeftFoot, hit.point + offset);
animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftRotaion);
}
}
}
하면, 만약, 만약...
3D 모델의 FBX를 선택하고 Rig 태그의 Configure 를 클릭합니다.
매핑이 잘 되고 있는지 확인하는 게 좋을 것 같아요.
Reference
이 문제에 관하여(Unity IK로 바닥의 모양에 맞춰 발을 땅에 대세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/JGS_Developer/items/9798ab28a5e1d82c6ff4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Unity IK로 바닥의 모양에 맞춰 발을 땅에 대세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/JGS_Developer/items/9798ab28a5e1d82c6ff4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)