GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

'[Unity3D]'에 해당되는 글 39건

  1. 2012.11.06
    SpotLight 버그
  2. 2012.10.30
    여러 애니메이션 한번에 플레이하기.
  3. 2012.10.29
    동적 애니메이션 만들기. 2
  4. 2012.10.11
    UI 제작.
  5. 2012.08.22
    [UNITY3D] 면 뒤집힘 현상. 1
  6. 2012.05.30
    물체 자르기 1
  7. 2012.05.25
    자르기 구현 2
  8. 2012.05.17
    Editor에서 변경한 자료가 반영이 안될때.
  9. 2012.05.10
    자체개발 카메라 애니메이션
  10. 2012.05.08
    BMFONT 이용하여 직접 제작한 font 사용하기 1

한 평면에 3개의 spotlight가 빛을 비추면 빛이 제데로 표현이 안된다... 알아보자.

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

[UNITY4] 새로운 기능 Animator  (2) 2012.11.22
Kinect 관련 블로그  (0) 2012.11.15
여러 애니메이션 한번에 플레이하기.  (0) 2012.10.30
동적 애니메이션 만들기.  (2) 2012.10.29
UI 제작.  (0) 2012.10.11
AND

애니메이션은 현재 자신이 가지고 있는 AnimationClip의 상태를 확인하며 플레이가 된다.

애니메이션이라는 놈에 존재하는 clip들은 모두 각자의 State를 가지고 있는데 
UNITY에서는 이것들을 AnimationState라는 Class로 관리를 한다.

animation["name"]와 같이 인덱스에 string을 넣어줌으로써 AnimationState를 가져올 수 있다.

여튼, 애니메이션의 상태에는 다음과 같은 것들이 존재한다.

bool enabled; 이는 플레이 상태인지 아닌지 확인하는 것으로 사용되며, animation.IsPlaying()의 리턴값을 결정짓는 놈이다.

int layer; 이는 애니메이션의 우선순위를 결정한다. 

즉, 모든 enabled된 애니메이션을 플레이하되, layer 값이 높은 놈의 애니메이션을 우선시 하겠다는 뜻이다.


이를 토대로 유니티 측에서 제공하는 constructionworker를 가지고 놀아보자.

	
AnimationState mix;
void Start () {

		animation["run"].wrapMode = WrapMode.Loop;

		mix = animation["idle"];

		

		mix.weight = 1f;

		mix.wrapMode = WrapMode.Loop;

		mix.layer = 1;

		mix.blendMode = AnimationBlendMode.Blend;

		mix.AddMixingTransform(RShoulder);

		mix.enabled = true;

		

		animation.Play("run");

	}

이는 run이라는 애니메이션의 오른쪽 어꺠부분을 idle이라는 애니메이션으로 대체하는 코드이다.

기본 layer는 0이기 때문에 idle의 애니메이션이 run이라는 애니메이션 위에 보여지기 위해서는 0보다 높은 값으로 설정해줘야된다.

또한 AddMixingTransform(Transform)을 통해 idle이라는 애니메이션은 RShoulder의 transform 부분만 플레이한다는 코드를 입력 할 수 있다. (-> 즉, idle 애니메이션 중 RShoulder만 플레이되고 나머지 뼈들은 플레이가 안된다.)

추후에 idle이라는 모션만 플레이하고 싶다면 RemoveMixingTransform을 통해서 해제해줘야 한다.



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

Kinect 관련 블로그  (0) 2012.11.15
SpotLight 버그  (0) 2012.11.06
동적 애니메이션 만들기.  (2) 2012.10.29
UI 제작.  (0) 2012.10.11
[UNITY3D] 면 뒤집힘 현상.  (1) 2012.08.22
AND

Keyframe - http://docs.unity3d.com/Documentation/ScriptReference/Keyframe.html

AnimationCurve - http://docs.unity3d.com/Documentation/ScriptReference/AnimationCurve.html

AnimationClip - http://docs.unity3d.com/Documentation/ScriptReference/AnimationClip.SetCurve.html

Animation - http://docs.unity3d.com/Documentation/ScriptReference/Animation.html

위의 4가지를 사용하여 동적으로 애니메이션 클립을 생성/ 플레이 할 수 있다.

방법은 다음과 같다. 

Keyframe은 시간과 해당 시간에 맞는 float값을 가지는 것인데, 이를 여러개 생성한 뒤 한 Array에 담아놓는다.
해당 Array를 바탕으로 AnimationCurve를 새로 생성해주면 animation clip을 만들기 위한 재료가 생성된다.

이제는 AnimationClip을 만들어야되는데, 이는 SetCurve로 설정이 가능하다.  

