'Wii'에 해당되는 글 2

  1. 2009.06.05 [E3 2009] 3차원 체감형 게임이 대세
  2. 2008.07.17 Wiimote Library 분석 (1)

E3의 3차원 체감형 게임기들

 1. MS XBOX의 Project Natal

 

  결론적으로 보면 세개의 게임회사에서 보인 것 중에 최고다.

  스티븐 스필버그가 기획했다고 하는 이 게임방식은

  컨트롤러가 없이 몸으로 직접 게임을 체험할 수 있게 하는 것이 장점이다.

  아래의 Official 데모를 보면 좀 과장이겠지 하고 생각했었는데,

E3에서 시연하는 데모를 보니 과장이 아니라는 것을 알 수 있었다.

단순히 특정부위만 인식해서 동작을 감지하는 것이 아니라

신체 전체를 3차원으로 인식해서 게임과 일치시키는 것으로 추정된다.


 

2. 닌텐도 Wii

 vitality sensor

기존의 위 리모트의 외장포트에 센서를 추가로 연결해서

생체 신호를 감지하는 것이다. 기존의 것에 대한 확장이라고 볼때 그들의 전략을 잘 볼 수 있는 부분이지만

그리 새롭게 느껴지지는 않는다. 

motion plus

이것도 기존의 위 리모트에 추가 센서를 연결하는 것으로

탁구, 농구, 검도, 양궁, 골프, 요트 등의 스포츠를 실제적으로 체험할 수 있게 한다.

기존의 위모트를 보완한 것으로 보이고 각 스포츠에 대한 동작을

일부 기억하고 있어야 가능한 기술로 보인다.


 

3. PS3

모션 컨트롤러

PS3에서도 아이스크림을 연상시키는 컨트롤러를 내놓았는데,

기존에 봐왔던 AR(Augmented Reality)의 모습과 크게 다르지 않다.

단지 차이점이 있다고 하면, 사람의 모습을 다 인식하고 있다는 것이 그 차이라고 하겠다.

 


 

세가지의 체험형 게임 컨트롤러를 보면서, 닌텐도는

기존에 장악했던 Wii를 가지고 더욱 박차를 가하려고 하고 있고

MS는 컨트롤러가 없는 게임기를 가지고 나와 체험할 수 있게 해서

모두를 놀라게 했다. 단연 Natal이 이번 E3에서는 돋보이는 존재라 할 수 있겠고

게임 역시 다양하게 보여주어서 가능성을 보여주고 있다.

하지만 sony의 PS3는 기존 AR 수준에 그친 데모를 보여주면서

게임 적용에 대해 뒤진듯한 느낌을 받았다.

 

전쟁과도 같은 게임시장에서 선두를 탈환한 닌텐도에 대해

MS의 natal이 역전할 수 있을 것인지 기대하게 된다.


Interesting/Wii | Posted by hyena0 2008. 7. 17. 00:37

Wiimote Library 분석 (1)




Wiimote Library

Wiimote Library 내용을 알아야 응용프로그램을 만들 수 있기 때문에 라이브러리 내용을 살펴보도록 하겠다.

위모트 라이브러리는 C#으로 작성되어 있고, Wiimote.cs, HIDImports.cs, Events.cs, DataTypes.cs 네가지 파일로 구성된다.

Wiimote.cs는 wiimote class가 있고 위모트를 연결하고 동작하기 위한 Method 들을 포함하고 있어서 , 윈도우프로그램에서 초기화와 데이터입출력을 처리하는 부분이 된다.
HIDImports.cs는 인식된 위모트를 연결해주는 역할을 하고, Events.cs는 이벤트 처리에 해당하는 부분이고, DataTypes.cs는 데이터처리에 필요한 구조체들을 정의하고 있다.  

각 해당 파일에 대한 클래스와 메소드를 정리해 보았다.

------------------------
*Wiimote.cs

