블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2737)
Unity3D (817)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Effect (10)
Lecture (15)
Shader (8)
Learn (6)
Shoveling (3)
Bug Report (2)
3DS Max (8)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
04-20 00:00

NiImageConverter::SetPlatformSpecificSubdirectory 란 함수를 이용해보세요.
반응형

'Gamebryo > Effect' 카테고리의 다른 글

Effect 애니메이션 초기화 방법  (0) 2011.09.21
[펌] 체인라이트닝 이펙트 만들기  (1) 2011.06.11
[펌] 이펙트 에니메이션 방법  (1) 2011.05.20
강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
Posted by blueasa
, |
저 같은 경우 예전에 이벤트 발생 했을 때 특정 노드만 애니메이션 해야 하는 기능이 있었는데요 도움이 될지 모르겠네요.
NiTimeController* pkControl = spStrongBoxDoor->GetControllers();
pkControl->SetAnimType(NiTimeController::APP_INIT);
float fAccTime = TimeMgr::GetInst()->GetAccumTime();
NiTimeController::StartAnimations(spStrongBoxDoor, fAccTime);
spStrongBoxDoor->Update(fAccTime);
NiTimeController::StopAnimations(spStrongBoxDoor);

애니메이션 시킬 노드를 초기화 하고 전체 애니 시간을 설정해 준 후 업데이트 한 다음에 멈춰 버립니다.
그 다음에 이벤트 발생 했을때 NiTimeController::StartAnimations(spStrongBoxDoor);
이렇게 호출 해서 사용 했습니다. 위와 같이 사용 하면 딱 한 루푸만 작동하고 멈췄습니다.


출처 : http://cafe.naver.com/dxgameprogramming/1661 의 리플 중 [딸기하나]님 리플..
반응형
Posted by blueasa
, |

체인 라이트닝 참 재미있는 이펙트이다.

 

MMORPG 에서 사용되는 대부분의 이펙트는 공격자->발사체->피격자 의 형태에 맞아 들어가는데

 

체인라이트닝은 이러한 구조가 여러가 엮어져 있는 형태이다.

 

 

 

 

100% 코드로 하기도 애매하고,

 

그렇다고 디자이너가 만들기도 애매한데,

 

결국 코드와 디자인을 반씩 섞어서 만드는 대표적인 이펙트가 "체인 라이트닝" 이펙트이다.

 

워크래프트3 와 와우를 보고서는 체인라이트닝 집어넣자고 기획자가 하루가 멀다하고 징징거린다.

 

참으로 큰일이지만 다른게임에서 되는거 안된다고 하기에는 내가 너무 무능해 보인다.

 

 

1) 첫 시도 -> 코드로 100% 생성을 시도하다.

 

체인라이트닝의 저러한 연출을 디자이너가 하기는 힘들다고 생각하고

코드로 연동하는것이 좋다고 생각했다.

 

게임 엔티티와 연동하는 저런 부분을 3dsMAX 에서 처리하기는 매우 힘들다고 생각했기 때문이다.

 

그래서 체인라이트닝의 번개부분을 노이즈함수 코드를 분석하면서 만들었는데

 

결과는 처참했다.

 

그냥 습작으로는 쓸만했지만 게임상에서 쓸만한 퀄리티가 아니였다.

 

솔직하게 말해서 프로그래머가 3dsMAX 로 번개를 만들어도 퀄리티가 엉망일텐데,

 

코드로 SetPosition 하면서 만든 번개가 퀄리티가 좋을리 없었다.

 

결국 코드로 100% 생성한 체인 라이트닝인 폐기 되었다.

 

 

2) 2차 시도, 체인라이트닝을 생각해보자.

체인 라이트닝 이펙트 자체를 분석하면서

 

체인라이트닝에서 실질적으로 연동해야 하는 부분은

결국 A->B->C->D 로 개별 장거리공격이 연장되는 요소밖에 없다는것을 알게 되었다.

 

그렇다면 개별요소 A->B, B->C, C->D 로 가는 개별 이펙트 자체는

얼마든지 맥스에서 제작할수 있었다.

 

맥스에서 체인라이트닝의 한토막만 만들고 코드로는 연결시키는것이다.

 

 

 

체인라이트닝의 애니메이션은 3부분으로 구성된다.

 

팽창기 : 번개가 공격자에서 피격자로 팽창하는 부분.

지속시간 : 번개가 지글지글 거리는 부분

