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

카테고리

분류 전체보기 (2731)
Unity3D (814)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (57)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (51)
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
03-29 07:22
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
, |

네덜란드인가... 그 지역의 배경으로 하는 이야기중.. 댐을 막는 이야기가 있다.. 작은 구멍을 막지 않고 방치하여 홍수가 났다는 그런이야기인데....

큰 비로 홍수가 나는것처럼 한순간에 마음으로 들어올수도있지만 작은 구멍을 그냥 방치해서 마음이 흘러가는데로 나두다 어느순간에는 막지못하는 지경에 이르러 지칠때까지 막다가 결국..

 

<-선덕여왕 미실의 대사중>

목표를 위해서 사람을 이용하는것보다 사람이 목표가 되는것이 위험하다했다. 맞는말인것 같다.... 그렇지만 어쩔수없나보다.

 

 

 

GameBryo 에서 Fx Shader 를 사용하려고 하면 편리하게 제공된 클래스가 있다. Full Demo에서 사용되어지는 ShaderHelper 라는 클래스인데.. 간단히 어플리케이션 시작시 초기화와 끝날시 해제를 하여준다면 ShaderHelper에서 사용자가 설정한 디렉토리에 쉐이더파일(Fx.등등)에 쉐이더를 모아둔다면 로딩과 해제를 하여준다..

 

처음 Fx파일이 로딩될시 GameBryo Library에 보면 이 쉐이더파일을 Parsr하는  NiD3DXEffectParser라는 클래스가 있다. 이 파서에 보면 GameBryo가 어떤식으로 Fx Shader에 Application에서 Dx를 통해 제공하는 매트릭스(world, view, worldview) 등을 넘기는지를 알수있는데 그것이 세만틱과 각종 주석들이다..(물론 이건 나도 처음부터 궁금했었지만 최근에야 알게되었다, Help파일에 있드라.. 미리좀 자세히 바뒀으면..) 주석에는 desc, description, uihelp, hidden, uiwidget, none name, target, obejct, objectindex... 기타등등이 있고 Semantic을 파서하는 내용을 보면.. 세만틱 내용에 it, trans, transpose, inv, i, inverse, model, space, 기타등등의 이름을 찾아서 있으면 그것을 넘기는 식이다.. 예를들어..

float4x4 viewInv : ViewInverse < string UIType = "None"; >;  
float4x4 viewInv : InvView < string UIType = "None"; >; 

 

위 코드가 있다면 이것을 파서하여 해당단어들의 존재유무로 매트릭스를 넘긴다.위 두개코드에서 넘겨받는 viewInv는 동일하다. 세만틱에 View라는것이 있고 Inverse나 Inv가 존재하면 그걸을 InverseView로 인식하는 식이다. 다른것도 마찬가지이고 SKINBONEMATRIX3 라는 세만틱이 존재하고 그것을 이용한다면 메쉬를 Hardware skinning으로 처리하여 스킨계산을 application에서 하지 않는다.

 

맥스에서 쉐이더로 설정한 값들은 메쉬에 쉐이더 주석의 이름으로 ExtraData로 넘겨져서 들어가져 있어 셋팅을 변화하고자할때는 이 ExtraData를 찾아서 값들을 세팅하여 주면되고 맵등은 메쉬의 TexturingProperty에 shadermap 을 변경하여 주면된다.

 

그 밖에 특정 쉐이더를 직접 어떠한 노드구조 하위에 입히고자 할때에는 아래처럼 하면 된다.

void FindGeomSetMaterial(NiAVObject* pkAVObject, bool bMarkedParent, int nID)
{
  if (NiIsKindOf(NiGeometry, pkAVObject))
  {
  NiMaterial* pkMaterial;
  pkMaterial = NiSingleShaderMaterial::Create("GB_NomalOutLine_TEST");
  //if (bMarkedParent || strstr(pkAVObject->GetName(), "PlanarOccluder"))
   {
   NiGeometry* pkGeom = (NiGeometry*)pkAVObject;
   pkGeom->ApplyAndSetActiveMaterial(pkMaterial);

   const NiMaterial *pkMat = pkGeom->GetActiveMaterial();
   }
  }
  else if (NiIsKindOf(NiNode, pkAVObject))
  {
       // bool bMarked = false;
       // if (strstr(pkAVObject->GetName(), "Occluder"))   // 해당노드의 이름에 Occluder가 들어간 놈들만은. 머 이런식으로..
         bool   bMarked = true;

        NiNode* pkNode = (NiNode*)pkAVObject;

        unsigned int uiChildren = pkNode->GetArrayCount();
        for (unsigned int ui = 0; ui < uiChildren; ui++)
        {
            NiAVObject* pkChild = pkNode->GetAt(ui);
            if (pkChild)
                FindGeomSetMaterial(pkChild, bMarked, nID);
        }
    }
}

[출처]
 < Tips >: Using Fx Shader In GameBryo |작성자 메딥


반응형

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

알파 텍스쳐 블렌딩 공식  (0) 2011.07.22
[펌] Soft Particle (Depth bias blend)  (0) 2011.06.15
쉐이더  (0) 2011.04.04
HDR  (0) 2011.04.04
겜브리오 쉐이더 제작시 주의사항  (0) 2011.04.04
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
, |

 

1. Convert

 - Cameras , Lights : 씬의 카메라 및 라이트를 익스포트 할 경우 이 옵션에 체크를 합니다.(보통 체크안함)

 

