반응형

FPS 에서 총을쏘고나서 벽면에 파편효과 이펙트발생하려고 햇습니다. 

Raycast를 활용해 hit 된 벽면에 hitraycast 정보를 얻엇습니다. 그리고 그벽면에 파편이펙트 생성시켯습니다.


문제는 이펙트가 벽면 안쪽에서 발생되어 이펙트가 보이지 않게 되는문제가 있엇습니다.


이문제 해결 을위해서 이펙트를 hit된 벽면의 normal vector를 얻고 그 vector 만큼 회전 하도록 하엿습니다.


적절하게 회전할수 잇는방법 찾다가 Quaternion.FromToRotation 함수를 이용하엿습니다.



하지만 Quaternion.FromToRotation를 처음에 잘이해가 안되더군요 



* 아래 예시입니다


 

1
this.transform.rotation = Quaternion.FromToRotation(vector.up , vector.right );
cs



한오브젝트를 위처럼 회전한다고 하면 어떻게 회전하게 될까요 ??


매개변수의 의미를 하나하나 파악 해보자면 

Quaternion.FromToRotation(fromVector , toVector);


from 벡터 축에서 tovector 축으로 변형 하여 회전 한다 입니다. 의미는 즉,


아래 그림처럼

(0,1,0) 축을 (1,0,0)축으로 회전시킨다라는 말이 되는거지요 . (0,1,0) 축을 (1,0,0)축으로 회전시키게되면 z축 회전 90도 만큼 하게 되겟지요.


그러게 되면 해당 오브젝트 인스펙터 rotation 보면 z값이 90 으로 되어 있는것을 확인할수 있습니다.





아래 그림은 실제  이펙트발생시 회전시켜 적용시켯습니다.







Quaternion.FromToRotation을 적용 안한 이펙트의 로컬 좌표계 표시 입니다.

파랑색 z 방향을 잘보세요. 오른쪽 바깥쪾을 향해 있어 일부분가 이펙트가 벽면안에서 발생되고 잇네요






Quaternion.FromToRotation 적용한 로컬좌표계 표시입니다.

파랑색 z축이 벽면을향해 있어 이펙트가 벽면에서 전부다 보일수 있게 되엇네요 





아래는 실제 활용햇던 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
void SuccessShotAttack(RaycastHit hitInfo)
{
 
        if (hitInfo.transform != null)
        {
            //블릿마크
 
            GameObject mark = GameObject.Instantiate(Resources.Load("Prefabs/Effect/Effect_Bulletmark")) as GameObject;
            mark.transform.position = hitInfo.point;
          
            mark.transform.rotation = Quaternion.FromToRotation(Vector3.forward, hitInfo.normal);
        }
}
cs


반응형

+ Recent posts