AnimationClip.SetCurve(string path, Type type, string propertyname, AnimationCurve curve)로 설정한다.
우리가 설정해줘야 할 것을 해석해보면 "게임 오브젝트", "스크립트", "변수" 가 되는데, 
path가 바로 Animation 클래스가 붙어있는 게임오브젝트의 자식들의 경로를 지정해주는 것이고, Type은 스크립트의 타입을 뜻한다. typeof(Transform)이나, 새로 만든 스크립트를 지정해주면 되고, propertyname은 그 스크립트에 존재하는 변수를 뜻한다. 
Transform이라면 localPosition.x와 같은 것들을 뜻한다.

이렇게 새로운 클립을 생성하고 animation.AddClip(clip, name);을 통해 애니메이션을 넣어줄 수 있다. 

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

SpotLight 버그  (0) 2012.11.06
여러 애니메이션 한번에 플레이하기.  (0) 2012.10.30
UI 제작.  (0) 2012.10.11
[UNITY3D] 면 뒤집힘 현상.  (1) 2012.08.22
물체 자르기  (1) 2012.05.30
AND

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

여러 애니메이션 한번에 플레이하기.  (0) 2012.10.30
동적 애니메이션 만들기.  (2) 2012.10.29
[UNITY3D] 면 뒤집힘 현상.  (1) 2012.08.22
물체 자르기  (1) 2012.05.30
자르기 구현  (2) 2012.05.25
AND

이 글을 쓰는 이유는... 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


이번 글에서는 작업중이던 도형 자르기에 대해서 얘기해보자 합니다.
제가 구현한 사항에서는 볼록한 도형만 처리됩니다.

자르는 방법에는 2가지로 나눠보도록 하겠습니다.

1. Ray를 이용한 자르기 방법.

2. Collider를 이용한 자르기 방법.

위 두가지 방법은 크게 다른점은 없습니다. 단지, 실제 칼날을 쓸것이냐, 가상의 칼날을 쓸것이냐에 따른 차이가 존재할 뿐입니다.

1. Ray를 이용
-> Ray를 이용하는 것은 의외로 간단합니다. 먼저 물체가 잘리는 조건을 정하고 진행하도록 하겠습니다. 
물체가 잘리는 조건: 물체를 완벽하게 그어야 된다.(물체 중간에서 멈추면 물체가 잘리지 않는다).
위 조건대로 방법을 보자면 다음과 같습니다.
마우스를 누른다(물체에 맞았나? Y: 물체를 저장하고, 해당 위치를 저장 N: 스킵)
마우스를 뗀다(아직도 Ray가 저장된 물체 위에 있나? Y: 안잘린다 N: 자르는 함수 실행)

2. Collider를 이용
-> 이것이 현재 사용되는 방법입니다. 어떤 물체에 rigidbody와 collider를 붙이고, OnCollisionEnter(Collision col)에서 col.contacts를 통해 충돌 위치들을 저장합니다
마찬가지로 OnCollisionExit(Collision col) col.contacts를 통해 빠져나갈때의 충돌 위치를 저장합니다.
이러면 어느위치에서부터 어느 위치까지 칼을 지나게했는지 알 수 있습니다.
이 두 점을 바탕으로 물체를 자르는 것입니다.

실제 물체 자르기 동작

한 오브젝트는 다음과 같이 이루어져 있습니다. Vertices, Triangles, Normals, Tangents, uv 등등 몇가지 더 추가요소가 있습니다만, 현재는 Vertex, triangle, normal
 만이 조작되는 상태입니다.
Vertices는 점을 의미합니다.
Triangles는 int형 배열인데, 어떤 vertex가 한 삼각형을 이루는지 알려주는 배열입니다.
3단위로 끊어 읽어야 합니다. 또한 사용자가 바라보는 방향에서  시계방향으로 값을 넣어줘야 보입니다. 
Normal은 vertices와 1:1매칭이되는 vector3형 배열입니다. 

위에서 한 동작은 자르는 기준을 마련하는 행동이었습니다. 따라서 이제는 어떻게 실제로 자르는지를 지정해줘야 하는데, 이는 Unity에서 제공하는 Plane을 사용하여 구현하였습니다. 물체를 지나는 점의 시작과 끝, 추가로 정한 (검의 위치 혹은 플레이어 위치)를 토대로 평면(P)을 하나 생성합니다.

해당 물체의 triangle들을 순차적으로 돌면서 그에 매치되는 점들을 가져와 3점이 모두 P의 양(+)/음(-)의 방향에 있다면 Plane 기준으로 Mesh A(+),B(-)에 저장합니다.
만일 모두 음/양의 방향이 아니라면 그 삼각형은 평면에 의해 잘리는 것으로 판단되어, 동일한 방향의 점 S1,S2 와 한개의 다른 점 O1 를 잇는 선을 그어 평면과의 교점을 C1,C2라고 잡습니다.  그러면 다음과 같은 생각을 할 수 있습니다.

