블로그 이미지
˙Jisoo

카테고리

분류 전체보기 (72)
Programming (33)
Game Project (14)
Daily Life (12)
Photo Shots (11)
Total11,447
Today7
Yesterday77

기존에 작업했던 버텍스 노멀 구하기에서 약간의 문제가 있었습니다.
노멀을 구하기 위해 3개의 정점을 이용했는데 한쪽방향으로만 해놨더니 모서리 부분에서 정점 하나가 부족해서리..
그냥 맨 끝쪽만 계산을 안하고있었습니다..



그렇게 놔두다가 보기 흉하고 해서 모서리부분만 정점을 이 전 줄에서 하나씩 빼오고 역벡터로 취해줌으로써 간단하게 예외처리를 해놓았습니다..





빛의 방향을 벡터값으로 정해놓고 여지껏 구했던 버텍스들의 노멀값과 내적을 통해서 음영을 구해줍니다..
DirectX 기본라이브러리에 있는 Directional Light 도 이 방법일 것 같네요...





그림자가 버텍스단위로 너무 딱딱 끊겨서 이상하기에 라이트맵에 블러를 주었습니다.
하지만 음영의 레벨값 차이가 너무 강하죠.. 어두운곳은 너무 어둡고 밝은곳은 너무 밝고....


 


그래서 이와같이 레벨값을 조정해주었습니다.
왼쪽의 결과가 나오기 위해선
기존의값 / 2.0f + 127.0f / 255.0f 의 공식을 사용해주었고
오른쪽의 결과는
기존의값 / 3.0f + 150.0f / 255.0f 의 공식을 사용하였습니다.
( 색상값의 범위 0.0 ~ 1.0 에 1.0 흰색 기준입니다. )

오른쪽 결과에선 너무 밝아서 사라졌었던 부분의 그림자 디테일도 살아났네요..
조금씩 레벨값을 조정하면서 최대한 실사에 근접한 공식값을 찾아봐야겠군요..ㅎㅎ
Posted by ˙Jisoo
TAG D3D, DirectX

댓글을 달아 주세요


 비정상적으로 작동할 때의 모습

2차원에서 작업할때완 달리 3차원에서 작업할때는 이리저리 살펴보는것이 필요해서 가장먼저 어느정도 테스트용으로 사용가능한 카메라 클래스를 제작중입니다..
어디까지나 테스트용으로 둘러보기 위한것이므로 아주 기본적인 기능만 있기에 추후 게임용으로 쓰려면 여러군데 손봐야겠지요
테스트 작업용 카메라 만들기도 벅찬데 게임상에서 쓰일 카메라를 제대로 만들수 있을런지 걱정됩니다...;;

오늘 하루동안 yaw pitch roll 과 상하전후좌후 움직이도록 만들어놓으려고 했는데 yaw pitch roll 에서부터 문제가 발생합니다..ㅠ.ㅠ
분명 생각했던 방법대로 짜고 처음 실행해보았을 때는 그런가보다.. 했는데 어째 볼수록 게임에서 카메라를 움직이던 것과 무언가 틀립니다....
(여기서 말하는 게임에서 카메라는 보통 fps게임에서 플레이어가 죽었을 시 spectator 모드로 조종할 때의 카메라 조종 방식)
여기 저기 찾아본 결과 로컬스페이스를 기준으로 yaw 를 움직여서 그랬습니다.
생각해보니 pitch로 카메라가 바라보는 시점이 바뀔경우 로컬스페이스의 업벡터가 같이 변경되고 그 변경된 업벡터를 기준으로 yaw 적용을 하니 원치않던 움직임이 나오는 것은 당연했습니다.






정상적으로 작동하는 모습

그래서 yaw 할때 업벡터를 로컬스페이스의 업벡터가 아닌 월드스페이스 업벡터로 설정하도록 바꾸었습니다.
결과가 더 이상해졌습니다....;;
이때 많이 고민을 했는데 중요한 작업 하나를 빼먹고 있었습니다.
월드스페이스의 업벡터로 yaw를 변경했으면 분명 로컬스페이스 내의 업벡터 값도 변하겠지요. 룩앳벡터 (아.. 도대체 우리말의 표현은 무엇인지;;) 가 바라보는 방향과 같은 선상으로요.
즉 월드스페이스의 업벡터 기준으로 yaw를 적용 한 만큼 로컬스페이스 내의 업벡터도 회전하여야 합니다.
다행히 그렇게 했더니 원하는대로 작동을 하더군요..
그 간단한 한줄짜리 생각을 못해서 참...ㅠ.,ㅠ

pitch 는 그냥 로컬스페이스의 측면벡터,업벡터,룩앳벡터 로 해도 적용 되고 yaw 와 roll에만 이렇게 적용하면 됩니다.
아래는 그냥 나중에 또 까먹고 제 글을 찾아보는 일이 생길까봐.. 간단한 의사코드

1번째 방법 :
yaw( y ) {
  D3DXMatrixRotationAxis ( &matrixRotY , &월드스페이스 업벡터 , y );
  D3DXVecTransformNormal =>  로컬 업벡터 에 &matrixRotY 적용;
  D3DXVecTransformNormal =>  로컬 측면벡터에 ~~~~;
  D3DXVecTransformNormal =>  로컬 룩앳벡터에 ~~~~;
}

2번째 방법:
yaw ( y ) {
  로컬 측면벡터 = 룩앳벡터 와 월드스페이스업벡터 내적;
  로컬 업벡터 = 측면벡터와 룩앳벡터 내적;
  D3DXMatrixRotationAxis ( &matrixRotY , &로컬업벡터 , y );
  로컬 측면,룩앳벡터에 matrixRotY 적용;
}
Posted by ˙Jisoo

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함