2. Textures Options Sub-panel

 - Include in main NIF :  메인 NIF포멧에 포함시켜서 익스포트 할 때 체크 합니다.

   이 옵션을 사용 하면 마스터 NIF파일은 완벽한 하나의 자가 공급 패키지가 됩니다. 모든 데이타가 하나의 포멧 파일로 합쳐지기

   때문에 별도의 텍스처가 필요 없으며, 마스터 NIF파일 안의 텍스처는 공유됩니다.

   자세한 사항은 게임브리오 헬프 파일을 참고 하시기 바랍니다.

 

 - Save as separate NIFs : 텍스처 파일을 별개의 NIF로 익스포트 할 시 체크를 합니다.

   이 옵션은 마스터 NIF가 제대로 로드되기 위해서 다른 NIF파일에 의존하게 만듭니다. 즉, 별개의 텍스처 NIF파일이 있어야

   마스터 NIF 파일이 제대로 로드 된다는 것입니다.

   씬의 각 고유한 텍스처는 자체적인 NIF파일에 저장되며, 별개로 익스포트 되어진 텍스처 NIF파일들은 여러 마스터

   NIF 파일들 간에 공유 할 수 있습니다.

   이 옵션은 부수적인 NIF텍스처 파일을 찾는 검색 시간으로 인해 콘솔에서 로딩하기에는 메인 NIF 텍스처보다 느릴 수 있습니다

    

 - Original images : 텍스처를 원래의 이미지로 익스포트 할 시 체크합니다.

   이 옵션은 마스터 NIF가 제대로 로드되는데 원본 이미지 파일에 의존하게 만듭니다.

   각각의 고유한 이미지 파일은 텍스처가 공유되는 위치에 복사해야 하며, 이 작업은 max에서 제공하는 Resource Collector

   유틸리티를 통해 쉽게 처리할 수 있습니다. 그러나 지원되는 게임브리오 이미지 타입만 공유될 수 있으며, 지원되지 않는

   타입은 NIF텍스처로 익스포트 될 것입니다.

   이 방식의 또 다른 이점은 익스포트 후에도 이미지를 수정 할 수 있다는 점입니다.

 

   이 옵션의 부수적인 NIF 텍스처 파일을 찾는 검색 시간으로 인해 콘솔에서 로딩하기에는 메인 NIF 텍스처 옵션보다 느릴 수

   있습니다. 또한 랜더러가 이 이미지를 쓸 수 있으려면 중간 픽셀부터 만들어야 한다는 사실로 인해 메모리를 조각 낼 수도

   있습니다.

 

 - Original images VRAM : 이 옵션은 위에 나온 Original images와 같으나 게임브리오 중간표현 없이 곧바로 렌더러

   데이터에 로드되기 때문에 게임브리오에서 직접 지원하지 않는 이미지 형식을 사용 할 수 있으며 로드시간도 빨라지게 됩니다.

 

 - Allow NPOT Tectures : 이 옵션을 체크하면 2의 제곱이 아닌 텍스처를 크기조정 없이 익스포트 할 수 있습니다.

   2의 제곱이 아닌 텍스처는 갖가지 그래픽 카드에서 서로 다른 성능을 보이며 퍼포먼스에 나쁜 영향을 끼칠 수가 있으므로

   보통 2의 제곱 텍스처를 사용하지 않는게 좋습니다.

 

   이 옵션을 체크하지 않으면 기본적으로 익스포트가 2의 제곱이 아닌 텍스처를 발견 햇을 경우 그 텍스처의 크기는 2의 제곱에

   가장 가까운 면적으로 줄어들고 경고 메세지가 나오게 됩니다.

   이 옵션을 체크하면 익스포트가 발견된 2의 제곱이 아닌 모든 첵스처는 필러링모드가 pyramidal로 설정되어 있을지라도

   Mipmap 지원이 없는 상태로 익스포트 됩니다.

 

 

 

 

 

1. Use App Time

  - 애니메이션은 APP_TIME 애니메이션 타입을 사용하게 되고, 체크하지 않으면 APP_INIT를 사용하게 됩니다.

 프로그래머가 APP_INIT를 사용해서 익스포트 해달라고 하지 않는 이상 기본적으로 체크를 해 놓습니다.

 

2. Use existing Biped keyframes instead of sampled keyframes

  - Character Studio는 바이패드 애니메이션에 TCB key를 사용하지만 불행이도 TCB파라미터 중 어느적도 익스포트 하지

  못합니다.  이 때문에 Gamebryo 3ds max Plug-in은 키프레임을 Bezier key로 익스포트 합니다.

  이 옵션을 체크하지 않으면 Gamebryo 3ds max Plug-in은 바이페트 애니메이션을 bone 별로 프레임 당 키 한개의 속도로

  샘플링 할 것 입니다.

  남아도는 키프레임은 삭제되지만 이 프로세스는 수많은 키프레임을 생성 할 수 있기에 일반적으로 컨버전 성능이

  떨어지지 않는 이상 이 옵션을 사용 하는 것이 효과적입니다. 단, 애니메이션 컨버전 성능이 떨어질 경우에는 이 옵션을

  체크하지 말아야 하며 보통 이 옵션을 체크하면 걸음걸이 동작은 비정상적으로 나오나 자유 형식 동장은 정상적으로 나옵니다.

 