수축기 : 번개가 공격자부분에서 소멸하기 시작하여 소멸하는 부분.

 

 

문제는 지금까지의 이펙트 렌더링 모듈이 키프레임 애니메이션밖에 지원하지 않아서

번개의 표현하기 위해서는 VertexAnimation 과 텍스춰 애니메이션을 추가로 지원해야 했다.

 

다른게 아니라, 디자이너가 번개를 표현하기 위해서는 맥스에 있는

Noise Modifier 를 반드시 사용해야 하는데 이를 추출할 방법이 VertexAnimation 밖에 없었다.

 

 

 

몇가지 문제가 있었다.

 

맥스에서 만든것을 단지 단순하게 공격자->피격자 거리에 따라서

늘려주기만 할뿐이니 거리에 따라서 이펙트가 왜곡되는 문제도 있었다.

 

이를 해결하는 꽁수 비슷한 방법으로

거리에 따라서 아예 이펙트를 3벌 만들었다.

 

근거리/중거리/원거리 이렇게 미리 이펙트를 3벌 만들어서 거리에 따라서

가장 비슷한 형태의 이펙트를 공격자->피격자를 연결하는데 사용했다.

 

물론 이러한 문제는 이펙트를 "코딩" 으로 제작했다면 발생하지 않는 문제이다.

하지만 "코드" 로는 디자이너의 섬세한 디자인역시 기대할수 없다는 점이 문제이다.

 

결국 맥스로 만든 이펙트를 여러벌 들고 있는것으로 타협을 보았다.

 

체인 라이트닝 이펙트는 좀 "랜덤"스러운 맛이 있어야 하는데,

 

이 부분역시 그냥 이펙트를 여러벌 들고 있는것으로 해결했다.

실제로 체인 라이트닝 이펙트는 거리당 3개, 랜덤속성을 묘사하기 위해서 추가로 3벌씩

도합 3*3 = 9 개의 이펙트가 존재했다.

 

실제로 체인라이트닝이라는 이펙트 하나를 만들기 위해서 상당한양의 리소스가 소비되었지만

그만한 가치는 있다고 판단한다.

 

내가 과연 옳은 방향으로 해결한것일까?

 

이펙트 제작에 있어서 모범 해답은 없다.

결과를 만드는것 자체가 빠듯한 상황에서 모범해답까지 찾을 사치까지 누리고 싶지는 않다.

 

글로는 한방에 스윽하고 적었지만, 게임에서 쓸수 있는 상태의 "체인라이트닝" 을 만들기 위해서

"한달" 동안 디자이너와 삽질을 해야했다.

 

디자이너가 맥스파일을 넘기면 시험삼아서 적용해보고 수정요청하고 다시 코드수정하고

맥스파일 다시 수정요청하고, 이런식으로 10번정도 반복하면 되는데,

 

아무 체계도 없는 막막한 상황에서 삽질로 하나씩 하나씩 완성하는것이니.

디자이너 입장에서도 고역이다.

 

"체인라이트닝" 한번 만들더니 "이펙트 담당할사람 따로 뽑아라" 라고 파업선언을 하더니

더이상 이펙트작업을 하지 않았다.

애니메이터에게 이펙트작업을 시킨것부터가 약간은 무리수가 있었지만 빠듯한 상황에서는 어쩔수가 없다.

 

다른사람들은 어떻게 작업하는지 궁금하다.


출처 : http://blog.daum.net/gdocument/29

반응형
Posted by blueasa
, |
이펙트를 에니메이션 시키는 방법은 약 4가지 정도가 일반적으로 사용됩니다
이 방법은 각자 장단점이 있기 때문에필요에 따라 적절한 방식을 선택하여 사용하며때로는 각 방법은 혼합해서 사용하는 경우가 많습니다

1. 오브젝트의 에니메이션


보통 이펙트는 일정 오브젝트에 텍스쳐로 그려지는 경우가 대부분입니다
특히 많이 쓰이는 방법 중 하나는 Plan 에 텍스쳐를 입혀 제작하는 것인데

이 방법과 함께 많이 쓰이는 방법은 빌보드 (Billboard)라고 하는 방식으로써제작된 plan이 언제나 카메라 쪽을 바라보게 함으로써 이펙트를 평면처럼 보이지 않게 하는 방법입니다

