https://github.com/codecoding/SQLite4Unity3d


Unity로 SQL을 쓸 때 주로 에셋 스토어에 있는 SimpleSQL을 사용하는데 UWP에서 사용할 수 없다.

대체할 수 있는 것을 찾다가 발견



https://www.mixamo.com/

http://Render-Crowd-Of-Animated-Characters-master


애니메이션을 가진 캐릭터의 Mesh를 이용하여 해당 애니메이션에 맞는 Anim Map을 생성해준다.


이를 이용하면 Shader에서 Mesh의 각 Vertex 부분을 이동시킨 것과 같은 모양으로 렌더링을 해준다.


실제로 Mesh의 모양을 변형하는 것이 아니다.


gpu instancing을 사용하여 draw call을 줄여준다고 한다.


써보면 되게 매력적이다.


http://orcacode.tistory.com/entry/Unity-Android-Bluetooth-플러그인과-원리


참고 : https://forum.unity.com/threads/shadow-catcher-or-matte-shadow-shader.414418/


홀로렌즈는 MR 컨텐츠를 즐기기 위한 장비이다.


현실 공간에 가상의 오브젝트를 띄우는데, 그림자가 보이지 않는다면 이질감을 주게 된다.


위의 참고 글을 보면 다음과 같은 소스 코드가 있다.



Shader "Unlit/VertColorWithShadow"
{
    Properties
    {
        _MainColor("Main Color", COLOR) = (0,0,0,1)
        _ShadowColor("Shadow Color", COLOR) = (1,0,0,1)
    }
 
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
 
        Pass
        {
            Tags {"LightMode" = "ForwardBase"}
 
            CGPROGRAM
            #pragma multi_compile_fwdbase
            #pragma vertex vert
            #pragma fragment frag
 
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
 
            float4 _MainColor;
            float4 _ShadowColor;
 
            struct appdata
            {
                float4 vertex : POSITION;
            };
 
            struct v2f
            {
                float4 pos : SV_POSITION;
                float4 mainColor : COLOR;
                LIGHTING_COORDS(1,2)
            };
         
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.mainColor = _MainColor;
 
                TRANSFER_VERTEX_TO_FRAGMENT(o);
 
                return o;
            }
         
            fixed4 frag (v2f i) : SV_Target
            {
                fixed atten = 1.0 - LIGHT_ATTENUATION(i);
                fixed3 shadowColor = atten * _ShadowColor.rgb;
                fixed4 finalColor = i.mainColor + fixed4(shadowColor, 1.0);
 
                return finalColor;
            }
            ENDCG
        }
 
        // Pass to render object as a shadow caster
        Pass
        {
            Name "ShadowCaster"
            Tags { "LightMode" = "ShadowCaster" }
     
            ZWrite On ZTest LEqual Cull Off
 
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_shadowcaster
            #include "UnityCG.cginc"
 
            struct v2f {
                V2F_SHADOW_CASTER;
            };
 
            v2f vert( appdata_base v )
            {
                v2f o;
                TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
                return o;
            }
 
            float4 frag( v2f i ) : SV_Target
            {
                return float4(1.0, 1.0, 1.0, 1.0);
            }
            ENDCG
        }
    }
}

위의 Shader 코드를 Unity에서 작성한다.


Material을 새로 만들고 Shader를 집어넣는다.


Shadow Color를 적절하게 조절해준다.


Spatial Mapping Manager의 Surface Material에 위의 Material을 넣어준다.


그러면 홀로렌즈로 볼 때는 그림자가 정상적으로 나오는 것을 볼 수 있다.


하지만 디바이스 포탈을 통해 캡처나 녹화를 하면 다음과 같이 나온다.



공간이 어둡게 된 부분은 Spatial Mapping이 된 부분이고 밝은 부분은 Mapping이 되지 않은 부분이다.


홀로렌즈 시연을 할 때, 디바이스 포탈이나 스펙데이터 뷰를 사용한 녹화가 필요한데 이런 현상이 일어나면 곤란하다.


위의 코드 일부를 수정하면 간단하게 해결된다.

            fixed4 frag (v2f i) : SV_Target
            {
                fixed atten = 1.0 - LIGHT_ATTENUATION(i);
		if(atten > 0)
		{
 	               fixed3 shadowColor = atten * _ShadowColor.rgb;
        	       fixed4 finalColor = i.mainColor + fixed4(shadowColor, 1.0);
 
 	               return finalColor;
		}
		else
			return float4(0, 0, 0, 0);
            }





그림자 색감을 좀 더 부드럽고 퍼지는 느낌을 주고 싶지만 아직은 홀로렌즈의 성능이 낮아서 불가능하다.



Spatial Mapping에 있는 기능 때문인건지 InputManager의 기능인 것인지는 모르겠지만


OnInputClicked가 실행되면 Spatial Mapping의 Material이 켜지거나 꺼진다.


이를 해결하는 다양한 방법이 있겟지만 다음과 같은 방법을 이용하여 해결하였다.



SpatialMappingManager의 해당 부분을 drawVisualMeshes = value; 부분을 주석처리 하면 된다.


내부를 건드려서 좋은 방법은 아닌 것 같지만 일단 다음과 같이 진행하였다.


서로 충돌하는 오브젝트 중에 하나는 무조건 Rigidbody가 있어야 한다.


두 오브젝트가 모두 Rigidbody가 있더라도 둘 다 isKinematic이 켜져 있으면 안된다.


그러면 문제없이 작동하는 것을 확인할 수 있다.


별 내용은 없는데 가끔 까먹게 되서 글로 작성한다.

참고 페이지 : https://unity3d.college/2016/04/11/baseball-bat-physics-unity/






위 영상에서는 배트의 위치에 따라 각기 다른 velocity를 할당하는 법에 대해 나와있다.

영상을 따라한 후, bat follower의 velocity를 받아온 후, 날아오는 공에 적용하고자 한다면 다음과 같이 진행한다.


1) 배트에 할당된 capsule의 capsule collider를 활성화한다.


isTrigger는 자신이 원하는 대로 한다. OnCollisionEnter를 했을 때, 공의 속도가 감속이 되는지 모르겠지만

공의 기본 속도를 그대로 이용하기 위해서 OnTriggerEnter를 사용하기로 했다.



2) 영상에서는 follower로 작성되어져 있던 변수를 전역변수로 빼준다.

var는 전역변수에서 사용이 불가능하기 때문에 BatCapsuleFollower라는 변수 타입으로 설정한다.


3) OnTriggerEnter에서 batfollower의 velocity값과 angularVelocity값을 받아온다.

이후에 다양한 공식을 이용해서 공의 velocity 값을 변경해주면 된다.


----------------------------------------------------------------------------------------------------------------------------------


여기까지는 대충 하는 부분인데 야구공과 배트의 물리 공식을 찾기가 너무 힘들다.



+ Recent posts