3. Skin Weight Threshold %"수치"

  - 스킨에 버텍스 당 이 "수치"%보다 적은 영향을 미치는 본의 가중치는 버려집니다.

   이 기술은 스키닝 파티션의 갯수가 최적에 못 미치는 경우 유용하게 쓰이는데 이런 경우 퍼포먼스를 현저히 개선시킬 수

   있습니다.

   물론, 최종 스킨의 정확도가 떨어질 수는 있지만 대부분의 경우 5% 미만의 가중치는 최종 애니메이션에 거의 기여하지

   못하기에 보통은 5%에서 시작됩니다. 

 

 

 

 

 

1. Process Script

  - 옆에 있는 드롭다운 리스트를 열면 알려진 모든 Process Script 가 나옵니다.

  Process Script 는 씬 그래프를 어떤 방식으로 조작할 지를 정하는 플러그을 설정하는 것이므로 프로그래머와 상의 후

 필요한 플러그인만을 적용 시킵니다.

 예를 들어 겜브리오 엔진은 물리엔진으로서는 점수가 높지 않기 때문에 물리충돌은 다른 엔진으로 대체하는 경우가 있습니다.

 해당 플러그인의 설정 수정이나 새로운 설정을 만들기 위해선 오른쪽의 Edit 버튼을 눌러 편집을 합니다.(밑에 설명)

 

2. File Export Script

  - 이 드롭다운 리스트를 열면 알려지 모든 export script를 보여집니다.

  자세한 사항은 겜브리오 헬프 파일을 참조.

 

3. Use original script template if available

  - Max 파일을 로드했을 때 이 파일의 내부 스크립트 사본이 원래의 템플릿과 동기화 되지 않았을 경우 이 옵션을 체크하면

  맥스파일에 저장된 임시 버전 대신에 원래의 템플릿 스크립트가 사용됩니다.

 

 

 

 

 

1. Platform

  - 드롭 다운 리스트를 열면 익스포트 할 타깃 플랫폼을 선택 할 수 있습니다.

  해당 타깃 플랫폼을 선택하면 이미지와 데이터의 특정 최적화와 관련하여 스크립트 동작이 바뀔 수 있습니다.

  'Generic' 'Xbox 360' 'Platstation3' 'DX9' 가 있습니다.

  프로그래머와 상의합니다.

 

2. Image file subdirectory

  - 텍스처를 외부 NIF로 익스포트 할 때 활성화 되는 옵션으로 외부 NIF로 저장되어지는 서브 디렉터리를 선택하거나

  다른 이름으로 저장되어지게 합니다.(쉽게 말해 텍스처NIF가 저장되어지는 폴더의 이름을 적는 곳)

 

3. Default content quality

  - 외부 텍스처 NIF나 내부 텍스처로 익스포트 할 때 텍스처의 디폴트 퀄리티를 설정 할 수 있습니다.

  별개의 설정을 하지 않은 모든 텍스처를 최종적으로 'Defaults~Palettized'로 만드는 것이며,

  다른포멧파일(예:DXT5)로 익스포트 해야 한다면 메터리얼 텍스처탭에서 따로 설정을 해야 합니다.

 

4. Override Per-Texture Settings

  - default content quality 옵션을 사용 할 때는 Gamebryo Shder에서 텍스처 포맷 타입에 대해 설정된 옵션들이

  default로 Override 되지 않습니다.

  따라서 이런 설정을 Override 하고 싶은 경우엔 이 옵션에 체크해야 합니다.

 

  즉, DXT5(DDS포멧)으로 설정되어 있는 별개의 텍스처에 최종 익스포트 시 Default content quality에서 DXT1로 설정을

  하여 익스포트 할 때 체크를 해제하면 개별적으로 설정되어있는 DXT5포멧으로 익스포트 되게 되며,

  체크를 하면 최종설정인 Default content quality에서 DXT1포멧으로 익스포트 됩니다.

 

  특정 조건이 아닌 이상 체크를 하지 않는 것이 좋습니다.

  대부분은 DDS포멧의 DXT1으로 포멧을 하지만(용량이 적다) 알파값이 있으면 DDS포멧의 DXT3 ~ DXT5포멧으로 하는게

  좋습니다. 또한, 특정 노멀맵의 경우는 DDS포멧인 DXT5로 설정해야 하는 경우도 있습니다.

 

 

 

 

 

☞ Process Script Edit 버튼을 클릭하면 나오는 창.

 

 

 

 

 

1. Current Script

  - 현재 설정되어 있는 모든 스크립트가 나옵니다. 이 리스트 중에 선택된 항목은 다이얼로그의 나머지 부분에 있어

  현 스크립트가 무엇인지 결정하게 됩니다. 각 템플릿 스크립트는 괄호 안에 그 스크립트가 로드된 소스 파일을 보여줍니다.

  스크립트에서 괄호 다음에 '*'표시가 나온다면 유저가 세션에서 그 스크립트를 변경했음을 의미합니다.

 

2. New

  - 새로운 스크립트를 생성합니다.

 

3. Save

  - 현재 선택된 스크립트를 저장합니다.

 

4. Clone

  - 기존의 스크립트를 바탕으로 새로운 스크립트를 생성합니다.

  어떤 스크립트를 복제 할지 , 어떤 이름을 사용할지를 묻는 창이 나옵니다.

 

5. Rename

  - 스크립트의 이름을 변경합니다.

 

6. Script Type

  - 스크립트의 타입을 보여줍니다.

 

 

 

 

 

1. Known Plugins

  - 알려진 모든 플러그인을 보여줍니다.

 