이렇게 plan에 적용한 이펙트는지형이나 오브젝트에 닿게 되면 잘려 보이는 현상이 일어나서 plan임을 들키기 쉽다는 단점이 있습니다.



그리고 이렇게 오브젝트에 적용된 이펙트는오브젝트를 회전시키거나 크기를 에니메이션 시켜서 이펙트를 에니메이션 시킬 수 있습니다
이 방식은 단순히 회전이나 크기이동를 에니메이션 시킬 수 밖에 없다는 단점을 가지고 있습니다이펙트의 모양을 변하게 하기 위해서는 다른 방법을 사용해야 합니다



2. 텍스쳐 좌표 에니메이션

텍스쳐 좌표의 에니메이션은 Unwrap 을 이용한 맵핑 좌표를 에니메이션 시켜서 이펙트를 에니메이션 시키는 방법입니다이 방법은 한 장의 텍스쳐에 여러 장의 에니메이션 시퀀스를 배열한 후 메 프레임마다 좌표를 이동시키는 방법으로적은 양의 프레임일 때에는 효율이 좋지만 많은 양일 때에는 불편한 단점이 있습니다
그러나 텍스쳐가 한 장으로 충분히 구현할 수 있으므로 텍스쳐의 개수를 줄이는 장점을 가지고 있습니다


1. 한 장의 텍스쳐에 에니메이션 시킬 이미지를 모두 배열합니다


2. Plan
에 이 텍스쳐를 적용시킵니다연속적으로 배열된 이미지가 한 장에 모두 배열됩니다.

3. Unwrap UVW
텍스쳐의 일부분만을 영역 지정해 준 후에니메이션 버튼을 이용하여 메 프레임 좌표를 이동시킵니다



3. Ifl 파일을 이용한 에니메이션

ifl 파일을 이용한 에니메이션은 텍스쳐 좌표 에니메이션처럼 각 에니메이션 시퀀스 이미지를 에니메이션 시킨다는 것은 동일하지만그 각각의 이미지가 파일로 독립되어 있고, ifl 이라고 불리는 파일 포멧으로 그 에니메이션을 제어한다는 것이 다른 점입니다
파일 개수가 많아진다는 단점이 존재하지만사용하기에는 상대적으로 간단한 방법입니다

1. 
에니메이션 텍스쳐를 준비합니다각각 다른 파일로 준비합니다.

2. 
에니메이션 이펙트 텍스쳐가 있는 폴더에 txt 파일을 하나 만들어 넣고다음과 같이 각 에니메이션 프레임의 파일명을 작성합니다뒤에 있는 숫자는 각 파일별 프레임 속도입니다숫자가 클수록 느리게 됩니다


3. 
파일 확장자를 ifl로 바꾼 다음텍스쳐와 동일한 폴더에 저장한 후이 파일을 이용해서 텍스쳐링하면 에니메이션 됩니다


4. 파티클을 이용한 에니메이션

파티클은 3D max 에 기본적으로 포함되어 있는 파티클 시스템을 의미합니다
많은 게임 엔진에서 3dmax의 파티클 시스템을 그대로 게임 엔진으로 컨버팅 하는 기능을 가지고 있지만일부 엔진에서는 이 기능을 지원하지 않고따로 자체 툴을 제작하여 제공하는 경우도 있습니다


만약 엔진이 3D max의 파티클 시스템을 지원한다면, 3D max의 파티클 시스템을 이용하여 이펙트를 제작하기만 하면 게임 엔진에도 그대로 들어갑니다
일반적으로 파티클을 이용한 이펙트는 퀄리티가 좋지만부하가 많이 걸리는 작업입니다




5. 쉐이더를 이용한 에니메이션 방법 (추가)

http://chulin28ho.egloos.com/4784689


출처 : 
http://chulin28ho.egloos.com/4652773 
반응형

'Gamebryo > Effect' 카테고리의 다른 글

Effect 애니메이션 초기화 방법  (0) 2011.09.21
[펌] 체인라이트닝 이펙트 만들기  (1) 2011.06.11
강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
Posted by blueasa
, |

게임브리오 파티클 시스템 예제

programmatic particle systems.zip

출처 : http://freewill.egloos.com/867049
반응형

'Gamebryo > Effect' 카테고리의 다른 글

[펌] 체인라이트닝 이펙트 만들기  (1) 2011.06.11
[펌] 이펙트 에니메이션 방법  (1) 2011.05.20
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
Posted by blueasa
, |
Setup about Effect Dumy…




