GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

이 글을 쓰는 이유는... Max -> Unity로 바꿀때 면이 자주 뒤집혀서 나의 성깔이 돌아갈 것 같아서이다.

먼저 면이 돌아간다는 것의 기본적인 이유는 삼각형 index가 거꾸로 배치되어 있기 때문인데... 이를 해결하는 스크립트를 제시하고자 한다.


using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
public class FLIP : MonoBehaviour {
     
    Mesh m;
     
    // Use this for initialization
    void Start () {
         
        if(GetComponent<SkinnedMeshRenderer>())
            m = GetComponent<SkinnedMeshRenderer>().sharedMesh;
         
        for(int i = 0 ; i < m.vertices.Length; i++){
            m.vertices[i] = new Vector3(m.vertices[i].x + 100f, m.vertices[i].y, m.vertices[i].z);
        }
        List<Vector3> vertices = new List<Vector3>();
        List<Vector3> normals = new List<Vector3>();
         
        List<int> triangles = new List<int>();
         
        List<Vector2> uv1 = new List<Vector2>();
        List<Vector4> tangents = new List<Vector4>();
        List<BoneWeight> boneWeights = new List<BoneWeight>();
        List<Matrix4x4> bindposes = new List<Matrix4x4>();
         
        for(int i = 0; i < m.vertices.Length; i++){
            vertices.Add(m.vertices[i]);
            normals.Add(m.normals[i]);
            uv1.Add(m.uv[i]);
            tangents.Add(m.tangents[i]);
        }      
         
        for(int i = m.triangles.Length - 1; i >= 0; i--){
            triangles.Add(m.triangles[i]);
        }
         
        for(int i = 0; i < m.boneWeights.Length; i++){
            boneWeights.Add(m.boneWeights[i]); 
        }
         
        for(int i = 0; i < m.bindposes.Length; i++){
            bindposes.Add(m.bindposes[i]); 
        }
         
        m.Clear();
         
        m.vertices = vertices.ToArray();
        m.triangles = triangles.ToArray();
        m.uv = uv1.ToArray();
        m.normals = normals.ToArray();
        m.tangents = tangents.ToArray();
        m.boneWeights = boneWeights.ToArray();
        m.bindposes = bindposes.ToArray();
    }
     
    // Update is called once per frame
    void Update () {
     
    }
}






여기서  주의해야 할 것은. 내가 불러오는 Mesh의 데이터는 SkinnedMeshRenderer에 붙어있는 mesh라는 것이다. 따라서 SkinnedMeshRenderer가 아닌, MeshFilter라면 GetComponent 부분을 바꿔주기 바란다.

또한 Mesh 정보를 바꿔 줄 떄의 주의점은, 부분변환은 적용이 안된다는 것이다.(이유 모름). 

가령 현재 문제는 triangle의 인덱스 순서가 잘못 되어있다고 말했는데, 이러면 triangle의 인덱스만 바꿔주면 되지만, 위의 예시처럼 정점에서 부터 노말값까지 다 새로 박아주는 이유는 적용이 안되서이다. 따라서 Clear()를 통해 Mesh정보를 비워주고, 새로운 정보를 입력해줘야 한다.

'[Unity3D]' 카테고리의 다른 글

동적 애니메이션 만들기.  (2) 2012.10.29
UI 제작.  (0) 2012.10.11
물체 자르기  (1) 2012.05.30
자르기 구현  (2) 2012.05.25
Editor에서 변경한 자료가 반영이 안될때.  (0) 2012.05.17
AND

ARTICLE CATEGORY

목록들 (118)
[Unity3D] (39)
그래픽관련 (13)
잉여잉여 (25)
프로그래밍 (27)
노래♬ (3)
Game_Design(기획) (3)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ARCHIVE