슬라이딩 벡터
Unity3D 2016. 12. 13. 19:43https://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 |