작성 / 이 정 표

leegoongtr@naver.com








2006년 7월 을 기준으로 하여 팔에 붙는 더미는 1개로 통합 되었음을 미리 말씀 드립니다.

해당 이미지는 7월 이전의 셋팅에 기준 한 것이니 착오 없길 바랍니다.

하나로 통합 될 foot dumy 는 center dumy 와 같은 이름의 형식으로 바이펫의 footstep 위치에 위치 하게 됩니다. 법석씨께 확인 바랍니다.








더미의 생성 : 적당한 크기로 처음 생성하십시오.처음 생성하면 스케일값 100 으로 설정 됩니다.어떤 크기로 생성 하던지 초기 값은 아마 100 으로 설정 될겁니다.

가능한 더미의 크기를 변형 하지 마십시오.처음 생성할 때 적당한 크기로 생성을 해야 합니다.






더미의 위치 : 생성한 더미를 선택하고 해당 이름을 정해 준 후 해당 파트 즉 R_Handdumy 라고 한다면 이 더미를 선택하고 얼라인 툴로 바이펫의 RHand 에 정렬하도록 합니다. 정렬할때 피봇포인트가 아니라 센터 로 설정 하고 하시면 됩니다.

또는 셋팅 하시는 분이 어느정도 감으로 위치를 잡으셔도 무방합니다.

이 더미는 손에 붙을 이펙트의 위치를 잡기 위함과 무기 아이템의 위치 기준 더미가 될 것입니다.








위치를 모두 잡았다면 더미의 로컬 피봇을 확인합니다.

로컬피봇은 Up Vector 가 Z 로 되어 있어야 합니다.

만약 이 설정을 할 때 피봇이 잘 못 되어 있다면 아래 그림과 같이 Affect Pivot Only 활성후 Align to World 하면 큰 문제 없을 것입니다.





모든 피봇 셋팅이 끝났다면 모든 해방 더미를 해당 바이펫 노드에 차일드로 링크 걸어 줍니다.

단 Spinedumy 는 바이펫의 Spine 이 3 개 라고 가정 하에 Bip01 Spine1 에 걸도록 합니다.

























마지막으로 더미에 겜브리오 고유 속성을 붙혀 줘야 합니다.





더미를 모두 선택 하고 Keep 이라고 붙어 있는 아이콘을 클릭하여 팝업창을 엽니다.

위 그림처럼 체크박스에 체크 한 후 Apply to Selection This 버튼을 클릭 한 후 프로퍼티 유저 디파인을 보고 고유 속성이 잘 붙어 있는지 확인 합니다.

NiOptimizeKeep 이라고 붙어 있으면 된겁니다.

위치는 상관 없습니다.

이렇게 하여 더미의 기본 셋팅은 끝납니다.

반응형

'Gamebryo > Effect' 카테고리의 다른 글

[펌] 이펙트 에니메이션 방법  (1) 2011.05.20
강의자료 - 파티클 예제  (0) 2011.03.22
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
이펙트 작업에 필요한 기능  (0) 2011.01.27
Posted by blueasa
, |

겜브리오의 파티클은 NiParticleSystem에서 관리한다이 클래스는 NiGeometry에서 파생되었고 모양도 가지고 있다또한 이 파티클이 키프레임에 의해서 제작되었다면 컨트롤러를 가지고 있다이 파티클에 대한 컨트롤러는 NiPSysEmitterClrl 이다.

NiParticleSystem은 수정자(modifier)를 가지고 있다이 수정자를 이용해 파티클 시스템의 전반적이 부분을 제어할 수 있을 것이다참고 수정자는 아래와 같다.

-       NiPSysAgeDeath(파티클의 나이와 죽음 관리)

-       NiPSysBoxEmitter(바운딩 볼륨 관리)

-       NiPSysSpawnModifier(파티클 생성 관리이지만 사용 못 해봤다.)

-       NiPSysGrowFadeModifier(파티클 크기나 성장을 관리)

-       NiPSysGravityModifier(파티클 중력 관리)

-       NiPSysPositionModifier(파티클 위치 관리)

-       NiPSysBoundUpdateModifier(사용 안해봤다.)

 