namespace WiimoteLib
{
public class Wiimote : IDisposable
{
public Wiimote();
public void Connect();
public void Disconnect();
private void BeginAsyncRead();
private void OnReadData(IAsyncResult ar);
private bool ParseInput(byte[] buff);
private void InitializeExtension();
private byte[] DecryptBuffer(byte[] buff);
private void ParseButtons(byte[] buff);
private void ParseAccel(byte[] buff);
private void ParseIR(byte[] buff);
private void ParseExtension(byte[] buff, int offset);
private void ParseReadData(byte[] buff);
private byte GetRumbleBit();
public void SetReportType(InputReport type, bool continuous);
public void SetLEDs(bool led1, bool led2, bool led3, bool led4);
public void SetLEDs(int leds);
public void SetRumble(bool on);
public void GetStatus();
private void EnableIR(IRMode mode);
private void DisableIR();
private void ClearReport();
private void WriteReport();
public byte[] ReadData(int address, short size);
public void WriteData(int address, byte data);
public void WriteData(int address, byte size, byte[] buff);
}
}
---------------------------
* HIDImports.cs

class HIDImports
{
[DllImport("hid.dll")]
public static extern void HidD_GetHidGuid(out Guid gHid);
public static extern Boolean HidD_GetAttributes(IntPtr HidDeviceObject, ref HIDD_ATTRIBUTES Attributes);
internal extern static bool HidD_SetOutputReport(
   IntPtr HidDeviceObject,
   byte[] lpReportBuffer,
   uint ReportBufferLength);
[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetupDiGetClassDevs(
   ref Guid ClassGuid,
   [MarshalAs(UnmanagedType.LPTStr)] string Enumerator,
   IntPtr hwndParent,
   UInt32 Flags
   );
public static extern Boolean SetupDiEnumDeviceInterfaces(
   IntPtr hDevInfo,
   //ref SP_DEVINFO_DATA devInfo,
   IntPtr devInvo,
   ref Guid interfaceClassGuid,
   Int32 memberIndex,
   ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
  );
public static extern UInt16 SetupDiDestroyDeviceInfoList( IntPtr hDevInfo );

[DllImport(@"setupapi.dll", SetLastError = true)]
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
   IntPtr hDevInfo,
   ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
   IntPtr deviceInterfaceDetailData,
   UInt32 deviceInterfaceDetailDataSize,
   out UInt32 requiredSize,
   IntPtr deviceInfoData
  );
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
   IntPtr hDevInfo,
   ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
   ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
   UInt32 deviceInterfaceDetailDataSize,
   out UInt32 requiredSize,
   IntPtr deviceInfoData
  );

[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern SafeFileHandle CreateFile(
   string fileName,
   [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
   [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
   IntPtr securityAttributes,
   [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
   [MarshalAs(UnmanagedType.U4)] EFileAttributes flags,
   IntPtr template);

[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
}
---------------------------
* Events.cs

public delegate void WiimoteChangedEventHandler(object sender, WiimoteChangedEventArgs args);
public delegate void WiimoteExtensionChangedEventHandler(object sender, WiimoteExtensionChangedEventArgs args);
public class WiimoteExtensionChangedEventArgs: EventArgs
public class WiimoteChangedEventArgs: EventArgs
{
public WiimoteExtensionChangedEventArgs(ExtensionType type, bool inserted);
}
public class WiimoteChangedEventArgs: EventArgs
{
public WiimoteChangedEventArgs(WiimoteState ws);
}
---------------------------
*DataTypes.cs

public class WiimoteState
public struct LEDState
public struct NunchukCalibrationInfo
public struct ClassicControllerCalibrationInfo
public struct NunchukState
public struct ClassicControllerButtonState
public struct ClassicControllerState
public struct IRState
public struct AccelState
public struct AccelCalibrationInfo
public struct ButtonState
public enum ExtensionType : byte
public enum IRMode : byte
---------------------------