2. Plugin List for Current Script

  - 현 스크립트에 적용되어 있는 플러그인을 보여줍니다.

  플러그인에 나열되는 순서는 이들이 실행되는 순서이며, 리스트에 있는 플러그인을 여러개 복사할 수 있고,

  각 복사본마다 서로 다른 파라미터를 지정할 수 있습니다.

 

3. Add Plugin

  - 선택된 플러그인의 새로운 인트턴스를 현 스크립트에 추가힙니다.

 

4. Remove Plugin

  - Plug-in List For Current Script 에 선택되어 있는 플러그인을 삭제합니다.

 

5. See Description

  - Plug-in List For Current Script 에 선택되어 있는 플러그인에 대한 설명서를 불러냅니다.

 

6. Edit Plugin

  - Plug-in List For Current Script 에 선택되어 있는 플러그인에 대한 편집창을 불러냅니다.

 

7. Move Up

  - Plug-in List For Current Script 에 선택되어 있는 플러그인을 한단계 위로 올립니다.

 

8. Move Down

  - Plug-in List For Current Script 에 선택되어 있는 플러그인을 한단계 아래로 내립니다.

 

 

 

 

◈  플러그인 설명

 - 해당 플러그인을 더블 클릭하거나 Edit Plugin 을 클릭하면 플러그인의 옵션창이 불러와집니다. 

 

[ Scene Graph Optimization ]

 - 메모리 오버헤드와 트래버스 시간을 줄이기 위해 Scene Graph를 Optimization(최적화)합니다.

  이 플러그인에서 최적화 할 수 있는 옵션은 매우 많으며, 스킨 파티션과 NiBoneLODController가 올바르게

  생성되려면 이 플러그인을 반드시 실행 시켜야 합니다. 

 

 

1. Remove duplicate properties

  - Scene(씬)에서 중복되는 모든 속성을 공유하게 됩니다. 기본적으로 체크되어야 하는 옵션입니다.

 

2. Remove bad NiTexturing properties

  - 씬에서 이미지 데이터가 없는 NiTecturingProperty 속성과 존재하지 않는 텍스처 좌표를 사용하는 NiTecturingProperty속성을

   제거합니다.

   3ds max와 gamebryo 3ds max Plug-in간에 발생 할 수 있는 몇몇의 필요없는 상황을 정리 하므로 기본적으로 체크되어야

   하는 옵션입니다.

 

3. Remove multi-material nodes

  - 씬에서 multi-material 노드를 모두 지웁니다. 이들은 대개 필요 없으므로 지워도 됩니다.

 

4. Remove childless nodes

  - 씬에서 자식이 없는 노드를 모두 삭제합니다.

  gamebryo는 씬그래프의 말단(leaf)노드만 렌더링 합니다. NiNode에는 가시적 지오메트리가 없으며 그에 따라 렌더링과도

  관련이 없습니다 따라서 어플리케이션이 특별히 나중에 사용할 목적으로 보관해두지 않는 한 자식이 없는 노드는 전혀

  쓸모가 없습니다. 이 함수는 오브젝트의 오버헤드를 줄이기 위해 씬에서 자식도 없고 쓰이지도 않는 모든 NiNode를 지웁니다.

  단, 노드를 그대로 두고 싶다면 반드시 3ds max 유저 지성속성(User Difined)에 "NiOptimizeKeep"라는 태그를 달아놓아야

  합니다.(대소문자 틀리면 적용 안됨)

 

5. Remove single-child nodes

  - 씬에서 자식을 하나만 두고 있는 노드의 속성과 변환과 이름을 그 자식에게 전달하고 이 노드는 삭제해버립니다.

  자식에 "NiOptimizeKeep" 태그가 달려있는 경우엔 이름이 전달되지 않습니다.

 

6. Merge sibling nodes

  - 씬의 형제 노드를 통합합니다. '두 노드가 정확히 NiNode 타입의 형제 노드이며, 이 두 노드에 NiNode 타입의 부모가 있으며

  똑같은 속성과 똑같은 visibility flag가 어태치 되어 있다' 라는 조건이 맞으면 이 두 노드는 통합 됩니다.

  두 노드가 합쳐질 수 있고 서로 다른 변환을 지니면, 두 노드의 변환은 이들이 합쳐지기 전에 자식들에게 물려집니다.

 

7. Merge sibling NiTrishape objects

  - 씬의 모든 형제 NiTriShape 객체를 통합합니다.

  ' 두 NiTriShape 객체에게 정확히 NiNode 타입인 공통의 부모가 있고 보유한 속성의 수가 같으며, 속성 포인터가 같고

  텍스처 세트 수도 같다. 또한 타임 컨트롤러가 어태치 되어 있지 않고, NiTGeometryData 포인터가 서로 다르며 AppCulled

  플래그 값이 같다. 두 NiTriShape 모두 버텍스, 노멀, 텍스처, 컬러를 갖거나 갖지 않는다 '

  라는 조건이 맞으면 이 두 NiTriShape을 합칠 수 있습니다.

  두 NiTriShape 중 어느 하나에라도 별도의 데이터가 어태치 되어 있으면 이 둘은 통합되지 않을 것입니다.

 

8. Do not merge alpha-blended NiTriShape objects

  - 이 옵션을 체크하면 알파 블렌딩이나 sorter가 작동될 경우 NiAlphaProperty가 어태치된 노드들 사이에선 통합이 일어나지

  않습니다.

 