파티클의 양을 조절하기 위해서는 위의 수정자에서 해결하지 못한다그것을 하기 위해서는 파티클 시스템의 컨트롤러를 제어해야한다아티스트는 키프레임에 파티클의 양을 기록하기 때문인데 이것은 컨트롤의 NiInterpolator에 저장되어 있다우린 파티클 시스템의 컨트롤러를 얻고 그 컨트롤러에서 Interpolator를 얻어서 수정해야 파티클의 양이 조절될 것이다아마 이와는 다른 방법으로 파티클을 제작하였다면 그 때 NiPSysSpawnModifier가 작동되지 않을까 한다.

 

[기본소스]

void JrManagerParticle::Traverse(NiAVObjectpkAVObject)

{

        ifNiIsKindOf(NiParticleSystempkAVObject) )

        {

               NiParticleSystempkPaticleSystem = NiDynamicCast(NiParticleSystempkAVObject);

               NiTimeControllerpkControl = pkPaticleSystem->GetControllers();

               ifNiIsKindOf(NiPSysEmitterCtlrpkControl))

               {

                       NiPSysEmitterCtlrpkEmitterCtlr = NiDynamicCast(NiPSysEmitterCtlrpkControl);

                       NiFloatInterpolatorpkInterpolator = pkEmitterCtlr->GetBirthRateInterpolator();

                       pkInterpolator->SetPoseValue(100);

                       int t = 0;

               }

 

 

               int nTotal = pkPaticleSystem->GetModifierCount();

 

/*

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(0));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(1));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(1));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(1));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(2));

*/

 

               for(int i=0;i<nTotal;++i)

               {

                       NiPSysModifierpPSysModifier = pkPaticleSystem->GetModifierAt(i);

                       ifNiIsKindOf(NiPSysSpawnModifierpPSysModifier) )

                       {

                              NiPSysSpawnModifierpParticleModifier = NiDynamicCast(NiPSysSpawnModifierpPSysModifier);

                       }

 

                       ifNiIsKindOf(NiPSysGravityModifierpPSysModifier) )

                       {

                              NiPSysGravityModifierpParticleModifier = NiDynamicCast(NiPSysGravityModifierpPSysModifier);

                       }

 

                       ifNiIsKindOf(NiPSysBoxEmitterpPSysModifier) )

                       {

                              NiPSysBoxEmitterpParticelEmitter = NiDynamicCast(NiPSysBoxEmitterpPSysModifier);

                              //pParticelEmitter->SetSpeed(1.0f);

                              //pParticelEmitter->SetLifeSpan(10);

                              //pParticelEmitter->SetLifeSpanVar(1000);

                              //pParticelEmitter->SetEmitterWidth(5);

                       }

 

//                     NiPSysAgeDeathModifier* pAgeDeathModifier = (NiPSysAgeDeathModifier*)pPSysModifier;

//                     NiPSysSpawnModifier* pPSysSpawnModifier = pAgeDeathModifier->GetSpawnModifier();

//                     pPSysSpawnModifier->SetMaxNumToSpawn(0);

//                     pPSysSpawnModifier->SetMinNumToSpawn(0);

 

                       //pkPaticleSystem->RemoveModifier(pPSysModifier);

                       int c = pkPaticleSystem->GetModifierCount();

                       int t = 0;

 

                       //pPSysModifier->SetActive(false);

               }

               int c = pkPaticleSystem->GetModifierCount();

               int t = 0;

        }

 

        ifNiIsKindOf(NiNodepkAVObject) )

        {

               NiNodepkNode = NiDynamicCast(NiNodepkAVObject);

               for(unsigned int i=0;i<pkNode->GetArrayCount();++i)

               {

                       Traverse(pkNode->GetAt(i));

               }

        }

}



출처 : http://talkon.egloos.com/498126

반응형

'Gamebryo > Effect' 카테고리의 다른 글

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
이펙트 출력  (0) 2011.02.08
이펙트 작업에 필요한 기능  (0) 2011.01.27
검광, 검기 잔상 효과에 대하여...  (1) 2011.01.21
Posted by blueasa
, |

이펙트 출력

Gamebryo/Effect / 2011. 2. 8. 17:03

이펙트 애니메이션이 종료되는 시점(이펙트 애니메이션 시간)을 알아야한다.
아래 함수는 이펙트 애니메이션 길이(시간)을 알아내는 함수이다.

//////////////////////////////////////////////////////////////////////////////
<이펙트 출력 순서>
1. 이펙트를 로딩한다.
2. 아래 함수를 통해 애니메이션 길이(m_fAnimLength)을 구한다.
3. 이펙트 애니메이션 시작 시간을 정한다.
    NiTimeController::StartAnimations( m_spEffect, m_fStartTime );
