데이터 글러브 동작 테스트 영상

by Blogger 하얀쿠아
2012. 10. 20. 21:41 수행 프로젝트 이력/Air Haptic Glove [2011.07~09]

Air Haptic Glove 프로젝트 초기의 데이터 글러브 테스트 영상 입니다.


3D Rendering Part : 전영호

3D Rendering Engine : microsoft XNA 3.1

Implement Language : C#

Physics Engine : JigLibX.Net

3D Modeling : 3D studio max 2011


Hardware Part : 김재민, 권기우

MCU : cortex m3

acceleration sensor, magnetic sensor, flex sensor : can`t remember



 첫번째 영상은 데이터글러브를 착용한 사용자의 손가락 구부림 정도를 추정하여 3D 손에 적용하는 테스트 영상이다. 프로젝트 초기의 영상이라 손가락 떨림 보정이 적용되어있지 않은 것을 알 수 있다.



'손가락 움직임 추정' 테스트 영상

flex 센서 5개를 이용하여 손가락의 움직임을 추정하고 3D로 표현하였다.




 두번째와 세번째 영상은 데이터글러브를 착용한 사용자의 손 자세를 추정하여 3D 가상손에 적용하는 것을 테스트하는 영상이다. 역시 떨림 보정이 전혀 되어있지 않아 3D 손이 심하게 떨리는 것을 확인할 수 있다.



'손 자세 추정' 테스트 영상 1

가속도 센서 + 지자기 센서 를 이용한 ARS 모듈을 만들고 자세 추정값을 이용하여 추정한 손의 자세를 3D로 표현하였다.





'손 자세 추정' 테스트 영상 2
가속도 센서 + 지자기 센서 를 이용한 ARS 모듈을 만들고 자세 추정값을 이용하여 추정한 손의 자세를 3D로 표현하였다. (부가적인것)또한, world 전체에 거대한 sphere를 씌우고 내부에 낮/밤 텍스쳐를 반씩 입혀 를 서서히 회전시키면서 낮/밤의 전환을 구현 한 것을 확인 할 수 있다.



다음 영상은 물리엔진 테스트 영상이다.
3D공간 상에서 손으로 물체를 잡거나 던지는 등의 행위를 구현하기 위하여, 3D공간상에 물리엔진을 적용하였다.
테스트 영상에서 나오는 공들은 물리 테스트를 쉽게 하기 위해 Camera 위치에서부터 발사되도록 한 것이며, height map으로 생성한 지형, 공끼리, 그외의 물체(흰 상자)와의 충돌, 튕김 등의 물리 테스트를 하고 있는 모습이다.


물리 엔진 테스트 영상
 물체 picking 을 구현하였고, 마우스 가운데를 이용해 물체를 잡아 던질 수 있도록 하여 물리 테스트를 수월하게 하였다.

 아직 shadow mapping을 하지 않아서 그림자가 적용되지 않은 시점에서의 테스트 영상이기에, 공의 위치에 대한 인지가 부정확 함을 확인 할 수 있다. 최종 버전은 shadow mapping이 완료되어 그림자를 통해 공간상의 물체들에 대한 위치 인지도와 입체감을 높이기 위해 노력했다. (영상은 진행project-Air Hapitc Glove 카테고리의 이전 포스팅에서 확인 가능)
 


이 댓글을 비밀 댓글로
    • 김동우
    • 2013.02.06 17:26
    안녕하세요.
    윈도우 3D를 화면에 구현하려 하는데 조언을 구하고자 글을 남깁니다.

    양쪽 팔에 3개의 센서를 달고 팔의움직임을 화면에 그대로 보여주고 싶습니다.
    데이터를 받아서 3D 모델을 처리해 주는 부분(XNA)에 관한 자료나 조언을 부탁드립니다.

    3D는 처음이라 많이 어렵습니다.
    • 처음이시라면 우선 기본적인 3D 그래픽 이론적인 지식을 간단하게 습득 하고 시작하시는게 여러모로 도움이 될 것 같습니다.
      (카메라, 프로젝션, 뷰, 3차원 좌표, 폴리곤, 텍스쳐 등등.. 의 3D 그래픽 이론 말이죠..)
      그 후 XNA를 사용하여 3D를 윈도우에서 렌더링 하신다면, 언어로는 C#을 사용하실 텐데.. 윈도우라고 하셨으니 XNA는 PC에서 돌아간다고 가정하겠습니다.

      간단히 말하면 센서의 값을 받아서 3D 모델의 위치좌표를 변경해 주시면 됩니다. 3D모델이 사람모양이라면, 팔 부분의 폴리곤들의 위치좌표를 변경해 주시면 될 것이고요..

      센서의 값을 PC로 보내는 방식은 블루투스를 사용하던, 시리얼 통신을 사용하던.. 하실것이고.. 센서는 아마도 자이로 + 가속도 센서 조합을 하시겠죠? 캘리브레이션 후에 X, Y, Z 좌표를 뽑아서 3D를 그리는 PC로 보내시면 되겠죠..

      PC에서는 받은 센서값을 3D 모델에 대입하시면 되는데..

      말은 쉬운데 3D가 처음이시라고 하셔서 어떻게 설명 드려야 할지 난감하네요 ^^;

      우선 3D 맥스 같은 모델링 툴로 간단하게 팔 부분을 모델링 해보세요
      본(Bone)을 모델에 심고, 이것을 fbx 파일로 뽑아서 XNA에서 로드 하시면 됩니다.
      fbx 모델을 XNA에서 로드 하는 기능도 구현을 해야 하는데, MS 의 XNA 예제 사이트에 이미 구현된 fbx 로더가 있으니 참고하시면 됩니다.
      XNA에서 로드된 3D 모델이 Bone을 가지고 있다면 Bone의 관절 하나하나를 제어할 수 있습니다. 마치 배열의 인덱스를 지정해서 배열값에 접근 하듯.. 이것도 MS의 예제를 찾아보시면 나올것이고요..
      관절 하나 하나를 실제 팔에 부착된 센서 하나하나와 매칭시켜주시고, 3D 모델 관절의 좌표값을 바꿔주시면 될것입니다.
    • 김동우
    • 2013.02.15 20:33
    조언 감사합니다.

    이야기해주신 대로 해보도록 하겠습니다.

    자료들 잔뜩 모아서 보고있습니다.

    마지막의 Bone을 제어하는 예제를 찾을수가 없어서... 여기 주소좀 알려 주실수 있나요?

    추가 ==> indie games 사이트에서 [Simple Animation] [Inverse Kinematics] 로 검색 하시면 됩니다.

    감사합니다.

FBX improvements in XNA Game Studio 3.0

by Blogger 하얀쿠아
2011. 10. 3. 03:32 소프트웨어 Note/XNA Framework
max에서 FBX파일을 export한뒤 xna에서 import하여 다룰때 필요한 심화된 정보 정도로 보면 되겠다.



One of the less obvious changes in our 3.0 release is that we picked up an updated version of the FBX SDK from our partners at Autodesk, which enables some cool new functionality in our FBX importer:

  • Multiple textures
  • Multiple texture coordinate channels
  • Effect materials
  • Material name strings are now imported correctly

To use this stuff, you first need to make sure you have the latest version of the Max or Maya FBX exporters.

Now create a material that uses more than one texture. For instance I used Max to apply a diffuse texture map, specular map, and bump map. Here's how that data shows up when I read it with our 3.0 FBX importer:

  <Resource ID="#Resource1" Type="Graphics:BasicMaterialContent">
      <Name>ShawnsTestMaterial</Name>
      <OpaqueData>
        <Data Key="DiffuseColor" Type="Framework:Vector3">0.5 0.5 0.5</Data>
        <Data Key="EmissiveColor" Type="Framework:Vector3">0 0 0</Data>
        <Data Key="Alpha" Type="float">1</Data>
        <Data Key="SpecularColor" Type="Framework:Vector3">0 0 0</Data>
        <Data Key="SpecularPower" Type="float">1.9</Data>
      </OpaqueData>
      <Textures>
        <Texture Key="Texture">
          <OpaqueData>
            <Data Key="TextureCoordinate">TextureCoordinate0</Data>
          </OpaqueData>
          <Reference>#External1</Reference>
        </Texture>
        <Texture Key="SpecularFactor0">
          <OpaqueData>
            <Data Key="TextureCoordinate">TextureCoordinate0</Data>
          </OpaqueData>
          <Reference>#External2</Reference>
        </Texture>
        <Texture Key="Bump0">
          <OpaqueData>
            <Data Key="TextureCoordinate">TextureCoordinate1</Data>
          </OpaqueData>
          <Reference>#External3</Reference>
        </Texture>
      </Textures>
    </Resource>
  

See those extra two textures? See how the TextureCoordinate opaque data records whichcoordinate channel goes with each one?

The bad news is that if you load and draw this model in the usual way, these extra textures will not actually show up. That is because BasicEffect has no idea how to apply specular or bump maps, so the default material processor will just throw them away.

To render this kind of richer material, you must provide a suitable shader, then use a custom processor to apply it to your model. The improvement is that in 3.0, such processors now have more information about how the original material was set up in Max or Maya. With sufficient smarts, you could make a processor that examined the material to see which of many possible texture layers were present, chose the best fit from a set of shaders, then automatically applied the appropriate shader, passing all the correct textures through to it.

A more automated approach for using custom shaders comes into play if you apply a Direct3D material directly to your object in Max (I believe this is not currently supported by Maya). This now works in FBX the same way it previously did with X files. You can export an FBX file that uses a custom D3D effect as a material, import this into the Content Pipeline, where the material will show up as an EffectMaterialContent, then load it into your game, where the material will come through as an instance of your custom Effect already configured with the appropriate textures and parameter values.

This kind of thing makes me a happy chappie.

Go Autodesk!

출처 : http://blogs.msdn.com/b/shawnhar/archive/2008/09/18/fbx-improvements-in-xna-game-studio-3-0.aspx

'소프트웨어 Note > XNA Framework' 카테고리의 다른 글

FBX improvements in XNA Game Studio 3.0  (0) 2011.10.03
XNA와 3D 기초 (1)  (0) 2011.09.10
XNA Framework의 논리적 흐름  (0) 2011.07.21
이 댓글을 비밀 댓글로

XNA와 3D 기초 (1)

by Blogger 하얀쿠아
2011. 9. 10. 15:41 소프트웨어 Note/XNA Framework
 [1] XNA에서 3D 프로그래밍의 시작.
3D 자료를 2차원인 모니터 화면에 렌더링 한다는 것의 의미는 무엇인가??

3D 렌더링이라는 것은 기본적으로 3차원 공간의 기하구조를 2차원 평면에 투영하고, 투영된 기하구조에 적절한 색들을 채워 넣는 것이다.

초창기 3D게임들은 3D 렌더링을 위한 레이캐스팅(ray-casting)과 같은 기법들을 전적으로 CPU에서 처리!
하지만, 오늘날의 3D 그래픽 처리는 모두 GPU에서 일어난다.

GPU는 다각형들을 화면에 그리고 픽셀들을 채우는 일뿐만 아니라
3D자료를 2D로 투영하고 변환하는 작업도 모두 처리한다.

게다가 투영, 변환과 픽셀 채우기 작업의 구체적인 방식을 개발자가 세세하게 지정하는것도 가능
 ☞ 셰이더(Shader) 기술을 통해서 가능함

3D 점들을 화면 좌표로 투영하는 작업 : 정점 셰이더(Vertex Shader)
화면에 보이는 다각형들을 픽셀로 채우는 작업 : 픽셀 셰이더(Pixel Shader)

특히 픽셀 셰이더는 색을 바꾸거나, 텍스쳐들을 혼합하거나, 빛과 그림자를 적용하는 등으로 최종적인 결과물의 모습을 임의로 제어할 수 있는 수단이다!

XNA는 정점 셰이더와 픽셀 셰이더를 지원하지 않는 구형 하드웨어를 아예 지원하지 않음.
 ☞ 따라서 하위 호환성을 위해 고정 기능 파이프라인이나 소프트웨어 렌더링으로 전환하는 문제는 전혀 생각할 필요가 없다. (XNA를 위해서는 적어도 셰이더 모델 1.1이 필요. 즉, 지포스3나 ATI 8000급의 그래픽 카드가 필요하다는 뜻)





 [2] 3D 자료가 2차원 화면으로 투영되기까지.
크게 다음과 같은 네 단계를 거친다.

- 3D자료를 WorldMatrix를 통해서 3차원 공간의 적절한 위쳉 적절한 방향, 크기가 되도록 배치.

- 3D 모형의 모든 점(Vertex)이 이 WorldMatrix에 의해 변환되어서 3D 세계 공간의 적절한 위치에 놓임.
DirectX나 고정 기능 파이프라인에서는 이러한 변환이 자동으로 일어나나, XNA에서는 셰이더로 모든 변환을 직접 수행해 주어야 함. (XNA는 고정 기능 파이프라인(FFP)을 전혀 지원하지 않음)

- 화면에 실제로 나타나는 것들은 카메라(또는 시점)의 위치와 방향에 의해 결정됨. 3D 세계 공간의 모든 것이 이 카메라 공간으로 투영됨.
다른말로 하면, 카메라 행렬을 적절히 설정하는것으로 3D 세계 공간의 어떤 부분을 어떤 각도로 표시할 것인가가 결정된다는 얘기. (Matrix.CreateLookAt 메서드로 생성한 카메라 행렬을 정점 셰이더에게 넘겨주면 정점 셰이더가 그것을 통해 3D 세계의 자료를 카메라 공간으로 변환)

- 카메라 공간에 투영된 모든 것을 화면 공간으로 변환. 최종적으로 2차원 화면 버퍼에 렌더링.
카메라 공간에서 화면 공간으로의 변환하는 방식은 투영 행렬(Projection Matrix 라 함)에 의해 결정.
카메라의 시야각, 가까운 평면과의 거리와 먼 평면과의 거리를 지정해서 투영 행렬을 만들어 준다.



 [3] 3D 자료의 최종적인 모습을 만드는 것
화면에 투영된 3D 자료에 픽셀들을 채워 최종적인 모습을 만드는 작업은 픽셀 셰이더가 담당.
화면이 2차원이므로 픽셀 셰이더도 2차원 공간에서 동작함.


'소프트웨어 Note > XNA Framework' 카테고리의 다른 글

FBX improvements in XNA Game Studio 3.0  (0) 2011.10.03
XNA와 3D 기초 (1)  (0) 2011.09.10
XNA Framework의 논리적 흐름  (0) 2011.07.21
이 댓글을 비밀 댓글로

XNA Framework의 논리적 흐름

by Blogger 하얀쿠아
2011. 7. 21. 17:10 소프트웨어 Note/XNA Framework


XNA는 Frameworkd 이기 때문에 일련의 논리적 순환 순서가 있다.
공부를 시작하면 우선 이를 인지해야 한다.

1. 메인 응용 프로그램이 게임 생성자를 호출한다.

2. 게임 생성자는 게임 컴포넌트들을 생성하고 게임 컴포넌트의 생성자를 호출한다.

3. XNA Framework에서 게임의 Initialize 메서드를 호출한다.

4. XNA Framework에서 각각의 게임 컴포넌트에 해당하는 Initialize 메서드를 호출한다.

5. XNA Framework에서 각각의 Drawable 게임 컴포넌트에 해당하는 LoadContent 메서드를 호출한다.

6. XNA Framework에서 게임의 LoadContent 메서드를 호출한다.

7. XNA Framework에서 게임의 Update 메서드를 호출한다.

8. XNA Framework에서 각각의 게임 컴포넌트에 해당하는 Update메서드를 호출한다.

9. XNA Framework에서 게임의 Draw메서드를 호출한다.

10. XNA Framework에서  각각의 Drawable 게임 컴포넌트에 해당하는 Draw 메서드를 호출한다.

11. 매초마다 7단계에서 10단계까지 여러번 반복한다.

12. 장치를 유실할 경우(사용자가 창을 다른 모니터로 이동했거나 화면 해상도가 변경되었을경우, 또는 창이 최소화된 경우 등) UnloadContent 메서드를 호출한다.

13. 장치를 리셋한 경우 6단계에서 다시 시작된다.

14. 게이머가 게임을 종료한다.

15. XNA Framework에서 게임의 Dispose 메서드를 호출한다.

16. 게임의 Dispose 메서드에서 기본 객체의 Dispose 메서드를 호출한다. 이경우 다음 두 단계를 발생시킨다.

17. XNA Framework에서 각각의 게임 컴포넌트에 해당하는 Dispose 메서드를 호출한다.

18 .XNA Framework에서 게임의 UnloadContent 메서드를 호출한다.

19. 게임의 Dispose 메서드로 초점(focus)이 반환되고 게임이 종료된다.

'소프트웨어 Note > XNA Framework' 카테고리의 다른 글

FBX improvements in XNA Game Studio 3.0  (0) 2011.10.03
XNA와 3D 기초 (1)  (0) 2011.09.10
XNA Framework의 논리적 흐름  (0) 2011.07.21
이 댓글을 비밀 댓글로