9. Optimize NiTriShape objects

  - degenerate triangle을 삭제하고 씬에 있는 모든 NitriShape의 버텍스를 축약시키는데, 이 객체들의 삼각형이 모두

  degenerate되어 있는 경우라면 그 객체들을 지워버립니다.

 

10. Remove extra texture coordinate sets

  - 씬의 지오메트리에서 현재의 노드나 상위 노드에 어태치된 NiTexturingProperty가 사용하지 않는 모든 텍스처 좌표 세트를

  삭제합니다.

 

11. Remove unnecessary normals

  - 필요없는 노멀을 재귀적으로 삭제합니다. 라이트가 없는 씬에서는 노멀을 삭제하지 않습니다.

 

12. Remove unnecessary NiVisControllers

  - 씬에서 NiVisController의 키들이 모두 같은 visibility data를 가지고 있으면 그런 NiVisController를 모두 삭제하고

  타깃의 visibility flag를 업데이트 합니다.

 

13. Remove unnecessary NiLookAtControllers

  - NiLookAtController의 타깃이나 "Look At"에, 또는 씬 그래프에서 이들 위에 NiKeyframeController가 없으면 씬에서

  NiLookAtController를 삭제합니다.

 

14. Remove hidden bone geometry

  - 한 본의 자식이면서 AppCulled 플래그인 true인 NiGeometry를 씬에서 삭제합니다.

 

○ 게임을 실행 시키기 위해 노드가 필요한 경우에는 'Remove childless nodes' 'Remove single-child nodes'

  'Merge sibling nodes' 'Merge sibling NiTrishape objects' 의 체크를 해제합니다.

 

 

 

 

 

1. Reduce animation keys

  - 씬에서 NiKeyframeController의 중복된 애니메이션 키를 줄입니다.]

 

  "Tolerance"설정은 키가 여전히 중복되는 것으로 여겨지려면 이 키가 키의 양쪽에서 이루어지는 두 키 사이의 보간에서부터

  얼마나 멀리까지 있어도 되는지의 비율을 지정하는 곳입니다.

 

2. Remove unnecessary extra data

  - ectra data string이 비어있거나, 이 문자열에 임시적인 컨버전 목적으로 쓰이는 문자열만 들어 있는 경우 이를 삭제합니다.

 

  Remove "NiOptimizeKeep"tags 옵션을 체크하면 문자열 "NiOptimizeKeep"와 "sgokeep"이 들어있는 extra data객체도

  삭제됩니다.

 

 

 

 

 

1. Sory children of each node by NiTexturingProperty

  - 각 노드의 자식을 속성 상태에 나와 있는 NiTexturingProperty의 어드레스에 따라 Sorting(소팅)합니다.

  속성 상태에 NiTexturingProperty 객체가 없는 자식들이 먼저 Sorting 됩니다.

  - 이 함수는 렌더링의 능률을 높이는 데에 다소 도움이 됩니다. 그러나 씬 그래프 구조를 유지해야 하는 제약으로 인해

  최적화 될 수 있는 방식도 제한됩니다.

 

2. Remove all Object Names

  - 씬의 모든 오브젝트와 메터리얼 속성에서 이름 문자열을 삭제합니다.

  - 이 함수는 어플리케이션이 이름을 필요로 하지 않는 경우를 위해 제공됩니다. 이름을 삭제하면 메모리 오버헤드를 조금

  줄일 수 있으나 같은 오브젝트의 이름이 있어야만 하는 클래스에선 문제를 일으킬 수 있으므로 이름이 필요없다고 확신되는

  경우에만 이름을 삭제 하기 바랍니다.

 

3. Name all unnamed objects

  - 씬에서 이름이 없는 오브젝트에 고유한 이름을 달아줍니다.

  - 오브젝트들이 이름 없이 익스토프 되지 않게 해줍니다. 즉, 모든 오브텍트에 이름이 있어야 하는 경우에 사용합니다.

 

4. Skin and Bones Support

  - 이 옵션은 각 플랫폼에 대해 어떤 타입의 스키닝 정보를 익스포트 할지를 지정합니다.

  하드웨어(Hardware) 스키닝 정보를 익스포트할지 , 소프트웨어(Software) 스키닝 정보를 익스포트 할지 , 또는 둘다(Both)

  익스포트할지를 고를 수 있습니다.

  - 하드웨어 스키닝 정보만으로 익스포트 된 데이터세트는 하드웨어 스키닝을 지원하지 않는 그래픽 하드웨어에선 실행되지

  않을 것입니다.

  하드웨어와 소프트웨어 스키닝 정보 모두를 가지고 익스포트 된 데이터 세트는 실행될 때 하드웨어 가속 상태

  (hardware accelerated)가 되나 하드웨어 스키닝을 지원하지 않는 그래픽 하드웨어에서도 여전히 구동될 수 있습니다.

  - 스킨 파티션 당 bone의 갯수도 지정 할 수 있습니다.

 

5. Weld hardware skin partitions

  - 스키닝된 모델에서 crack(균열)을 없앱니다.

  - 하드웨어 가속 스키닝을 사용할 때 활성적일 수 있는 본의 개수가 제한되어 있기 때문에 하드웨어 가속 스키닝에 쓰이는

  데이터 구조를 만들 땐 본과 버텍스 간의 상호작용을 무시해야 할 수 밖에 없게 됩니다.

  이렇게 되면 만일 한 본의 영향이 어떤 삼각형에서는 무시되나 다른 오브젝트의 인접한 삼각형에서는 무시되지 않을 경우

  서로 다른 게임브리오 오브젝트의 삼각형들이 공유하는 가장자리에 크랙(균열)이 생길 수 있는데  welding code는 이런 균열이

  생긴 가장자리를 찾아내서 제거합니다.

  이 welding이 일어나려면 두 오브젝트의 월드 변환이 동일해야 합니다.

 

 