4. 이펙트 종료를 체크한다.
    if( fTime - m_fStartTime >= m_fAnimLength )
        m_spEffect = 0;   // 이펙트 노드 제거
    else
        m_spEffect->Update( fTime );
//////////////////////////////////////////////////////////////////////////////

void RecursiveGetAnimRange(NiAVObject* pkObject, float& rfLoKeyTime, float& rfHiKeyTime)
{
    NiTimeController* pkController = pkObject->GetControllers();
    while ( pkController )
    {
        float fLoTime = pkController->GetBeginKeyTime();
        float fHiTime = pkController->GetEndKeyTime();
        if ( fLoTime < rfLoKeyTime )
            rfLoKeyTime = fLoTime;
        if ( fHiTime > rfHiKeyTime )
            rfHiKeyTime = fHiTime;

        pkController->SetAnimType( NiTimeController::APP_INIT );
        pkController = pkController->GetNext();
    }

    // Do the same for any animation controllers attached to the rendering properties
    if ( NiIsKindOf( NiAVObject, pkObject ) )
    {
        NiAVObject* pAVObj = (NiAVObject*)pkObject;
        pAVObj->SetSelectiveUpdate(true);
        pAVObj->SetSelectiveUpdateTransforms(true);
        pAVObj->SetSelectiveUpdatePropertyControllers(true);
        pAVObj->SetSelectiveUpdateRigid(false);

        NiTListIterator kPos = pAVObj->GetPropertyList().GetHeadPos();
        while ( kPos )
        {
            NiProperty *pProp = pAVObj->GetPropertyList().GetNext( kPos );
            if ( pProp )
            {
                for ( pkController = pProp->GetControllers(); pkController; pkController = pkController->GetNext() )
                {
                    float fLoTime = pkController->GetBeginKeyTime();
                    float fHiTime = pkController->GetEndKeyTime();
                    if ( fLoTime < rfLoKeyTime )
                        rfLoKeyTime = fLoTime;
                    if ( fHiTime > rfHiKeyTime )
                        rfHiKeyTime = fHiTime;

                    pkController->SetAnimType( NiTimeController::APP_INIT );
                }
            }
        }

    }

    if ( NiIsKindOf( NiNode, pkObject ) )
    {
        NiNode* pkNode = (NiNode*)pkObject;
        for ( unsigned int i = 0; i < pkNode->GetArrayCount(); ++i )
        {
            NiAVObject* pkChild = pkNode->GetAt( i );
            if ( pkChild )
                RecursiveGetAnimRange( pkChild, rfLoKeyTime, rfHiKeyTime );
        }
    }
}


------------------------------------------------------------------
ex)
    float fLoTime =  NI_INFINITY;
    float fHiTime = -NI_INFINITY;
    RecursiveGetAnimRange( m_spModel, fLoTime, fHiTime );
    m_fAnimLength = fHiTime - fLoTime;    // 애니메이션 전체 시간 계산

[출처] GameBryo - 이펙트 출력|작성자 모냐

반응형

'Gamebryo > Effect' 카테고리의 다른 글

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 작업에 필요한 기능  (0) 2011.01.27
검광, 검기 잔상 효과에 대하여...  (1) 2011.01.21
Posted by blueasa
, |

이펙트 작업을 위해서... 이런것들이 필요 합니다.^^

 

회사를 옮길때 마다 부탁을 해야 하는 겨우가 생기더군요.^^

그렇게 중요한 내용은 아니지만 작업 할때 가끔 필요하다라고 생각이 드는 경우가 있어서...

나중에 프로그래머님들게 부탁 좀 할려고 정리좀 해봅니다.^^

 

간혹 지원을 하지 않는 엔진이 있어서...^^ 

 

 

------------------ Tip ------------------

오른손 좌표계: OpenGL 사용.

 

왼손 좌표계: Direct 3D 사용.

 

[축:axis]

-월드 축: 항상 고정이 되어 있는 축. 변화지 않는 축 입니다.

             (지구의 남과 북이 변화지 않는것 처럼, X, Y, Z,절대 절대 변화지 않는 축)

 

-로컬 축: 움직임에 따라, 축이 바라 보는 방향이 변화는 축

             ( 오브젝트 생성시 가지고 있던 축. 움직임에 따라 항상  축은 유지하되, 바라 보는 방향은

                변한다.)