1. S1,S2,C1,C2를 바탕으로 새로운 삼각형 2개를 구성하기
2. O1,C1,C2를 바탕으로 새로운 삼각형 1개를 구성하기

위의 2가지를 구현하면, 깔끔하게 물체를 자를 수 있게 됩니다.
위의 2가지 점에서 상세하게 고려해야 할 것은 

1. 시계방향의 판정
2. (S1,S2), (O1)이 각각 A,B 어느 Mesh에 속하게 되는가. 

2번은 1번에 비해서 상당히 쉬운 문제입니다.
제일 큰 문제는 시계방향의 판정이라고 볼 수 있습니다.
시계방향의 판정은 해당 점들의 평균값을 구하고, 한 vertex의 normal값을 가져와 그에 따라 시계방향으로 정렬한 뒤, vertices와 triangles를 구성해주는 방법이 있습니다.

단, 위의 방법은 재정렬을 지속적으로 하는 것이므로 약간의 성능 부하의 가능성이 존재합니다. 따라서, 다음과 같이 생각해 봅시다.

1. S1과 P1, O1은 한 직선 위에 존재한다.
2. S2와 P2, O1은 한 직선 위에 존재한다.
3. normal 값을 알 수 있다.

위의 세 조건을 통해, 재정렬을 하지 않아도  충분히 if else 문으로만 처리를 가능합니다.
(S1,S2,C1,C2)로 이루어지는 사각형의 경우 두 삼각형은 항상 다음과 같은 세트로 존재합니다 (S1,S2,C1), (S2,C1,C2). 이해가 안가신다면 그려보시는게 편합니다.
여튼, 각 세트를 3점을 토대로 plane을 생성합니다. new plane(S1,S2,C1) 하고, 생성한 plane의 normal값과 저희가 알고있는 normal 값의 dot product가 +라면 제대로 생성된 것이고, 아니라면 역순으로 지정해주시면 됩니다.

이러한 방법을 통해 깔끔하게 물체를 자르 실 수 있습니다.

면 매꾸기
- 면을 매꾸는 방법은 볼록 물체에선 쉽습니다. 
생각해야 할 것은 다음과 같습니다.
1. 새로생긴 점들
2. 새로생길 면의 방향
3. normal값 설정해주기.
위의 3가지를 처리하면 물체를 배는 면이 매꿔지는 것을 처리할 수 있습니다.



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

UI 제작.  (0) 2012.10.11
[UNITY3D] 면 뒤집힘 현상.  (1) 2012.08.22
자르기 구현  (2) 2012.05.25
Editor에서 변경한 자료가 반영이 안될때.  (0) 2012.05.17
자체개발 카메라 애니메이션  (0) 2012.05.10
AND

1차

2차

3 차


구현즁



AND

지속적으로 부딪히는 문제여서 글을 적어본다

Unity에서 editor를 사용해 특정 object의 값을 변경시킬 수 있다. 그러나 Play를 했을때 종종 값이 변경되지 않고, 원래 상태로 돌아가는 것을 볼 수 있을것이다.

이는 serialized된 값들에 변경이 적용되지 않기 때문이다. 따라서 

InspectorGUI 맨 앞에는 serializedObject.update()와 모든 변경을 마치고, serializedObject.ApplimodifiedChanges()를 해줘야 한다.

또한 변경할 값들은 serializedObject.FindProperty("변수 이름").올바른 변수 타입 을 통해서 변경 시켜 줘야 한다.

가령 vector3값을 변경시킨다고 하면, serializedObject.findproperty("변수 이름").vector3Value를 통해 변경 시킬 수 있다.

AND

cameraplayer.unitypackage


.

CameraPlayerScript를 부착해서 사용한다.

Editor창에 AddRoad를 하여, 카메라가 움직일 길을 만들어준다
길은 AddNode를 통해 Node를 추가한 뒤 Node들을 설정하여 어느 위치에 갈지를 설정해준다.

현재 Scene을 움직여야 Scene창에 업데이트가 되는 상태이며,이는 추후 수정할 계획이다.

AND

http://www.anbsoft.com/middleware/ezgui/docs/page28/page30/page30.html

참고


 edit -> Open Image Manager -> Image -> Import Image 에서 ID를 Ascii표를 봐가면서 찾는다. 뭐 가령 숫자 1을 customizing 한 이미지를 넣고싶으면  id는 아마도 48로 설정해주면 될 것이다.

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