[Unity] 캔디 랩(Candy Wrap) 현상 보정 방법
Unity 2021.3.49f1
Blender 4.3
----
블랜더에서는 트위스트 본이 정상적으로 회전이 먹히는데 유니티에서 제대로 되지 않고 캔디 랩(Candy Wrap) 현상이 생겨서 보정하기 위해 찾아보고 남겨 둠.
아래는 Unity의 RotationConstraint 사용해서 처리 하는 영상이다.
[참조] https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Animations.RotationConstraint.html
Unity - Scripting API: RotationConstraint
Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close
docs.unity3d.com
위 영상에서는 손목 본과 트위스트 본이 엮여있지 않아서 RotationConstraint를 사용가능 하다.
본 구조를 수평적으로 바꿀 수 있으면 위 방식대로 하면 될 것 같다.
지금 프로젝트의 모델은 본 구조가 트위스트 본과 손목 본이 트리구조로 엮여있어서 어쩔 수 없이 아래 스크립트 처럼 위 본에 가중치만큼 더해주고, 아래에서 틀어지지 않게 가중치만큼 다시 빼주고 있다.
그리고 Eular 값을 사용하면서 유니티에서는 - 값의 각도를 넣어도 0 ~ 360도 사이 값으로 보정돼서(예: -10도 == 350도 와 같다.) 오히려 꼬이는 상황이 생겨서
180도 이상을 넘어가게 되면 360도를 빼서 마이너스 각도로 보정해서 계산하도록 했다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 모델 Cnady Wrap 보정 클래스
/// </summary>
public class CandyWrapCorrectionController : MonoBehaviour
{
[SerializeField] private Transform m_trTwistBone; // 트위스트(Twist) 본
[SerializeField] private Transform m_trSourceBone; // 참조(Source) 본
[Range(0f, 1f)]
[SerializeField] private float m_fWeight = 0.5f;
void OnEnable()
{
}
void LateUpdate()
{
if (null == m_trTwistBone || null == m_trSourceBone)
return;
// 참조 본 회전값 가져오기
float fY = m_trSourceBone.localRotation.eulerAngles.y;
if (180f <= fY)
{
fY -= 360f;
}
// 가중치 적용(Default : 0.5f)
fY *= m_fWeight;
// 트위스트 본에 적용 (필요시 축 제한)
m_trTwistBone.localRotation = Quaternion.Euler(m_trTwistBone.localRotation.eulerAngles.x,
m_trTwistBone.localRotation.eulerAngles.y + fY,
m_trTwistBone.localRotation.eulerAngles.z);
// 참조 본 보정
m_trSourceBone.localRotation = Quaternion.Euler(m_trSourceBone.localRotation.eulerAngles.x,
fY,
m_trSourceBone.localRotation.eulerAngles.z);
}
}
더 테스트는 해봐야겠지만 일단은 예상한대로 작동은 하는 것 같다.
[도움 및 출처] 삼님
'Unity3D > Script' 카테고리의 다른 글
[펌] OcclusionCulling2D (0) | 2024.03.14 |
---|---|
[펌] GameQualitySettings (0) | 2024.01.19 |
[최적화] Automatic quality settings (0) | 2024.01.19 |
[ChatGPT] Multi-Key Dictionary in Unity? (0) | 2023.08.07 |
[Build] 빌드 시, Builtin 되는 AssetBundle 중 현재 Platform의 AssetBundle만 빌트인 되도록 하기 (0) | 2023.01.18 |