-----------------------------------------

 

[ 이펙트 작업에 필요한 기능 ]

 

1) 캐릭터에 이펙트 작업시 링크 기능 지원.

-아래 이미지 처럼 각각의 Biped와 Bone, Dummy, 특정네임(프로그래머가 설정해준 네임), 등등... 이펙트가 필요로 하는 모든 네임에 링크가 가능 해야 한다.

 

-빨강점은 이펙트와 링크가 되면 위치하는 지점.

 

-캐릭터의 이펙트 작업시.

 *Biped와 Bone, Dummy, center, 특정네임에 로컬 축, 월드 축을 지원.

 *Biped와 Bone, Dummy, center, 특정네임에 링크 방식과 비 링크 방식 지원.

  (비 링크 방식일때는 워치또는 회전 값만을 사용 할뿐 Biped와 Bone, Dummy, center

   특정네임에 움직임에 반응 하지 않는다.)

*버프 계열 이펙트 작업시 머리에 생성 되는 이펙트 지원.

 (머리에서의 일정 높이를 항상 유지 하며, 캐릭터의 이동시 같이 움직인다. 단 캐릭터의 회전

  값을 인식 해서는 안된다.)

 

 

2) 메쉬 오브젝트가 지원.

-맥스에서 작업한 메쉬 오브젝트의 move, rotate, scale, UVmap 애님, opasity 등을 지원 해야 한다.

 

-씨퀀스 및 16분할 맵 소스 지원.

 

-2-sided 지원.

 

 

 3) 다양한 쉐이더 모드 / 레이어 모드 지원.

-add, multiply, alpha인식, overlay, colorkey.. 등등 다양한 레이어 모드 지원.

(포토샾의 레이어 기능을 참고)

 

-맥스에서의 기본적인 meterrial 과 글로우 효과, 고스트 효과, 카멜레온 효과, 굴절 효과 같은 특수한 쉐이더 효과들이 지원 되야 한다.

(아래 이미지는 쉐이더 효과를 합성툴에서 만들어 본 이미지)

 

4) 기본 빌보드 지원

-기본 적으로 이펙트 툴에 파티클, 빌보드 방식이 포함 되어 있지만, 모든 엔진이 그런 것이 아님으로 필요시 프로그래머에게 요청을 해야 한다.

 

-빌보드는 (단독1~5정도)으로 사용 할때는 메쉬와 비슷 하지만, 여러개(10개 이상)를 사용 하며, 파티클과 비슷한 개념으로 생각 해야 한다.

(파티클 하나 하나를 보면 빌보드와 비슷 하다고 보면 된다. 간다하게 맥스에서 파티클에 맵을 한번 해보면 알수 있다.)

 

-기본 빌보드는 맥스 Plane[정 사각형 판]이라고 보시면 되고, 기본 빌보드는 항상 카메라만을 주시 하면서 정면만을 보여준다.

 

-기본 빌보드의 갯수 증가 기능 및 위치 랜덤 생성 기능.

(파티클의 기능에 누가 되지 않는 만큰의 갯수 약 5~8개 정도이며, 생성시에는

  위치가 랜덤하게 발생 해야 한다.)

 

-2-sided 지원.

 

-빌보드 종류.

 *기본적인 빌보드.(항상 카메라만 본다)

 *방향을 바꿀수 있는 빌보드.(원하는 방향을 설정 할수 있다.)

 *박스 형태의 빌보드.(위/아래는 면이 없다.)

 *원통형의 빌보드.(위/아래는 면이 없으며, 면을 수를 조절이 가능 해야 한다.)

 *한쪽 축이 고정된 빌보드이며, 카메라만 항상 바라 본다.

  ( 기본 빌보드에 1개의 축을 고정 해준다.)

 *기타... 엔진에서 지원되는 빌보드.

 

-빌보드 지원 기능

 *move, rotate, scale, opasity 기능 지원.

 *씨퀀스 및 16분할 맵 소스 지원.

 *loop 기능 지원

 *Biped와 Bone, Dummy, center, 특정네임에 로컬 축, 월드 축을 지원.

 *Biped와 Bone, Dummy, center, 특정네임에 링크 방식과 비 링크 방식 지원.

  (비 링크 방식일때는 워치또는 회전 값만을 사용 할뿐 Biped와 Bone, Dummy, center

   특정네임에 움직임에 반응 하지 않는다.)

 