◈ 이외에 여러가지 플러그인이 존재하며, 필요한 부분만 체크해서 적용시키는게 좋습니다.

반응형
Posted by blueasa
, |
옵션 재정리 작업중. 

convert : 카메라와 라이트를 익스포트 시킬 것인가 결정. 
체크를 꺼 놔도 3개의 라이트는 기본적으로 넘어가는데, 나머지는 프로그래머 몫.
디폴트 라이트 2 개는 없앨 수 없고, Ambient 라이트만 없앨 수 있다. 이것은 렌더링/ 인바이론먼트 에서 색상만 없애주면 된다. 

차이는 이렇다는 것이다. 눌러서 보셈. 

Texture
- 메인 NIF에 맵이 포함된다. 
- 맵으로 따로 NIF 를 생성한다.  
- 맵이 따로 링크로만 유지된다. 단 관리는 겜브리오에서 관리된다. 중간 관리가 실행되므로 약간 느려진다.
- 맵이 따로 링크로만 유지된다. 관리도 겜브리오에서 하지 않는다. 직접 연결해서. 지원되지 않는 포맷도 쓸 수 있게 해준다.

NPOT Texture
- 2의 배수가 아닌 텍스쳐도 넘길 수 있다. 옵션이 꺼지면 엔진에서 알아서 가까운 2의 배수로 텍스쳐 크기를 조정해 준다. 
그렇게 되면 밉맵이 생기지 않는다고 한다. (이것은 확인 불가)

Animation
APP 타임 - 어플리케이션의 타임을 이용할 것이냐의 문제 타이밍을 엔진에서 컨트롤 할 것이냐 맥스에서 컨트롤 할 것이냐를 결정하는 것으로, 인터페이스 등에서 사용될때 다르게 쓰일 수 있다. 프로그래머에게 의존할 것. 

Use existing Biped keyframes instead of sampled keyframes
바이패드 키의 익스포트 옵션. 키가 있을때만 넘길꺼냐 전부 셈플링 할거냐의 옵션 . 꺼놓으면 전부 셈플링 한다. 이것은 TCB 컨트롤러를 엔진에서 이용하지 않기 때문이다. 그러므로 옵션을 켜면 성능은 증가하는데 동작은 허접해질 수 있음.

Skin Weight Threshold %
기본으로 놔둬도 좋음. 5% 미만의 웨이트 값을 가진 버텍스는 웨이트가 삭제됨 


Export Selected
기본 인스포트에서 문제가 될 수 있는게, 카메라 옵션을 제거해도 카메라 타겟은 넘어간다는것.
그러므로 셀렉티드를 이용하면, 카메라 타겟도 넘어가지 않게 할 수 있다.

Use Original Script Templates If Available
맥스 파일에 있는 스크립트와 컴퓨터에 있는 익스포트 스크립트가 다를 때 , 맥스 파일에 저장된 것을 무시하고 원래 것으로 스크립트를 돌립니다.

익스포트 스크립트
3ds Max Art Pipeline 

Process Scripts:

  • Default Process Script – 이 스크립트는 Create ABV, Optimization, Stripification plug-in들을 디폴트 파라미터로 실행시킵니다.
  • Scene Graph Optimizations Only – 이 스크립트는 SceneGraph Optimization plug-in을 디폴트 설정으로 실행시킵니다.

Viewer Scripts:

  • Default DX Viewer Script – 이 스크립트는 Gamebryo UtilityViewer Selection 롤아웃의 DX Viewer 버튼에 의해 사용됩니다.
  • Default KFM Viewer Script - 이 스크립트는 Gamebryo UtilityViewer Selection 롤아웃의 KFM Viewer 버튼에 의해 사용됩니다.
  • Default SceneImmerse Viewer Script - 이 스크립트는 Gamebryo UtilityViewer Selection 롤아웃의 Scene Viewer 버튼에 의해 사용됩니다. 


Export Scripts

  • Default Export Script – 이 스크립트는 한 개의 NIF 파일을 익스포트 합니다.
  • Multiple KF Export With NIF Script – 이 스크립트는 한 개의 NIF 파일과, Controller Extractor plug-in이 찾은 애니메이션에 따라 여러 개의 KF 파일을 익스포트 합니다.
  • Multiple KF Export Without NIF Script – 이 스크립트는 Controller Extractor plug-in이 찾은 애니메이션에 따라 여러 개의 KF 파일을 익스포트 하고, NIF 파일은 익스포트 하지 않습니다.
  • Single KF Export With NIF Script – 이 스크립트는 NIF 파일 한 개와, Controller Extractor plug-in이 찾은 애니메이션의 합성 KF 파일 한 개를 익스포트 합니다.
  • Single KF Export Without NIF Script – 이 스크립트는 Controller Extractor plug-in이 찾은 애니메이션의 합성 KF 파일 한 개를 익스포트 하고, NIF 파일은 익스포트 하지 않습니다.


일단 이건 몰라도 큰일 없음. 
게임에 따라 변할 것이기 땜에. 

Platform:

게임의 플렛폼을 정할 수 있음. Generic은 모든 게임에 공용될 수 있으나 느리다. 
되도록이면 타겟에 맞추도록 하자. 

Image File Subdirectory
텍스쳐가 따로 NIF 로 저장될 때, 폴더를 정할 수 있음. 

Default Content Quality
텍스쳐 퀄리티를 바꿀 수 있음. 

Override Per-Texture Settings: default content quality 옵션을 사용할 때, Gamebryo Shader에서 텍스처 포맷 타입에 대해 설정된 옵션은 디폴트로 오버라이드 되지 않을 것입니다따라서 이런 설정을 오버라이드 하고 싶은 경우엔 이 박스를 체크해야 합니다.: 아마도 맥스내에서 셋팅한 무엇이 제대로 넘어가지 않을때 사용하면 되지 않을까나. 


반응형
Posted by blueasa
, |

무기잔상효과

Gamebryo/Lecture / 2011. 2. 8. 17:05

무기의 잔상효과를 구현하기위해서는 실시간으로 무기가 움직이는 월드상에

폴리곤을 만들어주고 텍스쳐 uv또한 실시간으로 할당해 주어야한다.

또한, 낮은 프레임에서도 부드러운 형태로 폴리곤을 만드려면 셈플링하는 무기의

위치에 대하여 보간처리를 해야한다.


여기서는 동적으로 폴리곤을 생성하고 사용될 텍스쳐의 uv를 결정해주는 방법을 살펴보도록 한다.
스플라인 보간처리부분은 직접 해보세요.
 

무기에 필요한 정보

무기의 잔상효과가 적용될 시작지점과 끝점에 더미를 추가하도록한다.

더미이름은 *point1,*point2라고 칭한다.

 

※ 구현 순서

1. 더미이름으로 각 더미노드 포인터를 찾아 저장해놓는다.

2. 매 프레임마다 더미노드의 변경된 좌표에 대하여 폴리곤을 생성한다.

3. 정해진 출력시간을 초과하면 해당 정보를 리스트에서 제거한다.
4. 일정 비율로 시간이 지남에따라 폴리곤 크기를 줄여준다.
5. 생성된 폴리곤에 대하여 텍스쳐 uv를 할당한다.
 

struct AIPoint

    {

        float       m_fStartTime; // 폴리곤을 생성할 때 현재 시간을 저장한다.

        NiPoint3    m_kPoint[2];  // 생성될때 더미노드 월드좌표를 저장한다.

};

 

    typedef std::vector<AIPoint>    VAIPOINT;

    typedef VAIPOINT::iterator      VAIPOINT_ITER;

VAIPOINT        m_vAIPointList;        // 더미노드 리스트                                  

NiTriShapePtr   m_spAIGeometry;        // 동적으로 만들어진 지오메트리

    NiAVObject*     m_pkPointNode[2];      // 잔상이 적용될 노드포인터

    float           m_fLifeTime;           // 폴리곤이 출력되는 시간

 

매 프레임마다 더미의 월드좌표와 시간정보를 리스트에 추가한다.
   실제 제작시에는 변화가있을때만 추가해야할 것이다. 또는 특정 애니메이션에서만 추가되도록 작성해야한다.
    AIPoint r_kAIPoint;

    r_kAIPoint.m_fStartTime = p_fTime;

    r_kAIPoint.m_kPoint[0]  = m_pkPointNode[0]->GetWorldTranslate();

    r_kAIPoint.m_kPoint[1]  = m_pkPointNode[1]->GetWorldTranslate();

    m_vAIPointList.push_back( r_kAIPoint );

 

※ 매프레임마다 *point2더미 위치를 *point1 더미위치방향으로 줄어들게 한다.

또한 출력시간이 지났다면 해당 AIPoint 객체를 리스트에서 제거하도록 한다.

if( m_vAIPointList.empty() )
        return;
    VAIPOINT_ITER r_iter;

    for( r_iter = m_vAIPointList.begin(); r_iter != m_vAIPointList.end(); )

    {

        float r_fElapsedTime = p_fTime - r_iter->m_fStartTime;

        if( r_fElapsedTime > m_fLifeTime )

        {

            r_iter = m_vAIPointList.erase( r_iter );

        }

        else

        {

            NiPoint3 r_kDirVec =
                     ( r_iter->m_kPoint[0] - r_iter->m_kPoint[1] );

            float r_fLength = r_kDirVec.Length();

            if ( r_fLength > 0.0f )

            {

                NiPoint3::UnitizeVector( r_kDirVec );

                float fAmount = r_fLength / ( m_fLifeTime * 10.0f );

r_kDirVec *= fAmount;

                r_iter->m_kPoint[1] += r_kDirVec;

            }

            ++r_iter;

        }

    }

 

주어진 리스트를 이용하여 동적으로 폴리곤과 uv좌표정보를 갱신한다.

unsigned short  r_usAIPointCount = m_vAIPointList.size();
    // 최소한 3개이상이어야 정상적인 메쉬를 만들 수 있다

    if ( r_usAIPointCount <= 2 )
        return;
   
