/// <summary>
        /// Bake를 위해서 BoneMatrix를 초기화한다.
        /// </summary>
        /// <param name="isRecursive"></param>
        public void ResetBoneMatrixForBake(bool isRecursive)
        {
            _deltaPos   = Vector2.zero;
            _deltaAngle = 0.0f;
            _deltaScale = Vector2.one;

            _localMatrix.SetIdentity();
            _worldMatrix.SetIdentity();

            _worldMatrix_NonModified.SetIdentity();
            _vertWorld2BoneModWorldMatrix.SetIdentity();


            if (_parentBone == null)
            {
                _worldMatrix.SetMatrix(_defaultMatrix);
                _worldMatrix.Add(_localMatrix);

                _worldMatrix_NonModified.SetMatrix(_defaultMatrix);                //Local Matrix 없이 Default만 지정


                if (_parentOptTransform != null)
                {
                    //Debug.Log("SetParentOptTransform Matrix : [" + _parentOptTransform.transform.name + "] : " + _parentOptTransform._matrix_TFResult_World.Scale2);
                    //Non Modified도 동일하게 적용
                    //렌더유닛의 WorldMatrix를 넣어주자
                    _worldMatrix.RMultiply(_parentOptTransform._matrix_TFResult_WorldWithoutMod);                    //RenderUnit의 WorldMatrixWrap의 Opt 버전


                    _worldMatrix_NonModified.RMultiply(_parentOptTransform._matrix_TFResult_WorldWithoutMod);
                }
            }
            else
            {
                _worldMatrix.SetMatrix(_defaultMatrix);
                _worldMatrix.Add(_localMatrix);
                _worldMatrix.RMultiply(_parentBone._worldMatrix_NonModified);

                _worldMatrix_NonModified.SetMatrix(_defaultMatrix);                //Local Matrix 없이 Default만 지정
                _worldMatrix_NonModified.RMultiply(_parentBone._worldMatrix_NonModified);
            }

            _worldMatrix.SetMatrix(_worldMatrix_NonModified);

            _vertWorld2BoneModWorldMatrix  = _worldMatrix_NonModified.MtrxToSpace;
            _vertWorld2BoneModWorldMatrix *= _worldMatrix_NonModified.MtrxToLowerSpace;



            //Debug.Log("Reset Bone Matrix [" + this.name + "]");
            //Debug.Log("World Matrix [ " + _worldMatrix.ToString() + "]");

            if (isRecursive)
            {
                if (_childBones != null && _childBones.Length > 0)
                {
                    for (int i = 0; i < _childBones.Length; i++)
                    {
                        _childBones[i].ResetBoneMatrixForBake(true);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 4) World Matrix를 만든다.
        /// 이 함수는 Parent의 MeshGroupTransform이 연산된 후 -> Vertex가 연산되기 전에 호출되어야 한다.
        /// </summary>
        public void MakeWorldMatrix(bool isRecursive)
        {
            _localMatrix.SetIdentity();
            _localMatrix._pos      = _deltaPos;
            _localMatrix._angleDeg = _deltaAngle;
            _localMatrix._scale.x  = _deltaScale.x;
            _localMatrix._scale.y  = _deltaScale.y;

            _localMatrix.MakeMatrix();

            //World Matrix = ParentMatrix x LocalMatrix
            //Root인 경우에는 MeshGroup의 Matrix를 이용하자

            //_invWorldMatrix_NonModified.SetIdentity();

            if (_parentBone == null)
            {
                _worldMatrix.SetMatrix(_defaultMatrix);
                _worldMatrix.Add(_localMatrix);

                _worldMatrix_NonModified.SetMatrix(_defaultMatrix);                //Local Matrix 없이 Default만 지정


                if (_parentOptTransform != null)
                {
                    //Debug.Log("SetParentOptTransform Matrix : [" + _parentOptTransform.transform.name + "] : " + _parentOptTransform._matrix_TFResult_World.Scale2);
                    //Non Modified도 동일하게 적용
                    //렌더유닛의 WorldMatrix를 넣어주자
                    _worldMatrix.RMultiply(_parentOptTransform._matrix_TFResult_World);                    //RenderUnit의 WorldMatrixWrap의 Opt 버전

                    _worldMatrix_NonModified.RMultiply(_parentOptTransform._matrix_TFResult_WorldWithoutMod);
                }
            }
            else
            {
                _worldMatrix.SetMatrix(_defaultMatrix);
                _worldMatrix.Add(_localMatrix);
                _worldMatrix.RMultiply(_parentBone._worldMatrix);

                _worldMatrix_NonModified.SetMatrix(_defaultMatrix);                //Local Matrix 없이 Default만 지정
                _worldMatrix_NonModified.RMultiply(_parentBone._worldMatrix_NonModified);
            }

            //World Matrix는 MeshGroup과 동일한 Space의 값을 가진다.
            //그러나 실제로 Bone World Matrix는
            //Root - MeshGroup...(Rec) - Bone Group - Bone.. (Rec <- 여기)
            //의 레벨을 가진다.
            //Root 밑으로는 모두 World에 대해서 동일한 Space를 가지므로
            //Root를 찾아서 Scale을 제어하자...?
            //일단 Parent에서 빼두자
            //_transformLocalMatrix.SetMatrix(_worldMatrix);


#if UNITY_EDITOR
            _shapePoint_End = new Vector2(0.0f, _shapeLength);


            _shapePoint_Mid1 = new Vector2(-_shapeWidth * 0.5f, _shapeLength * 0.2f);
            _shapePoint_Mid2 = new Vector2(_shapeWidth * 0.5f, _shapeLength * 0.2f);

            float taperRatio = Mathf.Clamp01((float)(100 - _shapeTaper) / 100.0f);

            _shapePoint_End1 = new Vector2(-_shapeWidth * 0.5f * taperRatio, _shapeLength);
            _shapePoint_End2 = new Vector2(_shapeWidth * 0.5f * taperRatio, _shapeLength);

            _shapePoint_End  = _worldMatrix.MtrxToSpace.MultiplyPoint(_shapePoint_End);
            _shapePoint_Mid1 = _worldMatrix.MtrxToSpace.MultiplyPoint(_shapePoint_Mid1);
            _shapePoint_Mid2 = _worldMatrix.MtrxToSpace.MultiplyPoint(_shapePoint_Mid2);
            _shapePoint_End1 = _worldMatrix.MtrxToSpace.MultiplyPoint(_shapePoint_End1);
            _shapePoint_End2 = _worldMatrix.MtrxToSpace.MultiplyPoint(_shapePoint_End2);
#endif

            if (_socketTransform != null)
            {
                //소켓을 업데이트 하자
                _socketTransform.localPosition = new Vector3(_worldMatrix._pos.x, _worldMatrix._pos.y, 0);
                _socketTransform.localRotation = Quaternion.Euler(0.0f, 0.0f, _worldMatrix._angleDeg);
                _socketTransform.localScale    = _worldMatrix._scale;
            }
            //if (string.Equals(name, "Bone 2 Debug"))
            //{
            //	//디버그를 해보자
            //	Debug.Log("------- Bone Matrix [" + name + "] ------- (Runtime)");
            //	Debug.Log("Default Matrix [" + _defaultMatrix.ToString() + "]");
            //	Debug.Log("Local Matrix [" + _localMatrix.ToString() + "]");
            //	if (_parentBone != null)
            //	{
            //		Debug.Log("Parent(" + _parentBone.name + ")");
            //		Debug.Log(">> World Matrix [" + _parentBone._worldMatrix.ToString() + "]");
            //		Debug.Log(">> World Matrix No Mod [" + _parentBone._worldMatrix_NonModified.ToString() + "]");
            //	}
            //	Debug.Log("World Matrix [" + _worldMatrix.ToString() + "]");
            //	Debug.Log("World Matrix No Mod [" + _worldMatrix_NonModified.ToString() + "]");
            //	Debug.Log("-----------------------------------------");
            //}

            //Child도 호출해준다.
            if (isRecursive && _childBones != null)
            {
                for (int i = 0; i < _childBones.Length; i++)
                {
                    _childBones[i].MakeWorldMatrix(true);
                }
            }
        }
Ejemplo n.º 3
0
        ///// <summary>
        ///// 초기화/3) Parent Matrix를 넣는다. 바뀐게 없다면 더 호출하지 않아도 된다.
        ///// (에디터에서 메뉴에서 선택시, 처음 초기화시 호출해야함)
        ///// </summary>
        ///// <param name="parentMatrix"></param>
        //public void SetParentMatrix(apMatrix parentMatrix)
        //{
        //	_parentMatrix = parentMatrix;
        //}

        /// <summary>
        /// 4) World Matrix를 만든다.
        /// 이 함수는 Parent의 MeshGroupTransform이 연산된 후 -> Vertex가 연산되기 전에 호출되어야 한다.
        /// </summary>
        public void MakeWorldMatrix(bool isRecursive)
        {
            _localMatrix.SetIdentity();
            _localMatrix._pos      = _deltaPos;
            _localMatrix._angleDeg = _deltaAngle;
            _localMatrix._scale.x  = _deltaScale.x;
            _localMatrix._scale.y  = _deltaScale.y;

            _localMatrix.MakeMatrix();

            //World Matrix = ParentMatrix x LocalMatrix
            //Root인 경우에는 MeshGroup의 Matrix를 이용하자

            //_invWorldMatrix_NonModified.SetIdentity();

            if (_parentBone == null)
            {
                _worldMatrix.SetMatrix(_defaultMatrix);
                _worldMatrix_NonModified.SetMatrix(_defaultMatrix);
                if (_isRigTestPosing)
                {
                    _worldMatrix.Add(_rigTestMatrix);                    //Rig Test 추가
                }
                _worldMatrix.Add(_localMatrix);

                if (_renderUnit != null)
                {
                    //Non Modified도 동일하게 적용
                    //렌더유닛의 WorldMatrix를 넣어주자
                    //_worldMatrix.RMultiply(_renderUnit._meshGroup._rootMeshGroupTransform._matrix);
                    _worldMatrix.RMultiply(_renderUnit.WorldMatrixWrap);
                    _worldMatrix_NonModified.RMultiply(_renderUnit.WorldMatrixWrapWithoutModified);

                    ////Inverse도 만들어주자
                    ////Inverse의 시작점부터
                    //if (_renderUnit._meshTransform != null)//TODO : 이거 고칠것 (MeshGroup Transform 포함하게)
                    //{
                    //	_invWorldMatrix.SetMatrix(_renderUnit._meshTransform._invMatrix_TFResult_World);

                    //	_invWorldMatrix_NonModified.SetMatrix(_renderUnit._meshTransform._invMatrix_TFResult_WorldWithoutMod);

                    //	//_invWorldMatrix_NonModified.SetIdentity();
                    //	//_invWorldMatrix_NonModified.RInverse(_renderUnit._meshTransform._invMatrix_TFResult_WorldWithoutMod);
                    //}
                }
                //else
                //{
                //	_invWorldMatrix.SetIdentity();
                //	_invWorldMatrix_NonModified.SetIdentity();
                //}
            }
            else
            {
                _worldMatrix.SetMatrix(_defaultMatrix);
                _worldMatrix_NonModified.SetMatrix(_defaultMatrix);

                if (_isRigTestPosing)
                {
                    _worldMatrix.Add(_rigTestMatrix);                    //Rig Test 추가
                }
                _worldMatrix.Add(_localMatrix);
                _worldMatrix.RMultiply(_parentBone._worldMatrix);

                //주의, Parent의 NonModifiedMatrix를 적용할 것
                _worldMatrix_NonModified.RMultiply(_parentBone._worldMatrix_NonModified);

                //Inverse를 적용하자
                //_invWorldMatrix.SetMatrix(_parentBone._invWorldMatrix);
                //_invWorldMatrix_NonModified.SetMatrix(_parentBone._invWorldMatrix_NonModified);

                //_invWorldMatrix_NonModified.SetIdentity();
                //_invWorldMatrix_NonModified.RInverse(_parentBone._invWorldMatrix_NonModified);
            }

            ////Inverse 이어서 작업
            //_invWorldMatrix.RInverse(_localMatrix);
            //if(_isRigTestPosing)
            //{
            //	_invWorldMatrix.Subtract(_rigTestMatrix);
            //}

            //_invWorldMatrix.Subtract(_defaultMatrix);
            //_invWorldMatrix_NonModified.RInverse(_defaultMatrix);
            ////_invWorldMatrix_NonModified.Subtract(_defaultMatrix);

            //if (string.Equals(_name, "Bone 2 Debug"))
            //{
            //	//디버그를 해보자
            //	Debug.Log("------- Bone Matrix [" + _name + "] ------- (Editor)");
            //	Debug.Log("Default Matrix [" + _defaultMatrix.ToString() + "]");
            //	Debug.Log("Local Matrix [" + _localMatrix.ToString() + "]");
            //	if (_parentBone != null)
            //	{
            //		Debug.Log("Parent(" + _parentBone._name + ")");
            //		Debug.Log(">> World Matrix [" + _parentBone._worldMatrix.ToString() + "]");
            //		Debug.Log(">> World Matrix No Mod [" + _parentBone._worldMatrix_NonModified.ToString() + "]");
            //	}
            //	Debug.Log("World Matrix [" + _worldMatrix.ToString() + "]");
            //	Debug.Log("World Matrix No Mod [" + _worldMatrix_NonModified.ToString() + "]");
            //	Debug.Log("-----------------------------------------");
            //}

            //Child도 호출해준다.
            if (isRecursive)
            {
                for (int i = 0; i < _childBones.Count; i++)
                {
                    _childBones[i].MakeWorldMatrix(true);
                }
            }
        }