5) 트레일 효과 지원.

 -검의 잔상 기능.

  (맥스에서고스트 트레일 효과와 비슷 기능.)

 

-잔상의 왜곡 효과.

 (굴절 현상)

 

5) 파티클 툴의 부수적인 기능 지원.

-기본적으로 particleIllusion정도의 툴.

 

- Biped와 Bone, Dummy, center, 특정네임에 로컬 축, 월드 축을 지원.

 

-Biped와 Bone, Dummy, center, 특정네임에 링크 방식과 비 링크 방식 지원.

  (비 링크 방식일때는 워치또는 회전 값만을 사용 할뿐 Biped와 Bone, Dummy, center

   특정네임에 움직임에 반응 하지 않는다.)

 

-파티클을 모으는 방식 지원.

 (보통은 퍼지는 기능은 되지만, 기를 모을때 사용할수 있는 기능은 지원 안 하는 경우가 많다.)

 

-링크된 파티클과 파티클 사이에 보간 기능 지원.

 (Bip01 R Thigh와 Bip01 R Calf 사이에 파티클 링크시, 링크된 위치에서만 파티클이 발생 하기

  때문에, 링크된 사이에는 파티클이 발생 할수 있게 해준다.)

 

-파티클의 트레일 발생 지원.

 (귀무자의 기를 빨라 드리는 효과를 참고 하면 된다.)

 

-파티클 타이밍 조절 지원.

(1프레임에 100개의 파티클을 전부 불출 또는 10프레임 있다가 100프레임을 전주 분출 등등..)

 

-파티클 발생 방식.

 *움직임에 영향을 받지 않는 방식.

   (별이 반짝이는 것처럼, 처음 생성 위치에서 발생 하면 아무런 영향을 받지 않으며, 파티클의

    꼬리가 생기지 않는다.)

 *움직임에 영향을 받는 방식

   (대표적으로 파티클의 꼬리가 발생 한다.)

 

6) 데칼 기능 지원.

-마법진과 또는 바닥 이펙트 처리에 사용 되는 방식.

(바닥의 왜곡면과 상관 없이, 발생 하는 기능. 간혹 왜곡이 아주 심한 경우에는

 이펙트 모양이 늘러지게 보이는 경우가 있다.)

 

==========================================================================================

아래의내용들은 이펙트 작업시 필요 하다라고 느끼거나, 있어으면 하는 것들을 적어 본 것입니다.

 그렇다고, 꼭! 이 기능이 이었야 작업을 잘 할수 있는 것은 더더욱 아닙니다.

부족함에 약간의 도움을 주기 위해서 라는것을 알아 주시길....^^

==========================================================================================

반응형

'Gamebryo > Effect' 카테고리의 다른 글

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
검광, 검기 잔상 효과에 대하여...  (1) 2011.01.21
Posted by blueasa
, |

게임코디에서 글을 읽다가 검기 이펙트 구현에 대한 글을 보았다.

지피지에서 검광으로 검색해서 찾은 쓰레드에서 얻은 정보들~!

 

 

지피지의 관련 쓰레드

http://www.gpgstudy.com/forum/viewtopic.php?t=18848&highlight=%B0%CB%B1%A4

 

 

D3DXVec3CatmullRom 함수를 이용해 Catmull-Rom Splines를 소개하는 사이트

http://www.mvps.org/directx/articles/catmull/#demo

 

 

Catumull-Rom 스플라인을 이용한 Path 보간 데모

http://www.mvps.org/directx/articles/catmull/lightmap.zip

 

 

 

 

 

그나저나,

감버려에서도 검기, 검광 잔상을 보여주는 샘플이 있긴하다.

Eturnum 이란 풀데모를 보면 NPC가 들고 다니는 창의 날에 검기 잔상이 알흠답게 남는다.

나중에 필요할 때 자세히 봐둬야할듯~

 

대충 훑어보니 동적인 TriShape를 검기의 보간된 궤적에 맞춰 생성하고 아래 Swoosh 텍스쳐를 바르는 것 같다.

 

요건 검기가 보이는 순간의 스샷



[출처] 검광, 검기 잔상 효과에 대하여...|작성자 엉클 제다이


출처 :


ㅇㄹㅇㄹ

반응형

'Gamebryo > Effect' 카테고리의 다른 글

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
이펙트 작업에 필요한 기능  (0) 2011.01.27
Posted by blueasa
, |