unsigned short  r_usVertices     = r_usAIPointCount * 2;

    unsigned short  r_usTriangles    = ( r_usAIPointCount - 1 ) * 2;

    unsigned short* r_pusTriList     = NULL;

    NiPoint3*       r_pkVerts        = NiNew NiPoint3[ r_usVertices ];

    NiPoint2*       r_pkTexture      = NiNew NiPoint2[ r_usVertices ];

 

    if ( r_usTriangles )

    {

        r_pusTriList = (unsigned short*)NiMalloc(

            sizeof(unsigned short) * ( 3 * r_usTriangles ) );

    }

 

    for( int r_i = 0; r_i < r_usAIPointCount; ++r_i )

    {

        int r_nNum = r_i * 2;

 

        r_pkVerts[r_nNum]     = m_vAIPointList[r_i].m_kPoint[0];

        r_pkVerts[r_nNum + 1] = m_vAIPointList[r_i].m_kPoint[1];

 

        if( 0 == r_i )

        {

            r_pkTexture[0] = NiPoint2( 0.0f, 0.0f );

            r_pkTexture[1] = NiPoint2( 1.0f, 0.0f );

        }

        else

        {

            float r_uv = (float)( r_i ) / (float)( r_usAIPointCount - 1 );

            r_pkTexture[r_nNum]     = NiPoint2( 0.0f, r_uv );

            r_pkTexture[r_nNum + 1] = NiPoint2( 1.0f, r_uv );

 

            int r_nIndex  = ( r_i - 1 ) * 6;

            int r_nFactor = ( r_i - 1 ) * 2;

 

            r_pusTriList[r_nIndex + 0] = 0 + r_nFactor;

            r_pusTriList[r_nIndex + 1] = 1 + r_nFactor;

            r_pusTriList[r_nIndex + 2] = 2 + r_nFactor;

            r_pusTriList[r_nIndex + 3] = 2 + r_nFactor;

            r_pusTriList[r_nIndex + 4] = 1 + r_nFactor;

            r_pusTriList[r_nIndex + 5] = 3 + r_nFactor;

        }

    }

 

    NiGeometryData* r_pkGeomData = m_spAIGeometry->GetModelData();

    NiTriShapeData* r_pkTriShape = (NiTriShapeData*)r_pkGeomData;

   

    r_pkGeomData->Replace(

        r_usVertices,

        r_pkVerts,

        0,                                  // Normal

        0,                                  // Color

        r_pkTexture,

        1,                                  // TextureSets

        NiGeometryData::NBT_METHOD_NONE );  // Normal Binormal Tangent Method

 

    r_pkTriShape->Replace( r_usTriangles, r_pusTriList );

 

    r_pkGeomData->MarkAsChanged (

            NiGeometryData::VERTEX_MASK |

            NiGeometryData::TEXTURE_MASK |

            NiTriBasedGeomData::TRIANGLE_INDEX_MASK |

            NiTriBasedGeomData::TRIANGLE_COUNT_MASK );

 

    // Perform initial update.

    m_spAIGeometry->Update(0.0f);

    m_spAIGeometry->UpdateProperties();

    m_spAIGeometry->UpdateEffects();

    m_spAIGeometry->UpdateNodeBound();

 

 

-> URL : http://clodymade.tistory.com/entry/무기잔상효과

반응형

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

게임브리오 2D Line관련  (0) 2011.10.30
FrameRenderSystem에서.. 커스텀알파소터프로세스..  (0) 2011.09.18
캐릭터 기울기 연산  (0) 2011.02.08
Gamebryo 셋팅  (1) 2011.01.06
게임브리오 강좌(?) 링크  (3) 2010.04.14
Posted by blueasa
, |
필요한 경우는 아래와 같다.
1. 2족 캐릭터가 지형의 경사면에서 죽는 애니메이션.
2. 4족 이상 동물의 지형 경사면 이동.


일단 캐릭터가 서있는 지형에대한 노멀벡터를 알아야한다.
자신의 위치에서 바닥으로 피킹을 해서 얻으면 된다.
캐릭터의 크기가 바닥 그리드에 비해 크다면 캐릭터의 크기에 맞게 삼각형 형태의
3정점에서 피킹을하여 얻어지는 평면의 노멀값을 계산하여 사용하도록 하자.

1. 현재 캐릭터 위치에서 지형으로 피킹을 한다.
2. 피킹으로 얻어진 노멀 벡터와 Z축 벡터를 이용하여 회전행렬을 구한다.
3. 캐릭터의 회전값에 적용한다.


ex)
// 원래 벡터 srcVec, 변환후 벡터 destVec, 회전축 벡터 axisVec
// axisVec = srcVec x destVec                                               // 회전축 벡터
// angle = acos( srcVec * destVec / |srcVec| |destVec| )       // 회전각


// m_spCharRootNode 캐릭터 루트 노드
// m_kPickNormal 현재 위치에대한 노멀 벡터
NiMatrix3 r_kRot;
NiPoint3 r_kAxis = m_kPickNormal.Cross( NiPoint3(0.0f, 0.0f, 1.0f) );
float r_fDot = m_kPickNormal.Dot( NiPoint3(0.0f, 0.0f, 1.0f) );
float r_fRadian = NiACos( r_fDot );
r_kRot.MakeRotation( r_fRadian, r_kAxis );
m_spCharRootNode->SetRotate( r_kRot );


주의사항 : 루트노드를 카메라 회전및 기타 다른용도에
사용되고 있다면 위 코드는 정상적으로 구현되지 않을 수 있습니다.
이럴 경우 노멀벡터값을 루트노드회전행렬과 곱한값을 사용하면 해결 될 수 있습니다.
 
반응형

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

FrameRenderSystem에서.. 커스텀알파소터프로세스..  (0) 2011.09.18
무기잔상효과  (0) 2011.02.08
Gamebryo 셋팅  (1) 2011.01.06
게임브리오 강좌(?) 링크  (3) 2010.04.14
Gamebryo 2.5  (0) 2010.04.12
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
, |