X3D WOW

- FAQ
- 각도가 0 - 4096 유지 이유?
- XCameraMode 의 용도?
-
eBLKRENDER_TYPE 의 용도?
-
xFrmWork_SetRunNoFilterCB()? 
-
Dummy 모델 작업?


- HGUI


- FAQ -

1. 현재 엔진이 쓰고 있는 윈도우 핸들과 인스턴스를 구하고 싶습니다.

다음 API를 활용하시면 됩니다.

HWND        xFrmWork_GethWnd();

엔진이 보유한 윈도우 핸들을 돌려줍니다.

HDC         xFrmWork_GetDC();
현재 렌더링 되고 있는 DC 를 얻습니다.

void        xFrmWork_ReleaseDC(HDC hDC);
얻은 DC를 해제합니다.

HINSTANCE   xFrmWork_GethInstance();
현재 엔진이 보유하고 있는 인스턴스를 돌려줍니다.

2. CWorld::LoadWRL 을 하면 카메라 환경 셋팅은 안해도 되나요?

LoadWRL 함수에서 라야에서 카메라 환경이 저장된 셋팅을 로드하게 됩니다.

int XCALLBACK GameMgr_CameraInit()
{
xCamera_SetBackGround(X_RGBA_GRAY);
xCamera_SetAmbientLightColor(XCRGBA(76,76,76));
xCamera_SetDirectionalLight(XCVector(1.0f, 1.0f, -1.0f),XCVector(0,0,0));
xCamera_SetProjection(1,1500,60);
xCamera_SetFogRange(700,1500);
xCamera_SetFogEnable(true);

위와 같이 작업했던 xCamera_ 로 시작되는 환경 셋팅함수 전부를 안해줘야 합니다. GameMgr_CameraInit 함수를 공백으로 둡니다.
 

3. 마우스 커서 셋팅은 어떻게 하나요?

XEngine은 별도로 마우스 처리를 하지 않습니다. tut_Input 예제를 참고하여 Win32 API 를 써서 해결 하시면 됩니다.

4. 현재 윈도우의 위치와 크기 등을 얻고 싶습니다.

XEngine은 Win32 API 가 가지고 있는 기능을 따로 내부에 중복으로 가지고 있지는 않습니다.
xFrmWork_GethWnd 라는 함수로 윈도우 핸들을 얻어서 Win32 API 를 활용하시면 됩니다.

 

5. 온라인 게임의 파츠 착용 같은 것은 어떤 샘플을 참조 하면 되나요?

tut_ObjectMGR_2008 샘플을 참조 하시면 됩니다.

- 관련 코드-|
#define NONVISUAL_OBJ 0x00000010
해당 서브 모델의 비주얼을 ON/OOF 합니다.
참고 API
X_SUBMODEL xModel_GetSubModel(X_MODEL hMODEL,int iINDEX);좋습니다.해당 인덱스의 서브 모델을 구합니다.
void xSubModel_SetAttrObject(X_SUBMODEL hSUBMODEL,DWORD dwFLAG,bool bSET = true ); SUB모델의 속성을 셋팅(true) 혹은 해제(false)합니다.

6. 가끔가다 생기는 화면 깜박임은 왜 그런가요?

프레임 스키핑 문제입니다. CSKipper::GetIsSkip() 이 true이면 렌더링에 관련된 일을 하지 말아야 합니다.

int XCALLBACK GameMgr_Run()  의 int 가 의미가 있습니다.

float fRemainTime = g_SKIP.ChkRemain();
if( fRemainTime >= 0 )
시간이 남으면 시스템에 자원을 돌려줍니다.
    Sleep(fRemainTime * 1000);
else
    return
RUN_NONE; 시간이 부족하면 화면 플리핑을 막기 위해 RUN_NONE을 돌려줘야 화면 깜빡임을 피할수 있습니다.

return
RUN_RENDER_CLEAR; 시간이 적당한 경우는 플리핑과 Z버퍼 클리어 처리를 합니다.

CSKipper::GetResult() 함수가 위의 경우를 대신 한번에 다 처리해줍니다.

tut_FrameSkip 예제 참조

7. FOV를 Init 부분에 조절했는데 바로 적용이 되지 않고, 전체화면 교체했을 때나 화면의 크기가 바뀌었을 때 적용이됨.

float xCamera_SetFOV(float fFOV,bool bUPDATE = false ); Field of view 시야각 설정.

bUPDATE 의 의미 ( 모든 카메라 관련 셋팅 함수에 다 있음 )
보통 매번 카메라 환경설정 때마다 true 둬서 하게되면 카메라 설정시 시간이 걸리게 됩니다.
그래서 보통 false로 두고 최고 마지막 카메라 셋팅 관련 코드에서 true를 한번 해주면 전에 관련된 코드가 전부 반영이 됩니다.
아울러 카메라 셋팅 처리 시간이 상당히 줄어들게 됩니다.

익숙하지 않으면 뒤에 변수를 무조건 true로 둡니다.

예외사항!
int XCALLBACK GameMgr_GameInit() 함수에서는 해주지 않아도 엔진에서 알아서 반영을 합니다.
카메라 콜백함수 내에서는 false로 두거나 셋팅하지 않으면 됩니다.

8. 데이터 패키징을 할려는데 char* 형식으로 데이터로 로드하는 형태가 보지이 않습니다.
그러면 배포시 텍스쳐 같은 경우는 어떻게 하는가요?

XPACK 이라는 배포용 툴이 따로 있습니다. 패킹과 암호화 처리를 동시에 합니다.스크립트도 포함입니다.
xFile_ 관련 파일 함수를 쓰시면 엔진 자체적으로 파일패킹을 지원합니다. 코드수정은 안해도 됩니다.

9. xMaterial_SetDiffuse( .. ) 을 이용하여 타겟팅 된 몬스터만 특정색을 바꿔주려고 하는데요.
타겟팅된 모델말고 같은 종류의 모델들이 전부 특정색으로 변경됩니다.
이럴 때 타겟팅된 몬스터의 Material 색을 변경하려면 어떻게 모델을 생성해야 하는지 궁금합니다..

리소스가 공유된 상태라면 ( CModelCOL 사용 ) 공유한 모든 모델이 변경이 됩니다.
캐릭터를 렌더링 하기전에
xMaterial_SetDiffuse 를 매번 캐릭터 별로 호출해주세요
디퓨즈값은 캐릭터별로 보관하시고요
xMaterial_SetDiffuse 함수는 속도를 크게 안잡아먹으니 캐릭터 렌더링때마다 매번 불러주면됩니다.
xModel_ChangeScale도 마찬가지 입니다.

10. 캐릭터의 키보드 움직임을 작동안하게 하고 싶습니다.

CBasicChar::SetEnableUseKeyMOVE 함수로 셋팅하십시요.

11. 캐릭터를 일정 목표 지점까지 일정 속도로 움직이게 하고 싶습니다.

      CBasicChar::DoMove 함수로 목표 지점을 셋팅하시고 SetMovingDEG 로 움직임 속도를 지정하면 됩니다.

12. 엔진소스의 XCCamera 와 XUT 의  CXCamera 와의 차이점은 무엇입니까

      엔진 파트 XCCamera 는 3d 그래픽 카드 디바이스를 제어하는 함수들의 집합체 입니다.
      XUT의 
CXCamera 는 3d 좌표계상의 로칼 카메라 좌표계를 표현하는 클래스 입니다.

13. 월드 로드시 쓰레드 로 동시에 로드가 가능한가요?

      tut_World_TWO 샘플에 예제가 있습니다.
     
FRMINFO.m_bUseThread 를 반드시 true로 둬야 합니다.

14. 라야툴의 기능을 소스를 볼수가 있나요

tut_ObjectMGR,tut_MaterialMGR 에 필요한 소스가 있습니다.

15. 그래스 에서 특정 오브젝트의 에니메이션을 제어할수 있나요?

tut_PickGrass 에 필요한 소스가 있습니다.

16. 캐릭터 가 상당히 많은 복장으로 인해 많은 양의 텍스춰 메모리를 잡아 먹는 경우 어떻게 해결할수 있나요?

폴리곤은 텍스춰에 비해 메모리 양이 미비하므로 텍스춰만 렌더링 될때 비디오 램에 올리는 방법을 쓰면 됩니다.

17. 리소스 공유에 대한 예제가 어디에 있나요?

tut_PickWorld 에 필요한 소스가 있습니다.

18. 모델,FX 리소스 관리에 대한 방법이 궁금합니다.

tut_PickWorld, tut_PickWorld1 에 필요한 소스가 있습니다.
 

19. 라야에서 생성된 .cam 파일은 어떻게 적용하나요?

wrl 파일과 이름이 같으면 wrl과 함께 자동으로 로드됩니다.

20. 동영상 플레이에 대한 예제가 어디 있나요?

tut_SpriteMovie 에 필요한 소스가 있습니다.

플레이 가능한 코덱 만드는 방법 ( 추천 방법. 코덱은 avi 만들시에 쓴 어떤 코덱이 깔려있기만 하면 됩니다 )
    - ffdshow 통합 코덱이 가장 압축 효율이 좋습니다. (
http://sourceforge.net/projects/ffdshow-tryout/ )
    - 동영상 제작,플레이 하고자 하는 컴퓨터에 인스톨 합니다. 인스톨 쉴드를 쓰면 배포시에 같이 깔리게 할수 있습니다.
    -
Camtasia Studio 같은 동영상 툴을 사용해서 영상은 ffdshow 를 선택하고 음성은 무압축 PCM을 선택해서 만들면 됩니다.



 

21. 미니맵 출력에 대한 예제가 어디 있나요?

tut_Collision1,tut_Radar 에 필요한 소스가 있습니다.

22. 캐릭터 충돌구 모양을 원하는대로 만들고 싶습니다.

다음 동영상 참조
raya_avatar_world_fence.avi_000410200.jpg
7 AvatarWorld1

tut_CollisionExtern
에 필요한 소스가 있습니다.

23.캐릭터 이동시킬때 DoMove 를 사용하면 특정방향으로만 이동합니다..  아무방향으로 이동이 가능 해야 되는데 이건
      어떻게 해야하는지 잘 모르겠습니다.

tut_BasicChar2008 에 필요한 소스가 있습니다.
g_CHAR.MoveCollision(VF);  를 참고하세요.

24. 프로그램 작업시 기존 클래스를 상속하여 구현할 때 종종 virtual 로 선언되지 않아 함수를 재정의 하기 어려운
   부분이 존재합니다.

예를 들어 CWorld ,XCTerrainWorld,XCTerrainSubNode 등의 public 함수를 우선 고쳐 주시면 감사하겠습니다.

XC 접두사가 있는것은 엔진 코어 부분이라 수정을 권하지 않습니다. 수정하면 향후 업데이트시 지원에 문제가 생기기 됩니다.
메신저나 이메일로 최대한 C API 인터페이스 함수를 요청해주십시요.

CWorld 는 XUT 클래스라 원하시면 XUT 풀 소스를 드립니다. 마음껏 고쳐서 쓰셔도 무방합니다. 즉 virtual이 아닌 클래스 자체를

수정하셔서 써도 됩니다. 단 클래스 이름만 바꿔서 사용해주세요.

25. 각종 카메라 관련 제어를 알고 싶습니다. 빛의 칼라나 그런것도 코드로 직접 제어 하고 싶습니다.

프로그래머 라도 라야툴은 쓸줄 알아야 좀더 원할한 코딩이 가능합니다. 라야툴의 소스는 샘플에 제공되기 때문에
라야툴을 쓸줄 알고 프리스 툴로 해당 부분의 함수 이름을 찾아서 소스를 참고 하시면 바로 사용법을 알수 있습니다
.

world_camera.avi
카메라 메뉴 참고 동영상

카메라 메뉴 소스는
tut_CameraMENU 샘플에 있습니다.
오브젝트 메뉴 소스는
tut_ObjectMGR 에 있습니다.
머터리얼 메뉴 소스는
tut_MaterialMGR 에 있습니다.

 26. 캐릭터가 땅을 밟고 있는지 공중에 있는지 검사하는 기능을 알고 싶습니다.

g_CHAR.GetCOLLINK()->GetCOLDATA(0)->GetNumCollision()  리턴값이 있으면 지면과 충돌 상태입니다.
캐릭터의 충돌구의 충돌점 갯수로 현재 어떤 물체와 충돌인지 아닌지를 알수가 있습니다.
GetCOLDATA(0) 가 제일 하단 구이고 GetCOLDATA(1) 이 바로위의 충돌구 입니다.

tut_BasicChar_2008 에 샘플이 있습니다.

 27. 지형 월드에서 캐릭터가 어떤 레이어 텍스춰를 밟고 있는지 검사하는 기능을 알고 싶습니다.

라야 지형 메뉴의 ExportMCOL 에서 생성된 mac 파일을 이용하면 됩니다.
tut_WorldInfo 에 샘플이 있습니다.

 28. CBasicChar 에서 모션 자동 결정 시스템이란 무엇을 말하는 것입니까? (  GetSM() 함수  )

모션 자동 결정 시스템이란 캐릭터가 어떠한 행위를 한뒤 다음 행위를 AI 처리 차원에서 자동으로 지정하는 시스템을 말합니다.
예를 들자면 공격 후에 stand 모션은 따로 지정하지 않아도 공격이 끝나면 AI가 알아서 stand 모션으로 지정합니다.
하지만 죽는 모션은 예외로 stand로 가면 안되므로 GetSM()->Destroy() 를 호출해서 AI 동작을 금지 시켜야 합니다.

tut_BasicChar_2008
에 샘플이 있습니다.

 29. 엔진소스의 클래스들의 소멸자들이 호출되지 않습니다.

X엔진은 기본적으로 기본클래스에 virtual로 소멸자가 정의되어 있지 않습니다. 그래서 소멸자를 오버라이드 할수 없습니다. 단지
소멸자가 호출되지 않는다는 차이 일뿐  delete는 정상적으로 되므로 메모리 릭 과는 상관이 없습니다.
소멸자 대신 Destroy 함수를 사용 하시면 됩니다.


- 더미 작업 -

- 캐릭터 피봇 모델 적용

3DSMAX에서 모델링 할 때 다음 피봇 파일을 맥스에서 임포트 해서 원하는 부위에 피직 적용해서 에니메이션을 같이 뽑습니다.
피직 모델일때는 그냥 에니메이션 작업으로 링크 걸면 안됩니다. 피봇 삼각뿔을 반드시 피직 적용해주세요!
-
SDK/data/3D/char/pivot_dummy/pivot.db3


아리캐릭터.max파일을 보시면 실적용된 예를 보실수 있습니다.

피직 모델이 아닐때는 단순링크 시켜서 에니메이션 시켜도 됩니다.

피봇 모델은 새로이 제작하지 마시고 스케일이 작업자 마다 각각 틀리니 반드시 임포트해서 사용하여야 합니다.



TOPVIEW에서 Z축( XENGINE 좌표 기준 )  길이는 4입니다.



X축( XENGINE 좌표 기준 )  길이는 2입니다.
Y축( XENGINE 좌표 기준 )  길이는 1입니다.



캐릭터 기준으로 시선방향이 Z,오른팔이 X,머리 정수리가 Y 입니다.
피봇의 길이로 봐서 축을 판단하면 됩니다.
 

- RAYA 툴 작업
오브젝트 원도우를 열어보면 해당 피봇 서브오브젝트가 있습니다. NONVISUAL을 체크해주시고
ForceTransform
반드시 켜줍니다. 그리고 다시 저장해줍니다. 더미오브젝트 시뮬레이션
참조

- 코드 적용

CBasicChar::AddDummyModel(g_hMODEL_CAP,"c_cap_pivot");
원하는 모델 파일과 링크하고자 하는 피봇 오브젝트(pivot.max를 Merge 할 당시의 이름 ) 의 이름을 적어줍니다.
통상적으로 피봇 맥스 파일의 오브젝트 이름은 프로그래머와 미리 교감을 하는게 좋습니다.

- Sample의 tut_PivotDummy 예제를 참조하세요

- 더미모델의 기준잡는 지점은 3ds max 의 월드의 중심을 피봇의 중심으로 잡게 됩니다.


리소스 활용 예제

    g_h2DSPRITE = xSprite2DANITEX_Create();
    xFile_Chdir("data/star");
    xSprite2DANITEX_MakeANITEX(g_h2DSPRITE,NOFILTER_MATERIAL,XCRGBA(255,255,255,0),XCRGBA(0,0,0,255),"*.tga" );
    xFile_Chdir("../..");

    g_SANIINFO_LOOP.Init(g_h2DSPRITE);
    g_SANIINFO_LOOP.SetIncDelay(0.06f);
    g_SANIINFO_LOOP.SetAniType(ANITYPE_LOOP);
    g_SANIINFO_LOOP.SetTransform(230,430);   

    g_SANIINFO_PINGPONG.Init(g_h2DSPRITE);
    g_SANIINFO_PINGPONG.SetIncDelay(0.06f);
    g_SANIINFO_PINGPONG.SetAniType(ANITYPE_PINGPONG);
    g_SANIINFO_PINGPONG.SetTransform(330,330);  

    g_SANIINFO_LAST.Init(g_h2DSPRITE);
    g_SANIINFO_LAST.SetIncDelay(0.06f);
    g_SANIINFO_LAST.SetAniType(ANITYPE_LASTFRAME);
    g_SANIINFO_LAST.SetTransform(230,130);   

    g_SANIINFO_FIX.Init(g_h2DSPRITE);
    g_SANIINFO_FIX.SetAniType(ANITYPE_NONE);
    g_SANIINFO_FIX.SetCurrentFrame(5);
    g_SANIINFO_FIX.SetTransform(130,430);   

g_h2DSPRITE = xSprite2DANITEX_Create(); 로 생성된 모델을 여러개의 XCSpriteANIInfo 구조체에 할당 시켜 하나의 모델로 렌더링을 처리합니다.
 

엔지 내부 차원에서도 리소스 중복 방지라던지 최적화 알고리즘이 있지만 위처럼 하면 더욱더 투명하게 리소스를 절약할 수 있습니다.
통상적으로 model만 관리하는 팩토리 클래스를 만들어 사용하면 됩니다.