슬라이딩 벡터

Unity3D 2016. 12. 13. 19:43
반응형

https://code.tutsplus.com/tutorials/quick-tip-collision-reaction-between-a-circle-and-a-line-segment--active-10679


https://docs.unity3d.com/kr/current/ScriptReference/Vector3.Project.html


https://docs.unity3d.com/kr/current/Manual/ComputingNormalPerpendicularVector.html



미끄러짐 벡터는 충돌시 입사벡터가 입사면을 따라 미끄러지게 하기위해 수평성분만을 남긴 벡터이다.

왼쪽 그림에서, 벡터 P 가 법선벡터 n 을 가진 입사면에 충돌했을때의 슬라이딩벡터 S 를 볼수 있다.

슬라이딩벡터 S 는 여러가지 방법으로 구할 수 있지만, 여기서는 이전에 설명했던
반사벡터의 과정을 이용하는 방법과, 일반적인 방법을 설명한다.
물론, 그 결과는 완전히 같다.



이전에 설명했던 반사벡터에서, 입사벡터 P  n(-P·n) 을 한번 더해주면, 입사면에 투영된 접선벡터(Tangent Vector)를 구할 수 있다고 했다.

Fig. 2 를 보면, 입사벡터의 역벡터 -P 가 n 에 투영된 n(-P·n) 을 이용하여 슬라이딩벡터 S 를 구하고 있다.

그러므로 슬라이딩벡터 S 

S = P + n(-P·n)


일반적인 방법은, 입사벡터 P  n 에 바로 투영시키는 것이다.
입사벡터 P 와 법선벡터 n 의 끼인각이 0≤ θ ≤ π/2 일때, P·n 의 값은 음수가 되므로, n벡터의 역벡터 방향으로 투영벡터가 생성된다.

이렇게 얻어진 투영벡터 n(P·n) 을 입사벡터 P 에서 빼주면,
슬라이딩벡터 S 를 얻을수 있다.

그러므로 슬라이딩벡터 S 

S = P - n(P·n)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
using UnityEngine;
using System.Collections;
 
public class TestActorMono : MonoBehaviour {
    
    private Vector3 center;
 
    void Start () {
        center = this.transform.GetComponentInChildren<CapsuleCollider>().center;
    }
 
    void Update ()
    {
        var c = this.transform.position + this.transform.TransformVector(center);
 
        Ray ray = new Ray(c, this.transform.TransformDirection(Vector3.forward) * 1);
 
        RaycastHit hit;
 
        if (Physics.Raycast(ray, out hit))
        {
            var a = c - hit.point;
            var b = (c + this.transform.up * -1- hit.point;
 
            DrawArrow.ForDebug(hit.point, a, Color.cyan);
            DrawArrow.ForDebug(hit.point, b, Color.cyan);
            
            var p = hit.point - c;
            var pnp = Vector3.Project(p, hit.normal);
 
            DrawArrow.ForDebug(hit.point, p- pnp, Color.red);
 
 
            Vector3 dir = (p-pnp) - transform.position;
            dir.y = 0
            Quaternion rot = Quaternion.LookRotation(dir);
            transform.rotation = Quaternion.Slerp(transform.rotation, rot, 1 * Time.deltaTime);
        }
 
        transform.position += transform.TransformDirection(Vector3.forward) * Time.deltaTime * 0.5f;
    }
    
}
 
cs


반응형

'Unity3D' 카테고리의 다른 글

stateful / stateless protocal  (0) 2017.04.04
UniRx  (0) 2017.02.14
DrawArrow  (0) 2016.12.13
문기은 위키  (0) 2016.12.03
유니티 버전 5.5부터 .NET 4.6을 사용할수있다?  (0) 2016.10.06
: