동양권 서브컬쳐씬에서 매력적인 캐릭터를 지칭하는 대표적인 개념으로 '모에(萌え)'라는 것이 있다. '모에'란 무엇인가? 어떤 캐릭터를 '모에'하다고 볼 수 있는가? '모에'한 캐릭터를 어떻게 작성할 것인가?
본 슬라이드는 다양한 예를 통해 '모에'에 대해 새로운 관점을 제시한다.
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰승민 백
NDC 2016 발표 자료입니다
아래는 공개된 세션의 소개입니다
------------------------------------------------------------
게임을 개발하다 보면 액션, RPG를 비롯한 많은 장르에서 캐릭터의 스킬을 만들어야 하는 때가 옵니다.
다양한 스킬의 기획을 제한하지 않으면서도, 빠르게 개발한다는 두 가지 목표를 달성하기 위해서는 어떻게 개발해야 하는지 고민하고 프로젝트에 적용한 결과를 공유하는 세션입니다.
다음과 같은 세 가지 개발 방법을 보여드리고, 각각의 장단점을 비교하는 형태로 진행됩니다.
1. 고전적인 하드 코딩 방식
2. 한 달에 하나씩의 캐릭터 업데이트를 단행했던 <최강의>에서 사용했던 스킬 툴 방식 (온라인 액션RPG, 언리얼3 기반)
3. 현재 개발 중인 모바일 프로젝트 <건파이트>에서 시도하고 있는 언리얼4 블루프린트 기반 방식
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지영준 박
온라인 게임에서 새로운 캐릭터를 만든다는 것은 어떠한 컨텐츠와 비교 안될 만큼 많은 코스트가 드는 작업 입니다.
당연, 이러한 비싼 코스트의 신캐릭터는 유저들의 시선을 사로잡을 수 있는 독특한 매력을 가져야만 성공할 수 있습니다.
시선을 사로잡는 외형뿐만 아니라 핵심 플레이의 재미, 그리고 그것을 뒷받침해주기 위한 기술적 시도가 조화 되어야만
이러한 매력적인 캐릭터들이 탄생하게 됩니다.
현 세션에선 영웅전의 주인공인 리시타, 피오나, 이비, 카록을 개발하면서 겪었던 여러 가지 기술적인 시행 착오에 대해 알아보고
그 노하우를 엮어서 어떻게 궁수 <카이>를 성공적으로 런칭 할 수 있었는지를 공유하고자 합니다.
대략 다음과 같은 항목들을 다룹니다.
- 영웅전 궁수 캐릭터 카이를 개발하면서 겪었던 좌충우돌 생생한 개발 스토리.
- 구세대 엔진을 이용해 신세대 엔진 따라잡기
- 카이는 궁수 캐릭터의 기술적 난제를 어떻게 해결했을까? – 블렌딩 애니메이션 구성
- 카이 캐릭터 제작에서의 기술적 특이한 시도 및 시행착오들
- 타격감 개선 및 궁수의 재미를 살리기 위한 노하우
- 실시간 체형 변화 시스템
- 실시간 시퀀스 키 프레임 디포메이션 기법.
동양권 서브컬쳐씬에서 매력적인 캐릭터를 지칭하는 대표적인 개념으로 '모에(萌え)'라는 것이 있다. '모에'란 무엇인가? 어떤 캐릭터를 '모에'하다고 볼 수 있는가? '모에'한 캐릭터를 어떻게 작성할 것인가?
본 슬라이드는 다양한 예를 통해 '모에'에 대해 새로운 관점을 제시한다.
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰승민 백
NDC 2016 발표 자료입니다
아래는 공개된 세션의 소개입니다
------------------------------------------------------------
게임을 개발하다 보면 액션, RPG를 비롯한 많은 장르에서 캐릭터의 스킬을 만들어야 하는 때가 옵니다.
다양한 스킬의 기획을 제한하지 않으면서도, 빠르게 개발한다는 두 가지 목표를 달성하기 위해서는 어떻게 개발해야 하는지 고민하고 프로젝트에 적용한 결과를 공유하는 세션입니다.
다음과 같은 세 가지 개발 방법을 보여드리고, 각각의 장단점을 비교하는 형태로 진행됩니다.
1. 고전적인 하드 코딩 방식
2. 한 달에 하나씩의 캐릭터 업데이트를 단행했던 <최강의>에서 사용했던 스킬 툴 방식 (온라인 액션RPG, 언리얼3 기반)
3. 현재 개발 중인 모바일 프로젝트 <건파이트>에서 시도하고 있는 언리얼4 블루프린트 기반 방식
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지영준 박
온라인 게임에서 새로운 캐릭터를 만든다는 것은 어떠한 컨텐츠와 비교 안될 만큼 많은 코스트가 드는 작업 입니다.
당연, 이러한 비싼 코스트의 신캐릭터는 유저들의 시선을 사로잡을 수 있는 독특한 매력을 가져야만 성공할 수 있습니다.
시선을 사로잡는 외형뿐만 아니라 핵심 플레이의 재미, 그리고 그것을 뒷받침해주기 위한 기술적 시도가 조화 되어야만
이러한 매력적인 캐릭터들이 탄생하게 됩니다.
현 세션에선 영웅전의 주인공인 리시타, 피오나, 이비, 카록을 개발하면서 겪었던 여러 가지 기술적인 시행 착오에 대해 알아보고
그 노하우를 엮어서 어떻게 궁수 <카이>를 성공적으로 런칭 할 수 있었는지를 공유하고자 합니다.
대략 다음과 같은 항목들을 다룹니다.
- 영웅전 궁수 캐릭터 카이를 개발하면서 겪었던 좌충우돌 생생한 개발 스토리.
- 구세대 엔진을 이용해 신세대 엔진 따라잡기
- 카이는 궁수 캐릭터의 기술적 난제를 어떻게 해결했을까? – 블렌딩 애니메이션 구성
- 카이 캐릭터 제작에서의 기술적 특이한 시도 및 시행착오들
- 타격감 개선 및 궁수의 재미를 살리기 위한 노하우
- 실시간 체형 변화 시스템
- 실시간 시퀀스 키 프레임 디포메이션 기법.
XBOX360이나 PS3 등 성능과 표현력이 높은, 이른바 넥스트젠 (차세대) 콘솔에서 액션 장르의 게임이 차지하는 비중과 중요성은 날이 갈 수록 높아지고 있다. 이런 추세에 힘입어 넥스트젠 게임에 등장하는 애니메이션은 그 볼륨이 늘어나는 것은 물론 점차 복잡한 제어를 요구하고 있다. 특히 적은 볼륨을 통해서 다채로운 애니메이션을 만들어내기 위한 절차적 애니메이션 기법이나 게임 내의 복잡한 환경에 적절하게 반응하도록 만드는 상태 제어 기법 등은 첨단 렌더링 기법에 비견할 수 있을 정도로 넥스트젠 게임에서 가장 중요한 기술 중 하나로 자리잡고 있다.
이 강의에서는 이러한 넥스트젠 애니메이션 기술 트렌드와 온라인 게임에 기존 솔루션을 바로 통합하기 어려운 이유에 대해서 살펴보고, 실제로 온라인에서 동작할 수 있는 아키텍처에 대해서 마비노기 2의 개발 사례를 통해 살펴보도록 한다.
[Paper Review] Image captioning with semantic attentionHyeongmin Lee
이번 세미나에서는 Quanzeng You의 CVPR 논문인 [Image Captioning with Semantic Attention]에 대한 리뷰를 하려고 합니다. Image Captioning은 인공지능 학계의 거대한 두 흐름인 ‘Computer Vision(컴퓨터 비전)’과 ‘Natural Language Processing(자연어 처리)’를 연결하는, 매우 중요한 의의를 갖는 연구 분야입니다.
Image Captioning의 접근 방식은 크게 ‘Top-Down Approach’와 ‘Bottom-Up Approach’로 구분됩니다. Top-Down Approach에서는 이미지를 통째로 시스템에 통과 시켜서 얻은 ‘요점’을 언어로 변환하는 반면 Bottom-Up Approach에서는 이미지의 다양한 부분들로부터 단어들을 도출해내고, 이를 결합하여 문장을 얻어냅니다. 논문에서는 이러한 Top-Down Approach와 Bottom-Up Approach의 장점을 합해서 Image Captioning 성능을 올리고자 합니다. 이 때 사용되는 개념이 바로 Visual Attention입니다.
Visual Attention은 말 그대로 이미지의 특정 부분에 집중하는 것입니다. 사람이 이미지의 모든 내용을 전부 묘사하지 않는 것처럼, 컴퓨터도 이미지에서 특히 중요한 부분에 자원을 집중하는 형태의 노력이 필요합니다. Visual Attention을 통해서 컴퓨터는 이미지의 특히 중요한 부분에 집중하고, 더 자세히 묘사하게 됩니다. 본 세미나에서는 Visual Attention이 어떠한 방식으로 Image Captioning에 적용되는지 살펴보도록 하겠습니다.
GDC 2007에서 있었던 Agile Game Development Tutorial의 일부인 'Agile의 의미'와 'Agile 계획 수립'의 한글 번역입니다:
강연자는 Mike Cohn으로, '사용자 스토리'와 'Agile Estimating and Planning'의 저자입니다.
Agile 개발에서 (사용자 스토리의) 일정을 추정하는 방법에 대해서 다루고 있습니다.
자세한 것은
http://betterways.tistory.com/177 참조
Similar to KGC2010 김주복, 김충효 - M2 프로젝트의 절차적 리깅 시스템 (20)
1. M2 프로젝트의
절차적
캐릭터리깅시스템 NEXON devCAT 김주복, 김충효
Ⓒ 2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Project W in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dungeon | Project W is produced by Kim, Dungeon
3. 넥슨 신규개발 3본부
김충효
2001년 입사 / 마비노기1 프로젝트 합류
2006년 마비노기2 프로젝트 합류
2010년 현재 M2팀 팀장 / 넥슨 아트 직군장
Ⓒ 2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Project W in The 3rd Development Division in NEXON Corp. M2 team Director is Kim, Dungeon | Project W is produced by Kim, Dungeon
4. 모델링
애니메이팅
리깅
스크립팅…
Ⓒ 2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Project W in The 3rd Development Division in NEXON Corp. M2 team Director is Kim, Dungeon | Project W is produced by Kim, Dungeon
10. 물론 뼈 없이
애니메이션을 시킬 수
있지만…
Vertex Morph 를 활용한 방법이 대표적
하지만 이것만 가지고는
캐릭터 전체를 움직이기 힘들다.
11. 일반적인 게임 캐릭터에는
(보통)뼈! 만 있다…
Runtime 으로 변형이 일어나야 하기도 하고
애니메이션 데이터가 무한정 커질 수 없기 때문에
일반적인 게임 캐릭터는 Skeletal Animation 을 한다.
뼈대를 다양하게 활용해서 캐릭터의 미세한 변형을 표현하는 것이
현 시대의 일반적인 표현 방법이다.
12. Surface Model + Skeletal Animation
지긋지긋한…
Skinning !!
Vertex 의 위치가 관절의 위치와 방향을 따라간다.
Skinning 과정을 통해서 어떤 관절에 어느 정도로 따라가게 될 지 결정됨
59. 주요 기능
ExposeTM
Expose Transform Matrix (Helper)
특정 관절의 현재 상태를 알아낼 수 있다.
Local/World Position (관절의 위치)
Local/World Euler Angle (관절의 회전)
Distance (두 관절 사이의 거리)
:
68. Shoulder 1 의 동작
팔 관절 ExposeTM Shoulder 1
Local Rotation Position
Reaction Controller
Rotation
LookAt Constraint
Up Node
Up Node
Position
Reaction Controller
69. Shoulder 2 의 동작
팔 관절 ExposeTM Shoulder 2
Local Rotation Position
Reaction Controller
Rotation
Reaction Controller
81. 여성 누드 캐릭터가
충분히 만족스러운 상황이라고 판단!!
대략적인 구현 목표 추출
Reaction Controller
LookAt Constraint
Position Constraint
Orientation Constraint
Expression Controller
Wire Parameter
ExposeTM
:
조금 많은가?
82. 목록이 많다 어쩌다 해도
결국 다 구현하긴 했다
Reaction Controller
LookAt Constraint
Position Constraint
Orientation Constraint
Expression Controller
Wire Parameter
ExposeTM
:
84. 절차적 리깅 시스템의 구현
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
85. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
86. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
87. 3DS MAX의 컨트롤러는 IReactor란 이름으로 구현되어 있다
공통 인터페이스
// 실제 인터페이스와 일치하지 않는 것에 주의
class IReactor {
public:
virtual void Preprocess() = 0;
virtual void Process(const ProcessOption&) =0;
virtual const ReactorResult& GetResult() const = 0;
};
89. 아들이 아버지와 어머니,
어느 쪽에도 치우치지 않는
중간적인 위치를 견지하고 있다
<어른의 인형 놀이> 중
M2 PSM, 한상원
90. 첫번째로 접하는 컨트롤러이니만큼 구현이…
너무나 쉬운 컨트롤러
void PositionConstraint::Process(/* 생략 */)
{
위치 컨스트레인트 타겟 위치를 가중치 합산
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
T를 이용, 합산 결과를 부모의 로컬 공간으로 이동
계산된 결과를 저장
}
91. 컨스트레인트 타겟의 위치를 블렌딩한다
1. 목표 지점을 계산
void PositionConstraint::Process(/* 생략 */)
{
위치 컨스트레인트 타겟 위치를 가중치 합산
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
T를 이용, 합산 결과를 부모의 로컬 공간으로 이동
계산된 결과를 저장
}
92. 블렌딩된 위치를 포지션 컨스트레인트가 걸려 있는 본의
2. 로컬 좌표로 변환
void PositionConstraint::Process(/* 생략 */)
{
위치 컨스트레인트 타겟 위치를 가중치 합산
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
T를 이용, 합산 결과를 부모의 로컬 공간으로 이동
계산된 결과를 저장
}
95. Keep Initial Offset 옵션은 포지션 컨트스트레인트 계산 결과와
초기의 어긋남을 보존
PositionAtConstraint가 Keep initial offset
걸려 있는 본의 옵션에 의해서
바인드 포즈의 위치 이동된 위치
96. Keep Initial Offset 옵션을 포함하는
옵셋을 반영한 슈도코드
void PositionConstraint::Preprocess()
{
keep initial offset이 켜진 경우, 포지션 컨스트레인트의
계산 결과와 바인드 포즈의 차이를 [옵셋]으로 보존해둔다
}
void PositionConstraint::Process(/* 생략 */)
{
위치 컨스트레인트 타겟 위치를 가중치 합산
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
T를 이용, 합산 결과를 부모의 로컬 공간으로 이동
keep initial offset이 켜진 경우, 계산 결과에 [옵셋]을 더한다
계산된 결과를 저장
}
40
98. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
99. 전통적인 애니메이션 프로그래밍에서 트랜스폼은 순서대로 계산
인덱스 순서대로?
0
1 8
2 5 9 10
3 4 6 7 11 12 13 14
100. 하지만 보조 본들은 순서대로 계산된다고 보장할 수 없다
다른 본을 참조하면?
0
1 8
2 5 9 10
3 4 6 7 11 12 13 14
101. 좋은 방법이 떠오르지 않으니 일단…
개별 컨트롤러가 계산?
void PositionConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
위치 컨스트레인트 타겟 위치를 가중치 합산
T를 이용, 합산 결과를 부모의 로컬 공간으로 이동
keep initial offset이 켜진 경우, 계산 결과에 [옵셋]을 더한다
계산된 결과를 저장
}
void PositionConstraint::GetDependancy(vector<int>& dependancies)
{
dependancies에 위치 컨스트레인트 타겟들을 추가한다
}
90
102. 이 방법이 그렇게 쉽지가 않다
구현에 따라서 복잡
void LookAtConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
자신의 위치를 T를 사용해서 부모 공간으로 변환
쳐다보기 타겟의 위치를 가중치 합산
T를 사용, 부모의 로컬 공간으로 이동시켜서 쳐다볼 방향을 계산
위쪽 방향 타겟을 T를 사용, 업 벡터를 계산
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
void LookAtConstraint::GetDependancy(vector<int>& dependancies)
{
dependancies에 쳐다보기 타겟들을 추가한다
dependancies에 업 노드를 추가한다
}
103. 컨트롤러 타입에 따라서 점점 더 복잡해지고
ReactionController?
const ReactorResult
ReactionControllerBase::Process(/* 생략 */)
{
정렬된 마스터/슬레이브 리액션 리스트에서 주어진 마스터 값을 넘지 않으면서
가장 큰 마스터/슬레이브 인덱스를 찾는다
찾아낸 리액션과 다음 리액션을 보간하여 반환한다
}
void ReactionControllerBase::GetDependancy(vector<int>& dependancies)
{
foreach (마스터 값 m에 대해서)
m.GetDependancy(dependancies);
}
void IReactorExprIDHandler::GetDependancy(vector<int>& dependancies)
{
익스포즈 노드를 dependancies에 추가한다
레퍼런스 노드를 dependancies에 추가한다
}
104. 감당해야 할 필요가 없는 복잡한 작업을 감당해야 하는 상황에 이른다
수식에서는…???
class ReactorExpressionBinary {
void GetDependancy(std::vector<int>& dependancies);
};
class ReactorExpressionID {
void GetDependancy(std::vector<int>& dependancies);
};
class ReactorExpressionFunction {
void GetDependancy(std::vector<int>& dependancies);
};
class ReactorExpressionConstant {
void GetDependancy(std::vector<int>& dependancies);
};
class ReactorExpressionList {
void GetDependancy(std::vector<int>& dependancies);
};
class ReactorExpressionFunction {
void GetDependancy(std::vector<int>& dependancies);
};
115. 자동으로 계산 순서를 구축하기 때문에, 기능을 확장하더라도
안전, 정확한 순서 보장
116. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
117. 거의 대부분의 컨트롤러의 계산 과정에서
월드 트랜스폼을 요구
void OrientationConstraint::Preprocess()
{
keep initial offset이 켜진 경우, 오리엔테이션 컨스트레인트의
계산 결과와 바인드 포즈의 차이를 [회전 옵셋]으로 보존해둔다
}
void OrientationConstraint::Process(/* 생략 */)
{
if (로컬 공간 보간 모드)
컨스트레인트 타겟의 로컬 회전을 기록
else // 월드 공간 보간 모드
컨스트레인트 타겟을 부모 본의 로컬 공간으로 옮겨서 기록
가중치 합산하여 회전을 계산한다
keep initial offset이 켜진 경우, 계산 결과에 [회전 옵셋]을 더한다
계산 결과를 저장
}
123. 메모리 상에서 캐시 관리 문제로 기대보다는 성능 향상이 낮지만
전체 재계산 회피 가능
…이라고 2009년 상반기엔 생각했었으나…
124. 그때그때 계산하면 L2 캐시 미스로 인해 효율이 낮음
산발적인 접근이 문제
랜덤한 위치의 SRT와
트랜스폼을
여러 단계 찾아가게 됨
= L2 캐시 미스
125. 접근하는 메모리 공간이 시간 상에서 연속하도록
재계산을 모아줄 필요
1. 월드 트랜스폼을 재계산하는 순서를 계산
↓
2. 개별 리액터 계산에 앞서 모아서 연산
126. 포즈가 월드 트랜스폼을 재계산하는 것을 가로채 기록해두자
후킹을 통한 접근 (2)
일반 버전의
UpdateBoneWorldTransform
템플릿 특화 버전의
UpdateBoneWorldTransform
127. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
128. 거의 대부분의 컨트롤러의 계산 과정에서
부모의 역트랜스폼 요구
void OrientationConstraint::Preprocess()
{
keep initial offset이 켜진 경우, 오리엔테이션 컨스트레인트의
계산 결과와 바인드 포즈의 차이를 [회전 옵셋]으로 보존해둔다
}
void OrientationConstraint::Process(/* 생략 */)
{
if (로컬 공간 보간 모드)
컨스트레인트 타겟의 로컬 회전을 기록
else // 월드 공간 보간 모드
컨스트레인트 타겟을 부모 본의 로컬 공간으로 옮겨서 기록
가중치 합산하여 회전을 계산한다
keep initial offset이 켜진 경우, 계산 결과에 [회전 옵셋]을 더한다
계산 결과를 저장
}
129. 또한 많은 회전 컨트롤러의 계산 결과로
트랜스폼 → SRT 요구
void LookAtConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
자신의 위치를 T를 사용해서 부모 공간으로 변환
쳐다보기 타겟의 위치를 가중치 합산
T를 사용, 부모의 로컬 공간으로 이동시켜서 쳐다볼 방향을 계산
위쪽 방향 타겟을 T를 사용, 업 벡터를 계산
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
130. 매트릭스의 역을 구하는 연산과 SRT (스케일/회전/트랜슬레이션) 분해
두 연산 모두 비싸다
PolarDecompose와
함수 길이만으로도 SpectralDecompose의
쌀 수가 없는 비싼 두 함수를 거치는
인버스 트랜스폼 SRT 분해
136. 애니메이션 플레이어부터 대대적인 수정이 필요하지만
계산량 대폭 절약 가능
부모 본의 월드 트랜스폼에
스케일이 없는 경우엔
아예 인버스를 구하지 않고
수식을 풀어서 결과만 계산한다
137. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
144. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
146. pros
물리 시뮬레이션 등, 절차적 애니메이션에 대응이 자유롭다
전체적인 애니메이션 파이프라인의 유연성이 증대된다
기계나 갑옷 등의 움직임을 묘사하는데 매우 유리하다
cons
MMORPG에서 대량의 캐릭터에 사용하기엔 성능 부담이 있다
모델러 혹은 애니메이터가 활용하기 위해 기반 지식이 많이 필요하다
LOD를 고려하면 스키닝이나 프레임워크 설계가 까다롭다
147. pros
물리 시뮬레이션 등, 절차적 애니메이션에 대응이 자유롭다
전체적인 애니메이션 파이프라인의 유연성이 증대된다
기계나 갑옷 등의 움직임을 묘사하는데 매우 유리하다
cons
MMORPG에서 대량의 캐릭터에 사용하기엔 성능 부담이 있다
모델러 혹은 애니메이터가 활용하기 위해 기반 지식이 많이 필요하다
LOD를 고려하면 스키닝이나 프레임워크 설계가 까다롭다
148. pros
물리 시뮬레이션 등, 절차적 애니메이션에 대응이 자유롭다
전체적인 애니메이션 파이프라인의 유연성이 증대된다
표현 영역을
기계나 갑옷 등의 움직임을 묘사하는데 매우 유리하다
확장하는 측면에서cons
접근
MMORPG에서 대량의 캐릭터에 사용하기엔 성능 부담이 있다
모델러 혹은 애니메이터가 활용하기 위해 기반 지식이 많이 필요하다
LOD를 고려하면 스키닝이나 프레임워크 설계가 까다롭다
149. 실시간 절차적 리깅 기술은
기술의 발전의 귀결
캐릭터 표현의 복잡화 → 실시간 절차적 리깅
절차적 애니메이션
152. 3DS MAX컨트롤러의 구현 사례
디펜던시와 계산 순서 문제
최 적 화 관 련 이 슈
월드 트랜스폼 문제 | 스케일을 가진 트랜스폼 문제 | 실수 계산 성능
퍼포먼스 및 장단점 분석, 결론
QA?
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
153. 추가 노트
3DS MAX 컨트롤러의 동작과 구현
룩 앳 컨 스 트 레 인 트 | 오 리 엔 테 이 션 컨 스 트 레 인 트
리액션 컨트롤러 | 수식 컨트롤러 & 플롯 와이어 | XYZ & 리스트 시리즈
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
154. 추가 노트
3DS MAX 컨트롤러의 동작과 구현
룩 앳 컨 스 트 레 인 트 | 오 리 엔 테 이 션 컨 스 트 레 인 트
리액션 컨트롤러 | 수식 컨트롤러 & 플롯 와이어 | XYZ & 리스트 시리즈
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
156. 아버지와 어머니는 아들만 바라보고
할아버지는 멀리서 가족 모두를 지그시 바라볼 뿐,
노령 인구의 소외는 현대 한국 사회의
심각한 사회 문제로 떠오르고 있다
<어른의 인형 놀이> 중
M2 PSM, 한상원
157. 기능 설명이 명료하기 때문에 상대적으로 구현이
비교적 쉬운 컨트롤러?
void LookAtConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
자신의 위치를 T를 사용해서 부모 공간으로 변환
쳐다보기 타겟의 위치를 가중치 합산
T를 사용, 부모의 로컬 공간으로 이동시켜서 쳐다볼 방향을 계산
위쪽 방향 타겟을 T를 사용, 업 벡터를 계산
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
158. 자신의 위치를 부모 본의 로컬 공간으로 가져간다
1~2. 원점 계산
void LookAtConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
자신의 위치를 T를 사용해서 부모 공간으로 변환
쳐다보기 타겟의 위치를 가중치 합산
T를 사용, 부모의 로컬 공간으로 이동시켜서 쳐다볼 방향을 계산
위쪽 방향 타겟을 T를 사용, 업 벡터를 계산
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
159. 타겟을 월드 상에서 가중치 합산한 후에 부모 본의 공간으로 가져간다
3. 앞 방향 계산
void LookAtConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
자신의 위치를 T를 사용해서 부모 공간으로 변환
쳐다보기 타겟의 위치를 가중치 합산
T를 사용, 부모의 로컬 공간으로 이동시켜서 쳐다볼 방향을 계산
위쪽 방향 타겟을 T를 사용, 업 벡터를 계산
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
160. 간단할 것처럼 보이는…
4. 위 방향 계산
void LookAtConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
자신의 위치를 T를 사용해서 부모 공간으로 변환
쳐다보기 타겟의 위치를 가중치 합산
T를 사용, 부모의 로컬 공간으로 이동시켜서 쳐다볼 방향을 계산
위쪽 방향 타겟을 T를 사용, 업 벡터를 계산
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
162. 앞과 위를 구했으니 옆은 외적으로 간단히 계산할 수 있을 거고,
5. 회전으로 만들면 끝?
void LookAtConstraint::Process(/* 생략 */)
{
[월드 공간]→[부모 공간] 변환의 트랜스폼 T를 계산
자신의 위치를 T를 사용해서 부모 공간으로 변환
쳐다보기 타겟의 위치를 가중치 합산
T를 사용, 부모의 로컬 공간으로 이동시켜서 쳐다볼 방향을 계산
위쪽 방향 타겟을 T를 사용, 업 벡터를 계산
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
163. 이 정도면 다 된 것 같은데 롤 아웃에 아직도 남아있는 뭔가
수상한 옵션들은?
50
165. Keep Initial Offset 옵션을 포함하는
최종 슈도 코드
void LookAtConstraint::Preprocess()
{
keep initial offset이 켜진 경우, 룩 앳 컨스트레인트의
계산 결과와 바인드 포즈의 차이를 [회전 옵셋]으로 보존
}
void LookAtConstraint::Process(/* 생략 */)
{
/* 전략 */
keep initial offset이 켜진 경우, 계산 결과에 [회전 옵셋]을 더한다
앞과 위로 트랜스폼을 구성한 뒤 쿼터니언으로 변환해서 저장
}
166. 추가 노트
3DS MAX 컨트롤러의 동작과 구현
룩 앳 컨 스 트 레 인 트 | 오 리 엔 테 이 션 컨 스 트 레 인 트
리액션 컨트롤러 | 수식 컨트롤러 & 플롯 와이어 | XYZ & 리스트 시리즈
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
168. 할아버지의 회전에 따라서
온 가족이 영향을 받는 것을 알 수 있다
가족 모델로서 핵가족의 장단에 대해서
고민해봐야 하는 시점이 아닐까
<어른의 인형 놀이>
서플먼트 무비
M2 PSM, 한상원
169. 룩앳보다 어떤 의미에서는
제일 간단한 컨트롤러?
void OrientationConstraint::Process(/* 생략 */)
{
컨스트레인트 타겟의 로컬 회전 리스트를 얻는다
가중치 합산하여 계산하고 기록한다
}|
170.
171. 월드 공간 오리엔테이션 블렌딩 모드가 있기 때문에
그럴 리가 없다…
void OrientationConstraint::Preprocess()
{
keep initial offset이 켜진 경우, 오리엔테이션 컨스트레인트의
계산 결과와 바인드 포즈의 차이를 [회전 옵셋]으로 보존해둔다
}
void OrientationConstraint::Process(/* 생략 */)
{
if (로컬 공간 보간 모드)
컨스트레인트 타겟의 로컬 회전을 기록
else // 월드 공간 보간 모드
컨스트레인트 타겟을 부모 본의 로컬 공간으로 옮겨서 기록
가중치 합산하여 회전을 계산한다
keep initial offset이 켜진 경우, 계산 결과에 [회전 옵셋]을 더한다
계산 결과를 저장
}
172. 일단 귀찮지만 LookAtConstraint와
옵셋 보존 계산은 동일
void OrientationConstraint::Preprocess()
{
keep initial offset이 켜진 경우, 오리엔테이션 컨스트레인트의
계산 결과와 바인드 포즈의 차이를 [회전 옵셋]으로 보존해둔다
}
void OrientationConstraint::Process(/* 생략 */)
{
if (로컬 공간 보간 모드)
컨스트레인트 타겟의 로컬 회전을 기록
else // 월드 공간 보간 모드
컨스트레인트 타겟을 부모 본의 로컬 공간으로 옮겨서 기록
가중치 합산하여 회전을 계산한다
keep initial offset이 켜진 경우, 계산 결과에 [회전 옵셋]을 더한다
계산 결과를 저장
}
173. 프로그래머의 기대를 여지없이 배반해버리는
트랜스폼 규칙
void OrientationConstraint::Preprocess()
{
keep initial offset이 켜진 경우, 오리엔테이션 컨스트레인트의
계산 결과와 바인드 포즈의 차이를 [회전 옵셋]으로 보존해둔다
}
void OrientationConstraint::Process(/* 생략 */)
{
if (로컬 공간 보간 모드)
컨스트레인트 타겟의 로컬 회전을 기록
else // 월드 공간 보간 모드
컨스트레인트 타겟을 부모 본의 로컬 공간으로 옮겨서 기록
가중치 합산하여 회전을 계산한다
keep initial offset이 켜진 경우, 계산 결과에 [회전 옵셋]을 더한다
계산 결과를 저장
}
60
174. 계층 구조가 서로 무관한 본의 회전을 블렌딩하기 위해서 필요
‘보이는 대로’ 블렌딩
로컬+15도
회전
(최종 30도)
자식
Local→Local인 경우
World→World로 (15 + 15) / 2 = 15도
OrientationConstraint가 World→World인 경우
부모 걸려있는 본 (15 + 30) / 2 = 22.5도,
로컬+15도
회전
175. 추가 노트
3DS MAX 컨트롤러의 동작과 구현
룩 앳 컨 스 트 레 인 트 | 오 리 엔 테 이 션 컨 스 트 레 인 트
리액션 컨트롤러 | 수식 컨트롤러 & 플롯 와이어 | XYZ & 리스트 시리즈
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
179. LocalPosition X/Y/Z, WorldPosition X/Y/Z를 처리하는
PositionEvaluator
const float PositionEvaluator::Process(/* 생략 */)
{
if (로컬 공간 값을 요구)
if (부모를 기준으로)
return 로컬 트랜슬레이션[지정된 채널]
else if (레퍼런스 본을 기준으로)
레퍼런스 본 트랜스폼 공간으로 변환
return 변환된 결과값[지정된 채널]
else // 레퍼런스가 undefined == 월드 기준
return 월드 트랜슬레이션[지정된 채널]
else
return 월드 트랜슬레이션[지정된 채널]
}
180. 로컬/월드라고 하면 간단할 것 같은데
특이한 부분?
const float PositionEvaluator::Process(/* 생략 */)
{
if (로컬 공간 값을 요구)
if (부모를 기준으로)
return 로컬 트랜슬레이션[지정된 채널]
else if (레퍼런스 본을 기준으로)
레퍼런스 본 트랜스폼 공간으로 변환
return 변환된 결과값[지정된 채널]
else // 레퍼런스가 undefined == 월드 기준
return 월드 트랜슬레이션[지정된 채널]
else
return 월드 트랜슬레이션[지정된 채널]
}
182. LocalRotation X/Y/Z, WorldRotation X/Y/Z를 처리하는
RotationEvaluator
const float RotationEvaluator::Process(/* 생략 */)
{
if (로컬 공간 값을 요구)
if (부모를 기준으로)
return 로컬 회전값[지정된 채널]
else if (레퍼런스 본을 기준으로)
레퍼런스 본 트랜스폼 공간으로 변환
return 변환된 회전값[지정된 채널]
else // 레퍼런스가 undefined == 월드 기준
return 월드 회전값[지정된 채널]
else
return 월드 회전값[지정된 채널]
}
185. 마스터 입력 이후의 float→그래프→출력 처리는 공통
키 프레임 애니메이션
재생과 동일
const ReactorResult
ReactionControllerBase::Process(/* 생략 */)
{
정렬된 마스터/슬레이브 리액션 리스트에서
주어진 마스터 값을 넘지 않으면서
가장 큰 마스터/슬레이브 인덱스를 찾는다
찾아낸 리액션과 다음 리액션을 보간하여 반환한다
}
186. 추가 노트
3DS MAX 컨트롤러의 동작과 구현
룩 앳 컨 스 트 레 인 트 | 오 리 엔 테 이 션 컨 스 트 레 인 트
리액션 컨트롤러 | 수식 컨트롤러 & 플롯 와이어 | XYZ & 리스트 시리즈
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
188. 수식을 사용하는 것 외에는 리액션 컨트롤러와 유사한 난이도
파싱만 하면 간단
매번 인터프리터 방식으로 계산하면
성능 문제가 있으므로 AST 구축이 필요
자세한 구현은 이 강의의 범위를
벗어나므로 생략
189. 수식에 사용되는 ID의 값은 리액션 컨트롤의 마스터와 거의 동일하다
구현의 재활용 가능
RotationEvaluator,
PositionEvaluator를
수식 계산에 그대로
다시 사용할 수 있다
190. 추가 노트
3DS MAX 컨트롤러의 동작과 구현
룩 앳 컨 스 트 레 인 트 | 오 리 엔 테 이 션 컨 스 트 레 인 트
리액션 컨트롤러 | 수식 컨트롤러 & 플롯 와이어 | XYZ & 리스트 시리즈
Ⓒ 2008-2010 NEXON Corporation & devCAT Studio. All Rights Reserved
M2 team, Game Development Team for Mabinogi in devCAT (The 3rd Development Division in NEXON Corp.). M2 team Director is Kim, Dong-Gun | Project W is produced by Kim, Dong-Gun
devCAT Engine team, Engine Development Team for Project W and more. Engine Team Technical Director is Jeon, Hyeong-Kyu
192. 특별한 구현이 필요하지 않을 것 같은데?
기본값과 변환을 처리
void EulerXYZ::Process(/* 생략 */)
{
if (상수인가)
기본값을 보존
foreach (X/Y/Z 각 축의 컨트롤러에 대해서)
결과값[축] = float 컨트롤러를 계산
if (컨트롤러가 FloatReactionControl)
결과값[축]을 라디안으로 변환
결과값을 쿼터니언으로 변환
else
기본값을 저장
}
194. 특별한 구현이 필요하지 않을 것 같은데?
순서대로 누적을 처리
void RotationList::Process(/* 생략 */)
{
foreach (리스트의 컨트롤러에 대해서)
[현재] = 컨트롤러의 회전 계산 결과
if 컨트롤러가 *Constraint이면
[누적] = Slerp([누적], [현재], [가중치])
else
[누적] = [누적] * [현재]
}
195. 복제 구현을 마쳤으니…
이제 계산만 하면 된다
void ReactorProcessor::Process()
{
foreach (모든 본에 대해서)
if (컨트롤러가 있다면)
컨트롤러를 계산한다
}