�{���ł̓v���O���~���OAPI�Ƃ��Ă�WiimoteLib��WiiYourself!���Љ�܂������A����2�ȊO�ɂ����Ȃ葽����API�v���W�F�N�g�����݂��܂��B
API�� | �X�^�b�N�Ή� | ���� | �@�\ | ���C�Z���X | ���� |
---|---|---|---|---|---|
WiimoteLib | B/W/T | C#/VB/C++(��.NET) | B/A/I/R/L/M | MS-PL�� | �{��4�͂ɂĉ�� |
Wiim | ×{W} | C++ | B/A/R/L/M | GNU LGPL | SDL�Ɖ����x���g�����Q�[���J������ |
B:�{�^���AA:�����x�Z���T�[�AI:�ԊO���AR:�o�C�u���[�^�[�o�́AL:LED�o�́AM:�����ڑ��AS:�X�s�[�J�[
�}���`�v���b�g�t�H�[��������Ƃ���API http://wiiuse.net/ http://www.wiili.org/index.php/Wiiuse http://arbitrary2.blog22.fc2.com/blog-entry-284.html http://sourceforge.net/project/showfiles.php?group_id=187194
cWiid��Linux���ŗ��p����Ă���WiiRemote�p���C�u�����ł��B
Wiim("whim"��������"wheem"�Ɣ������邻���ł�)�́A�č��~�l�\�^�B�ݏZ��eric_hcr80���ɂ���ĊJ�����ꂽC++�pAPI�ŁAGNU Lesser General Public License�Ō��J����A2007�N�ɊJ�����I�����Ă��܂��B
http://digitalretrograde.com/projects/wiim/
�@�\�I�ɂ͉����x�Z���T�A�{�^����Ԍ��o�ALED�E�o�C�u���[�^�o�͂Ȃǂ̊�{�@�\�ɉ����A�}���`WiiRemote�ւ̃A�N�Z�X�Ȃǂ���������Ă��܂��BVector�N���X�𗘗p���A���J�ɏ�����Ă���A�R�[�f�B���O�͂��₷���̂ł����A�ԊO���W�A�k���`���N�A�g���[�q�̋@�\�͖������̂܂܃v���W�F�N�g�͏I�����Ă���悤�ł�(���[���ɂĖ{�l�ɖ₢���킹���Ƃ���A���̃v���W�F�N�g�̋}���Ȑ����ɂ��A�Ƃ̂��Ƃł�)�B
Wiim�͏�L�̒ʂ�A���ɊJ�����I����Ă��܂����v���W�F�N�g�ł����A������I�[�v���\�[�XWiiRemote�pAPI�̒��ł��A�B��Q�[���炵���Q�[���uWiim Landar�v�̃\�[�X�R�[�h���t�����Ă��܂��B
�܂���Wiim�̃z�[���y�[�W����f���̎��s�t�@�C���uwiim\_lander\_demo.zip�v����肵�܂��傤�B������̃A�[�J�C�u�ɂ̓r���h�ς݂̎��s�t�@�C�����܂܂�Ă��܂��B�𓀂����t�H���_�ɂ�SDL.dll�ASDL\_gfx.dll�A�����Ď��s�t�@�C��WiimDemo.exe��3�̃t�@�C��������͂��ł��B�܂��́uWiimDemo.exe�v���_�u���N���b�N���Ă݂܂��傤�B
�������ʼn^���悯��uWiim Landar�v�̃Q�[����ʂ��\������܂��B
GiiMote�̓W���[�W�A�H�ȑ�̊w��Sam Whited(http://samwhited.com/)�ɂ���ĊJ������AGoogle Code(http://code.google.com/p/giimote/)�ɂČ��J����Ă���v���W�F�N�g�ŁA�uGame Maker�v�Ƃ����Q�[������p�X�N���v�g����GML(Game Maker Language)�ƌ����ł悭�g���鐔�w�c�[���uMATLAB�v�p��WiiRemote�@�\�g������Ă��܂��B���C�Z���X��GNU Lesser General Public License�ł��B
http://www.kosaka-lab.com/tips/2009/02/wii-raw.html
���̃Z�N�V�����ł́AWiiYourself!�t���f���̃\�[�X�R�[�h�uDemo.cpp�v��ǂ݁AWiiYourself!����������Ă���̂��������Ă����܂��傤�B���͂���Demo�������A��҂�gl.tter�����炪�F�߂�uWiiYourself!�B��̃h�L�������g�v�Ȃ̂ł�(�{��������)�B
�����ł́uWiiYourself! v.1.11 BETA�v�ɕt����Demo.cpp���R�����g�̖|��������ĉ�����܂��B�R�[�h�̑S���͂��ЍŐVWiiYourself!�ɓ�������Ă���Demo.cpp���Q�Ƃ��Ă��������B
s
// \ _______________________________________________________________________________ \ // // - WiiYourself! - native C++ Wiimote library v1.11 BETA // (c) gl.tter 2007-8 - http://gl.tter.org // // see License.txt for conditions of use. see History.txt for change log. // \ _______________________________________________________________________________ \ // // demo.cpp (tab = 4 spaces) #include "Demo.h" #include "..\wiimote.h" #include <mmsystem.h> // for timeGetTime // configs: #define USE_BEEPS_AND_DELAYS // undefine to test library works without them #define LOOK_FOR_ADDITIONAL_WIIMOTES // tries to connect any extra wiimotes // \ ------------------------------------------------------------------------------------ \ // simple callback example (we use polling for everything else): // \ ------------------------------------------------------------------------------------ \ void on_state_change (wiimote &remote, state_change_flags changed) { // extension was just connected: // �g���[�q�����ܐڑ����ꂽ��c if(changed & EXTENSION_CONNECTED) { #ifdef USE_BEEPS_AND_DELAYS Beep(1000, 200); #endif // switch to a report mode that includes the extension data (we will // loose the IR dot sizes) //���|�[�g���[�h���g���[�q�f�[�^���܂ރ��[�h�ɐ芷�� //(��������ƐԊO���h�b�g�T�C�Y�������Ȃ��Ȃ�܂�) remote.SetReportType(wiimote::IN_BUTTONS_ACCEL_IR_EXT); } // extension was just disconnected: // �g���[�q���ؒf���ꂽ��A else if(changed & EXTENSION_DISCONNECTED) { #ifdef USE_BEEPS_AND_DELAYS Beep(200, 300); #endif // use a non-extension report mode (this gives us back the IR dot sizes) // ��g���[�q���|�[�g���[�h���g���܂�(�ԊO���h�b�g�T�C�Y������) remote.SetReportType(wiimote::IN_BUTTONS_ACCEL_IR); } } // \ ------------------------------------------------------------------------------------ \ int _tmain () { //�R���\�[���ւ̕\�������� SetConsoleTitle(_T("- WiiYourself! - Demo: ")); HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); // write the title BRIGHT_WHITE; _tprintf(_T("\n")); _tprintf(_T(" -WiiYourself!- ")); WHITE; _tprintf( _T("library Demo: ")); CYAN; _tprintf( _T("| (c) ")); BRIGHT_CYAN; _tprintf( _T("gl")); BRIGHT_PURPLE;_tprintf( _T(".")); BRIGHT_CYAN; _tprintf( _T("tter")); CYAN; _tprintf( _T(" 2007-08\n") _T(" v") WIIYOURSELF_VERSION_STR _T(" | http://gl.tter.org\n")); CYAN;_tprintf(_T(" \ ______________________________________________________________________\n\n\n")); \ // let's load a couple of samples: wiimote_sample sine_sample, daisy_sample; // one .raw (just to demonstrate it) //�X�s�[�J�p�T���v�����O�t�@�C���̃��[�h if(!wiimote::Load16BitMonoSampleRAW(_T("1kSine16 (3130).raw"), true, FREQ_3130HZ, sine_sample)) { _tprintf(_T("\r ** can't find 'Sine16 (3130).raw' - (sample won't work!) \ **")); Beep(100, 1000); Sleep(3000); _tprintf(_T("\r") BLANK_LINE); } // and one (more convenient) .wav if(!wiimote::Load16bitMonoSampleWAV(_T("Daisy16 (3130).wav"), \ daisy_sample)) { _tprintf(_T("\r ** can't find 'Daisy16 (3130).wav' - (sample won't work!) \ **")); Beep(100, 1000); Sleep(3000); _tprintf(_T("\r") BLANK_LINE); } // create a wiimote object //WiiYourself!�̃I�u�W�F�N�g(Wiimote)���쐬 wiimote remote; // simple callback example (we use polling for almost everything here): // notify us when something related to the extension changes //(�����ł́A�قƂ�ǑS�Ă̏������|�[�����O���g���Ă��܂��̂�) //�P���ȃR�[���o�b�N�̗�Ƃ��āA //�g���[�q�ɉ����N�����Ƃ��ɂ���R�[���o�b�N���쐬���܂� remote.ChangedCallback = on_state_change; // avoid unwanted callback overhead by requesting only extension-related \ data //�g���W�f�[�^�������ĂԎ��ŕs�v�ȃR�[���o�b�N�̃I�[�o�[�w�b�h��h���ł��܂� remote.CallbackTriggerFlags = EXTENSION_CHANGED; //�Đڑ� reconnect: COORD pos = { 0, 6 }; SetConsoleCursorPosition(console, pos); // try to connect the first available wiimote in the system // (available means 'installed, and currently Bluetooth-connected'): //�uthe first available�v��WiiRemote��T���āA�ڑ������݂܂� //available�Ƃ́u�C���X�g�[������Ă��Č���Bluetooth�ڑ�����Ă���v�Ƃ����Ӗ� WHITE; _tprintf(_T(" Looking for a Wiimote ")); static const TCHAR* wait_str[] = { _T(". "), _T(".. "), _T("...") }; unsigned count = 0; while(!remote.Connect(wiimote::FIRST_AVAILABLE)) { _tprintf(_T("\b\b\b\b%s "), wait_str[count%3]); count++; #ifdef USE_BEEPS_AND_DELAYS Beep(500, 30); Sleep(1000); //�s�b�s�b�s...1�b���Ƃɉ���炵�Ă��܂� #endif } // connected - light all LEDs // �Ȃ������̂őS�Ă�LED��_�� remote.SetLEDs(0x0f); BRIGHT_CYAN; _tprintf(_T("\b\b\b\b... connected!")); #ifdef USE_BEEPS_AND_DELAYS Beep(1000, 300); Sleep(2000); #endif COORD cursor_pos = { 0, 6 }; #ifdef LOOK_FOR_ADDITIONAL_WIIMOTES // try to connect any additional wiimotes (just to show the code) //�lj���WiiRemote������ΐڑ�������(�ǂ��v���O���~���O���邩�������Ă��邾��) _tprintf(_T("\n\n")); //7��͂�����v wiimote *extra_motes [7] = { NULL }; // 7 should cover it unsigned detected = 0; while(detected < 7) { //�����ЂƂ�wiimote�I�u�W�F�N�g���쐬����FIRST_AVAILABLE�Őڑ������� wiimote *next = new wiimote; if(!next->Connect(wiimote::FIRST_AVAILABLE)) break; extra_motes[detected++] = next; WHITE ; _tprintf(_T(" also found wiimote ")); BRIGHT_GREEN; _tprintf(_T("%u\n\n"), detected+1); # ifdef USE_BEEPS_AND_DELAYS Beep(1000 + (detected*100), 100); Sleep(500); # endif } WHITE; _tprintf( ((detected == 7)? _T(" (can't detect any more).") : _T(" (no more found).")) ); # ifdef USE_BEEPS_AND_DELAYS Sleep(2000); # endif // clean up //�s�v��WiiRemote�� for(unsigned index=0; index<detected; index++) delete extra_motes[index]; SetConsoleCursorPosition(console, cursor_pos); #endif // LOOK_FOR_ADDITIONAL_WIIMOTES // ask the wiimote to report everything (using the 'non-continous updates' // default mode - updates will be frequent anyway due to the \ acceleration/IR // values changing): //�unon-continous updates�v���g�����ƂŁAWiiRemote�ɑS�Ă����|�[�g������悤�₢���킹 //�f�t�H���g���[�h:�X�V�͎����I�ɂȂ�B������ɂ�������x�Ƃ��ԊO���̒l���ς��Ƃ� // *note*: the report mode that includes the extension data unfortunately // only reports the 'BASIC' IR info (ie. no dot sizes) - so let's choose // the best mode based on the extension status (we also toggle modes // as needed in the callback above): //[���L]�F�g���[�q�f�[�^���܂ރ��|�[�g���[�h�͎c�O�Ȃ���uBASIC�v�ԊO������g���Ȃ� //(���Ƃ��h�b�g�̑傫���Ƃ�)�A�Ȃ̂Ŋg���[�q�̏�Ԃɂ���čœK�ȃ��[�h��I��ł������� //(��̃R�[���o�b�N�̒��ł��K�v�ȃ��[�h�������p���Ă��܂���) //�g���[�q�̏�Ԃɂ���ă��|�[�g�^�C�v��ݒ� //�g���[�q���g���Ƃ��͐ԊO���̃h�b�g�T�C�Y�͌����܂��� if(remote.bExtension) remote.SetReportType(wiimote::IN_BUTTONS_ACCEL_IR_EXT); // no IR dots else remote.SetReportType(wiimote::IN_BUTTONS_ACCEL_IR); // IR dots // print the button event instructions: // �{�^���̎g������\�� BRIGHT_WHITE; _tprintf(_T("\r -- TRY: B = rumble, A = square, 1 = sine, 2 = daisy, Home = \ Exit --\n")); // (stuff for animations) //timeGetTime()�������ĐU�����̃A�j���[�V�������쐬 DWORD last_rumble_time = timeGetTime(); // for rumble text animation DWORD last_led_time = timeGetTime(); // for led animation bool rumble_text = true; unsigned lit_led = 0; // display the wiimote state data until 'Home' is pressed: // WiiRemote�̃X�e�[�g(���)���uHome�v�{�^�����������܂ŕ\������ while(!remote.Button.Home()) { // the wiimote state needs to be refreshed for each pass // WiiRemote�X�e�[�g�͖���"���t���b�V��"�����K�v������܂� while(remote.RefreshState() == NO_CHANGE) //�����ω����Ȃ������Ƃ���CPU��hog�����Ȃ��悤�� Sleep(1); // // don't hog the CPU if nothing changed cursor_pos.Y = 8; SetConsoleCursorPosition(console, cursor_pos); // did we loose the connection? //�����ڑ������X�g������... if(remote.ConnectionLost()) { BRIGHT_RED; _tprintf( _T(" *** connection lost! *** \n") BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE BLANK_LINE); Beep(100, 1000); Sleep(2000); COORD pos = { 0, 6 }; SetConsoleCursorPosition(console, pos); _tprintf(BLANK_LINE BLANK_LINE BLANK_LINE); goto reconnect; } // rumble if 'B' (trigger) is pressed // �uB�v�{�^���������ƃo�C�u���[�^�[��U�������� remote.SetRumble(remote.Button.B()); // actions for buttons just pressed/released: // �{�^�����������/�������Ƃ�����actions���i�[����ϐ� static bool last_A = false, last_One = false, last_Two = false; //�{�^����actions�������}�N�� #define ON_PRESS_RELEASE(button, pressed_action, released_action) \ { bool pressed = remote.Button.button(); \ if(pressed) \ { /* just pressed? */ \ if(!last_##button) pressed_action; \ } \ else if(last_##button) /* just released */ \ released_action; \ /* remember the current button state for next time */ \ last_##button = pressed; } //���݂̃{�^���X�e�[�g������̂��߂ɕێ����� //���܉����ꂽ�̂��A�����ꂽ�̂��A�������ςȂ��Ȃ̂ł��̂��Ɨ������̂� //���������if���ŏ����̂�����Ȃ̂Łulast_##button�v�Ƃ��āA //ON_PRESS_RELEASE�}�N���ł܂Ƃ߂Ă��܂��B // play audio whilst certain buttons are held // ���ꂼ��̃{�^�����z�[���h���ꂽ�Ƃ��̉����t�@�C���Đ���whilst // ��`�g���Đ� ON_PRESS_RELEASE( A, remote.PlaySquareWave(FREQ_3130HZ, 0x20), remote.EnableSpeaker (false)); //�T�C���g�T���v�����O���Đ� ON_PRESS_RELEASE(One, remote.PlaySample (sine_sample), remote.EnableSpeaker (false)); //DAISY���T���v�����O���Đ� ON_PRESS_RELEASE(Two, remote.PlaySample (daisy_sample), remote.EnableSpeaker (false)); // �o�b�e���[���x�� // Battery level: CYAN; _tprintf(_T(" Battery: ")); // (the green/yellow/red colour ranges are rough guesses - my wiimote // with rechargeable battery pack fails at around 15%) // ��/��/�ԂɃJ���[�����W�𐄒� // (����WiiRemote�̏[�d�o�b�e���[�p�b�N�ł�15%�ŗ�����) if (remote.BatteryPercent >= 30) BRIGHT_GREEN; else if(remote.BatteryPercent >= 20) BRIGHT_YELLOW; else BRIGHT_RED; _tprintf(_T("%3u%% "), remote.BatteryPercent); DWORD current_time = timeGetTime(); // LED�A�j���[�V������1�b���ƍĐ� // LEDs: // animate them every second if((current_time - last_led_time) >= 1000) { //1�b�o�� remote.SetLEDs((BYTE)(1<<lit_led)); //�r�b�g�V�t�g���Z:[0001]��0-3�r�b�g���Ɉړ� lit_led = (++lit_led) % 4; //�]�� last_led_time = timeGetTime(); } CYAN; _tprintf(_T("LEDs: ")); WHITE; _tprintf(_T("[")); for(unsigned led=0; led<4; led++) { if(remote.LED.Lit(led)) { BRIGHT_CYAN; _tprintf(_T("*")); } else{ WHITE ; _tprintf(_T("-"));//_T("%c"), '0'+led); } } // �o�C�u���[�^�[ // Rumble WHITE; _tprintf(_T("] ")); if(remote.bRumble) { BRIGHT_WHITE; _tprintf(rumble_text? _T(" RUMBLE") : _T("RUMBLE ")); // animate the text if((current_time - last_rumble_time) >= 110) { rumble_text = !rumble_text; last_rumble_time = current_time; } } else _tprintf(_T(" ")); // ���݂�HID�ւ̏o�̓��[�h��\�� // Output method: CYAN; _tprintf( _T(" using %s\n"), (remote.IsUsingHIDwrites()? _T("HID writes") : _T("WriteFile()"))); //�{�^������ // Buttons: CYAN; _tprintf(_T("\n Buttons: ")); WHITE; _tprintf(_T("[")); for(unsigned bit=0; bit<16; bit++) { WORD mask = (WORD)(1 << bit); // skip unused bits if((wiimote_state::buttons::ALL & mask) == 0) continue; const TCHAR* button_name = wiimote::ButtonNameFromBit[bit]; bool pressed = ((remote.Button.Bits & mask) != 0); if(bit > 0) { CYAN; _tprintf(_T("|")); // seperator } if(pressed) { BRIGHT_WHITE; _tprintf(_T("%s") , button_name); } else{ WHITE ; _tprintf(_T("%*s"), _tcslen(button_name), _T("")); } } WHITE; _tprintf(_T("]\n")); // �����x�Z���T�[ // Acceleration: CYAN ; _tprintf(_T(" Accel:")); WHITE; _tprintf(_T(" X %+2.3f Y %+2.3f Z %+2.3f \n"), remote.Acceleration.X, remote.Acceleration.Y, remote.Acceleration.Z); // ��������(�Ō�̓K���Ȓl���玞�Ԃ��o���Ă���Ȃ�Ԃŕ\��) // Orientation estimate (shown red if last valid update is aging): CYAN ; _tprintf(_T(" Orient:")); WHITE; _tprintf(_T(" UpdateAge %3u "), remote.Acceleration.Orientation.UpdateAge); // �Ō�̕����X�V�����Ԑ�Ɣ��f����� // show if the last orientation update is considered out-of-date // (using an arbitrary threshold) if(remote.Acceleration.Orientation.UpdateAge > 10) RED; _tprintf(_T("Pitch %4ddeg Roll %4ddeg \n") _T(" (X %+.3f Y %+.3f Z %+.3f) \n"), (int)remote.Acceleration.Orientation.Pitch, (int)remote.Acceleration.Orientation.Roll , remote.Acceleration.Orientation.X, remote.Acceleration.Orientation.Y, remote.Acceleration.Orientation.Z); // IR: CYAN ; _tprintf(_T(" IR:")); WHITE; _tprintf(_T(" Mode %s "), ((remote.IR.Mode == wiimote_state::ir::OFF )? _T("OFF ") : (remote.IR.Mode == wiimote_state::ir::BASIC )? _T("BASIC") : (remote.IR.Mode == wiimote_state::ir::EXTENDED)? _T("EXT. ") : _T("FULL "))); // IR dot sizes are only reported in EXTENDED IR mode (FULL isn't supported \ yet) bool dot_sizes = (remote.IR.Mode == wiimote_state::ir::EXTENDED); for(unsigned index=0; index<4; index++) { wiimote_state::ir::dot &dot = remote.IR.Dot[index]; WHITE;_tprintf(_T("%u: "), index); if(dot.bVisible) { WHITE; _tprintf(_T("Seen ")); } else{ RED ; _tprintf(_T("Not seen ")); } _tprintf(_T("Size")); if(dot_sizes) _tprintf(_T("%3d "), dot.Size); else{ RED; _tprintf(_T(" n/a")); if(dot.bVisible) WHITE; } _tprintf(_T(" X %.3f Y %.3f\n"), dot.X, dot.Y); if(index < 3) _tprintf(_T(" ")); } // Speaker: CYAN ; _tprintf(_T(" Speaker:")); WHITE; _tprintf(_T(" %s | %s "), (remote.Speaker.bEnabled? _T("On ") : _T("Off")), (remote.Speaker.bMuted ? _T("Muted") : _T(" "))); if(!remote.Speaker.bEnabled || remote.Speaker.bMuted) RED; else//if(remote.IsPlayingAudio()) BRIGHT_WHITE; else WHITE; WHITE; _tprintf(_T("Frequency %4u Hz Volume 0x%02x\n"), wiimote::FreqLookup[remote.Speaker.Freq], remote.Speaker.Volume); // -- Extensions --: CYAN ; _tprintf(_T("__________\n Extnsn.: ")); switch(remote.ExtensionType) { case wiimote_state::NONE: { RED; _tprintf(_T("None \n")); _tprintf(BLANK_LINE BLANK_LINE BLANK_LINE); } break; case wiimote_state::PARTIALLY_INSERTED: { BRIGHT_RED; _tprintf(_T("Partially Inserted \n")); _tprintf(BLANK_LINE BLANK_LINE BLANK_LINE); } break; // -- Nunchuk -- case wiimote_state::NUNCHUK: { BRIGHT_WHITE; _tprintf(_T("Nunchuk ")); // Buttons: CYAN ; _tprintf(_T("Buttons: ")); WHITE; _tprintf(_T("[")); BRIGHT_WHITE; _tprintf(remote.Nunchuk.C? _T("C") : _T(" ")); CYAN ; _tprintf(_T("|")); BRIGHT_WHITE; _tprintf(remote.Nunchuk.Z? _T("Z") : _T(" ")); WHITE ; _tprintf(_T("] ")); // Joystick: CYAN ; _tprintf(_T("Joystick: ")); WHITE ; _tprintf(_T("X %+2.3f Y %+2.3f\n"), remote.Nunchuk.Joystick.X, remote.Nunchuk.Joystick.Y); // Acceleration: CYAN ; _tprintf(_T(" Accel:")); WHITE ; _tprintf(_T(" X %+2.3f Y %+2.3f Z %+2.3f \n"), remote.Nunchuk.Acceleration.X, remote.Nunchuk.Acceleration.Y, remote.Nunchuk.Acceleration.Z); // Orientation estimate (shown red if last valid update is aging): CYAN ; _tprintf(_T(" Orient:")); WHITE ; _tprintf(_T(" UpdateAge %3u "), remote.Nunchuk.Acceleration.Orientation.UpdateAge); // show if the last orientation update is aging if(remote.Nunchuk.Acceleration.Orientation.UpdateAge > 10) RED; _tprintf(_T("Pitch %4ddeg Roll %4ddeg \n") _T(" (X %+.2f Y %+.2f Z %+.2f) \n"), (int)remote.Nunchuk.Acceleration.Orientation.Pitch, (int)remote.Nunchuk.Acceleration.Orientation.Roll , remote.Nunchuk.Acceleration.Orientation.X, remote.Nunchuk.Acceleration.Orientation.Y, remote.Nunchuk.Acceleration.Orientation.Z); } break; // -- Classic Controller -- case wiimote_state::CLASSIC: case wiimote_state::CLASSIC_GUITAR: { BRIGHT_WHITE; // the Guitar Hero controller is just a classic controller with // another ID if(remote.ExtensionType == wiimote_state::CLASSIC_GUITAR) _tprintf(_T("Guitar Hero Contrl. ")); else _tprintf(_T("Classic Controller ")); // L: Joystick/Trigger WHITE; _tprintf(_T("L: ")); CYAN ; _tprintf(_T("Joy ")); WHITE; _tprintf(_T("X %+2.3f Y %+2.3f "), remote.ClassicController.JoystickL.X, remote.ClassicController.JoystickL.Y); CYAN ; _tprintf(_T("Trig ")); WHITE; _tprintf(_T("%+2.3f\n"), remote.ClassicController.TriggerL); // R: Joystick/Trigger WHITE; _tprintf(_T(" R: ")); CYAN ; _tprintf(_T("Joy ")); WHITE; _tprintf(_T("X %+2.3f Y %+2.3f "), remote.ClassicController.JoystickR.X, remote.ClassicController.JoystickR.Y); CYAN ; _tprintf(_T("Trig ")); WHITE; _tprintf(_T("%+2.3f\n"), remote.ClassicController.TriggerR); // Buttons: CYAN; _tprintf(_T(" Buttons: ")); WHITE; _tprintf(_T("[")); for(unsigned bit=0; bit<16; bit++) { WORD mask = (WORD)(1 << bit); // skip unused bits if((wiimote_state::classic_controller::buttons::ALL & mask) == 0) continue; const TCHAR* button_name = wiimote::ClassicButtonNameFromBit[bit]; const TCHAR* seperator = (bit==0)? _T("") : _T("|"); bool pressed = ((remote.ClassicController.Button.Bits & mask) != 0); CYAN; _tprintf(seperator); if(pressed) { BRIGHT_WHITE; _tprintf(_T("%s") , button_name); } else{ WHITE ; _tprintf(_T("%*s"), _tcslen(button_name), _T("")); } } WHITE; _tprintf(_T("]")); } break; case wiimote_state::BALANCE_BOARD: { BRIGHT_WHITE; _tprintf(_T("Balance Board")); // Buttons: CYAN ; _tprintf(_T(" Weight: ")); WHITE; _tprintf(_T("TL ")); _tprintf(_T("%2.2f"), remote.BalanceBoard.Kg.TopL); CYAN ; _tprintf(_T(" kg")); WHITE; ;_tprintf(_T(" TR ")); _tprintf(_T("%2.2f"), remote.BalanceBoard.Kg.TopR); CYAN; _tprintf(_T(" kg\n")); WHITE; _tprintf(_T(" BL ")); _tprintf(_T("%2.2f"), remote.BalanceBoard.Kg.BottomL); CYAN; _tprintf(_T(" kg")); WHITE; _tprintf(_T(" BR ")); _tprintf(_T("%2.2f"), remote.BalanceBoard.Kg.BottomR); CYAN; _tprintf(_T(" kg \n")); WHITE; _tprintf(_T(" Total ")); _tprintf(_T("%2.2f"), remote.BalanceBoard.Kg.Total); CYAN; _tprintf(_T(" kg")); } break; } } // disconnect (auto-happens on wiimote destruction anyway, but let's play \ nice) remote.Disconnect(); Beep(1000, 200); BRIGHT_WHITE; // for automatic 'press any key to continue' msg CloseHandle(console); return 0; } // \ ------------------------------------------------------------------------------------ \ // \ ------------------------------------------------------------------------------------ \
�{�͂ł́AC++���g���ĕ����G���W�����C�u������WiiRemote��g�ݍ��킹��3DCG�`��v���O���������܂��B
�����G���W���Ƃ́A�O���t�B�b�N�X�ƘA�g���āA���̂̏Փ˂�j��A�d�͂▀�C�A�����Ȃǂ̗͊w�I�Ȍv�Z�����Ă����֗��ȃ��C�u�����ł��B�ŋ߂̓R���s���[�^�[�̑��x�������ɂȂ��Ă������Ƃ�����A���G�ȕ��������A���^�C��(������)�����ł���悤�ɂȂ��Ă��܂����B���p�̂��̂ł́A�uHavok�v��uPhysX�v�ƌ��������̂�����A�Q�[�����i�Ȃǂɑg�ݍ��܂�Ă��܂��B�I�[�v���\�[�X�̂��̂ł́A�uOpen Dynamics Engine(ODE)�v��uBullet�v�Ƃ��������̂��L���ł����A�{�͂ł́A���̒��ł��I�[�v���\�[�X�́uBullet�v�Ƃ������C�u�������Љ�܂��B
�uBullet�v�ł�OpenGL(GLUT)���g�p�����f������������Ă��܂����A�{�͂ł́A�uBullet�v�ƁuDirectX�v�A�uWiiYourself!�v���g���āA�����{3DCG�{WiiRemote��g�ݍ��킹���C���^���N�e�B�u�ȃv���O�������J�����܂�(���M���́F"shader.jp" masafumi��)�B
Bullet Physics Library��ZLib���C�Z���X�̃I�[�v���\�[�X�����G���W���ł��B�I�[�v���\�[�X�̂��ߖ����ŗ��p���邱�Ƃ��ł��AWindows�AMac�ALinux�APlayStation 3�AXbox 360�AWii�ȂǗl�X��OS��v���b�g�t�H�[���Ŏg����悤�ɂȂ��Ă��܂��BBullet�ł́A���̓��m�̏Փˏ�����A�W���C���g�A�z��[�v�̂悤�ȃ\�t�g�{�f�B�Ȃǂ̃Q�[�����ł̕����̏������s���Ă���܂��B
Bullet��SDK�́A�����T�C�g�̕�����_�E�����[�h���ł��܂��B�{���̎��M�i�K�ł́A�ŐV�ł̓o�[�W����2.74�ɂȂ�܂��B
http://www.bulletphysics.com/
Bullet��SDK�́AZIP���k���ꂽ�A�[�J�C�u�ɂȂ��Ă��܂��B�C���X�g�[���`���ł͂Ȃ��̂ŁA������HDD�̔C�ӂ̏ꏊ�ɓW�J����K�v������܂��B�{���ł́A���L�̂悤��C�h���C�u�̒����ɓW�J�������̂Ƃ��Ęb��i�߂܂��B
C:\bullet-2.74
Bullet SDK�̓W�J���o���܂�����ŏ��ɂ�邱�Ƃ̓��C�u�����̃r���h�ɂȂ�܂��B"C:\bullet-2.74\msvc"�Ƃ����t�H���_�ɐ}3�̂悤�ɔz�u����Ă��܂��B6�`8�܂ł̃t�H���_������܂����A�\1�̂悤��Visual Studio�̃o�[�W�����ɑΉ��������̂ɂȂ��Ă��܂��B6�`8�̊e�t�H���_�ɂ́AVisual C++ 6.0�̃��[�N�X�y�[�X����Visual C++ 2005�܂ł̃\�����[�V����������܂��BVisual C++ 2008�̃\�����[�V�����͕t�����Ă��܂��AVisua C++ 2005�̂��̂ł���8���R���o�[�g���邱�Ƃŗ��p���邱�Ƃ��ł��܂��B
�t�H���_�� | �Ή�����Visual Studio / Visual C++ |
---|---|
6 | Visual Studio 6.0 / Visual C++ 6.0 |
7 | Visual Studio .NET / Visual C++ .NET |
71 | Visual Studio .NET 2003 / Visual C++ .NET 2003 |
8 | Visual Studio 2005 / Visual C++ 2005 |
msvc�t�H���_�̒��ɂ́ABullet�Ŏg�����C�u�����̂��߂̃\�����[�V�����t�@�C���̑��ɁA�T���v���v���O�����̃\�����[�V�����t�@�C���Ȃǂ�����܂��B���C�u�������r���h����ɂ�wksbullet.sln���J���܂�(Visual C++ 6.0�ȊO)�B
�ŐV��Visual Studio 2008���g���Ă���ꍇ�ɂ́A�u8�v���Ȃ킿VC2005�̃v���W�F�N�g���R���o�[�g���Ă���g���܂��B�u8�v�̃t�H���_���R�s�[���āu9�v�Ɩ��O��ς��Ă����܂��傤�BVisual Studio 2008���N�����ăR�s�[�����uwksbullet.sln�v���J�����ƂŁA�E�B�U�[�h���N�����A�R���o�[�g�ł��܂��B��������̃v���W�F�N�g������܂����A�uapp�`�v�Ǝn�܂���̂̓T���v���v���O�����̃v���W�F�N�g�Łulib�`�v�Ŏn�܂���̂̓��C�u�����̃t�@�C���ɂȂ�܂��B�K�v�Ȃ̂̓��C�u�����Ȃ̂ŁAlib�`�Ŏn�܂�v���W�F�N�g�Ɋւ��Ă��ׂ�Debug��Release�Ńr���h���Ă����܂��B
�r���h���I����"C:\bullet-2.72\out"�Ƃ����t�H���_�Ƀ��C�u�������r���h����܂��BVisual Studio 2005�iVisual Studio 2008�łɍX�V�����ꍇ���j�ł̃r���h�ł���Adebug8��release8�̂悤�ȃt�H���_���쐬����Ă���A���̉���libs�Ƃ����t�H���_������A�����Ƀr���h���ďo�������C�u����������܂��B���C�u�������r���h�ł��Ă�����C�u�����̏����͊����ł��B
�{���ł́A3D�̕`����s�����߂�DirectX�𗘗p���܂��BDirectX���g�����v���O������g�ނ��߂ɂ́AMicrosoft�̃T�C�g����SDK���_�E�����[�h���Ă��܂��BMicrosoft��DirectX�̊J���Ҍ����̃T�C�g�͓��{��̂��̂Ɖp��̂��̂�����܂��BMicrosoft�̓A�����J�̊�Ƃ̂��߉p��̕����ŐV�̏��ɓ���܂��B
DirectX�̊J���Ҍ����T�C�g���{��http://www.microsoft.com/japan/msdn/directx/
�p��http://msdn.microsoft.com/en-us/directx/default.aspx
SDK�͊J���Ҍ����T�C�g�̕�����_�E�����[�h���邱�Ƃ��o���܂��BDirectX SDK�͐��������ƂɃo�[�W�������X�V����邽�߁ADirectX SDK August 2008�̂悤�ɁA���A�N�����O�ɓ���܂��B�{�����M�i�K�ł�Augst 2008���ŐV�̃o�[�W�����ɂȂ�܂��B�{���ł͂��̃o�[�W���������ɃT���v�����쐬���Ă��܂��B
DirectX SDK�̓C���X�g�[���`���ɂȂ��Ă��邽�߃Z�b�g�A�b�v�͊ȒP�ɍs�����Ƃ��o���܂��BVisual Studio 2005�ȍ~�𗘗p���Ă���ꍇ�ɂ́A�C���N���[�h�t�@�C����C�u�����t�@�C���̃p�X�Ȃǂ̐ݒ���C���X�g�[���������ōs���Ă���܂��B
DirectX��SDK�ɂ́ADXUT�ƌĂ��N���X���C�u�������t�����Ă��܂��B���̃��C�u�����ł́AWindows�̐����}�E�X�A�L�[�{�[�h�������e��R�[���o�b�N����A3DCG�̃��f���f�[�^��ǂݍ���ŕ\������N���X���ʏ�Ƀ{�^����e�L�X�g�{�b�N�X�Ȃǂ�GUI��\������N���X�Ȃǂ��p�ӂ���Ă��܂��B����̃T���v���ł́A���������֗��ȃ��C�u�������g����DirectX�̃��f���`���ł���X�t�@�C����ǂݍ���ŕ\�����Ă݂܂��B���̏͂̃v���O�����́ADirectX SDK�ɕt������SimpleSample(�}4)���x�[�X�ɍ���Ă����܂��BSimpleSample�́ADirectX SDK�ɕt������DirectX Sample Browser�i�}5�j��I������Insrall Project��I������ƃZ�b�g�A�b�v�ł��܂��B
PC��3D��\�����邽�߂̃��C�u�����ɂ͍���Љ��DirectX�̑���OpenGL������܂��BOpenGL�ł́A�N���X�v���b�g�t�H�[����3D���C�u�����̂���DirectX�ƈقȂ�l�X��OS��v���b�g�t�H�[����Ŏg�����Ƃ��o���܂��B�������A���ۂ̃A�v���P�[�V�����J���ɂ����ẮAOpenGL�ȊO�̕����̃v���O�����ɂ��Ă�OS��v���b�g�t�H�[���Ɉˑ������R�[�h�������Ȃ��ƍs���Ȃ����Ƃ������ł��B���Ƃ��AWindows��Mac OS X�ł��ꂼ��E�B���h�E��\������v���O�������ꍇ�ɂ́A�eOS�ɉ������R�[�h�������܂��B��������OS�Ԃ̊�{�I�ȕ����ł̍��ق��z�����Ă���郉�C�u�����Ƃ���GLUT�Ƃ������C�u����������܂��BGLUT�ł́A�E�B���h�E�̐�����}�E�X�A�L�[�{�[�h�Ȃǂ̏�����`��p�̊����ȒP�ɐݒ肵�Ďg�����Ƃ��o���܂��B������ƑO�u���������Ȃ�܂������ADXUT��OpenGL�ł���GLUT�̊W�ɋ߂����C�u�����ŁADirectX���g�����v���O�����ɂ����ėl�X�ȏ�����⏕���Ă���郉�C�u�����ɂȂ��Ă��܂��B�{���ł́A����DXUT���g���Ă���y��DirectX�̃v���O���������܂��BDXUT��GLUT�ɋ߂��Ə����܂������AGLUT�ł̓}�E�X��L�[�{�[�h�A�`����Ȃǂ̃C�x���g�����O�Ɋ��ŃZ�b�g���Ă����̂ł����ADXUT�ł�����ɋ߂��d�g�݂ɂȂ��Ă��܂��BDXUT�ł́A�}�E�X��L�[�{�[�h������`����Ȃǂ͍ŏ��ɃR�[���o�b�N�����`���ăZ�b�g���܂��B���ۂɁASimpleSample�̃R�[�h�����Ă݂܂��B
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR \ lpCmdLine, int nCmdShow ) { // Enable run-time memory check for debug builds. #if defined(DEBUG) | defined(_DEBUG) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif // DXUT will create and use the best device (either D3D9 or D3D10) // that is available on the system depending on which D3D callbacks are set \ below // Set DXUT callbacks DXUTSetCallbackMsgProc( MsgProc ); DXUTSetCallbackKeyboard( OnKeyboard ); DXUTSetCallbackFrameMove( OnFrameMove ); DXUTSetCallbackDeviceChanging( ModifyDeviceSettings ); DXUTSetCallbackD3D9DeviceAcceptable( IsD3D9DeviceAcceptable ); DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice ); DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice ); DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice ); DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice ); DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender ); InitApp(); DXUTInit( true, true, NULL ); // Parse the command line, show msgboxes on \ error, no extra command line params DXUTSetCursorSettings( true, true ); DXUTCreateWindow( L"SimpleSample" ); DXUTCreateDevice( true, 640, 480 ); DXUTMainLoop(); // Enter into the DXUT render loop return DXUTGetExitCode(); }
DXUT�̃��C�u�����Ɋ܂܂����̖��O�ɂ́ADXUT�̐ړ��ꂪ���܂��BDXUTSet�`()�ł́A�}�E�X��L�[�{�[�h�A�`��A�A�v���P�[�V�����̏I���ȂNJe��̃C�x���g�ɑΉ������R�[���o�b�N���̃Z�b�g���s���܂��B����g���Ă�����̂ɂ��Ă͈ȉ��̕\2�ɂ܂Ƃ߂Ă����܂��B
�\2�R�[���o�b�N���̎�ރR�[���o�b�N�����Z�b�g������C�x���g�̓��eDXUTSetCallbackMsgProc�E�B���h�E�̃��b�Z�[�W����������DXUTSetCallbackKeyboard�L�[�{�[�h�̓��͂���������DXUTSetCallbackFrameMove���t���[���Ăяo����鏈��DXUTSetCallbackDeviceChanging Direct3D�f�o�C�X�ɉ��炩�̕ύX���������Ƃ������������DXUTSetCallbackD3D9DeviceAcceptable Direct3D�f�o�C�X���A�w�肵�����[�h�ŋN�����邩�ǂ������`�F�b�N����ۂɎg������DXUTSetCallbackD3D9DeviceCreated Direct3D�f�o�C�X�̐������ɌĂяo����鏈��DXUTSetCallbackD3D9DeviceReset Direct3D�f�o�C�X�̃��Z�b�g���ɌĂяo����鏈��DXUTSetCallbackD3D9DeviceLost Direct3D�f�o�C�X�����X�g�������ɌĂяo����鏈��DXUTSetCallbackD3D9DeviceDestroyed Direct3D�f�o�C�X���j�������ꍇ�ɌĂяo����鏈��DXUTSetCallbackD3D9FrameRender�`�揈�����s��DXUTSetCallbackMouse�}�E�X�̏������s�����i��̃T���v���ł͗��p���Ă܂���j�B
�R�[���o�b�N���̃Z�b�g��ɂ́ADXUT�̊e������Ăяo����܂��B���̖����͕\3�ł��B
���������̓��eDXUTInit DXUT�̏���������DXUTSetCursorSettings�J�[�\���̕\���Ɋւ��Đݒ肷���DXUTCreateWindow�E�B���h�E�̐���DXUTCreateDevice Direct3D�f�o�C�X�̐���DXUTMainLoop���C�����[�v�̌Ăяo��DXUTGetExitCode�I������
DirectX�ɂ́AX�t�@�C��(�g���q.x)�Ƃ���3D���f���f�[�^�̌`��������܂��B���̃f�[�^�́A3D���f�����O�\�t�g���g�����Ƃō쐬���邱�Ƃ��o���܂��B���f�����O�\�t�g�́A3ds Max��Maya�ASoftimage XSI�Ȃǂ̃\�t�g����\�I�ł����A�����̃\�t�g�E�F�A�͌l�����ɂ͑�ύ����ł��B�l�ł���y�Ɏ�ɓ����\�t�g�E�F�A�ł́A���^�Z�R�C�A�i�V�F�A�E�F�A�ł����A�����ł�����܂��j��Blender�i�����j�Ƃ��������̂�����܂��BDXUT�̃N���X�̒��ɂ́AX�t�@�C����ǂݍ���ŕ`�悷��N���X���p�ӂ���Ă��܂��B����́A���ꂪ�֗��Ȃ̂ł�����g���Ă����܂��BDXUT��X�t�@�C���`��N���X�𗘗p���邽�߂ɂ́A�v���W�F�N�g��2�̃t�@�C����lj�����K�v������܂��B���̃t�@�C����SDKmesh.h��SDKmesh.cpp�ɂȂ�܂��B���̃t�@�C����DXUT�t�H���_������Optional�Ɋ܂܂�Ă��܂��BVisual Studio��ŁA�\�����[�V�����G�N�X�v���[����DXUT�t�H���_���E�N���b�N���āy�lj�(D)�z�́y��������(G)...�z��I�����Ēlj����܂��BX�t�@�C����`�悷��N���X�͂��̒lj������w�b�_�[�t�@�C���Ɋ܂܂�Ă���CDXUTXFileMesh�N���X���g���܂��B
�EX�t�@�C���EX�t�@�C���̓ǂݍ���X�t�@�C���̓ǂݍ��݂���`��܂ł́A�O�q��CDXUTXFileMesh�N���X���g���܂��B
4.3�����ł����������v���O�����́A�}x�̂悤�ɂȂ�܂��BDXUT�ŗe�Ղ�r�Ă���N���X���g���Ƃƌ����݂ƍs��̃Z�b�g�����ŊȒP�ɕ`��ł����B
�����ł͑O�͂�DirectX�̃v���O�����ɕ����G���W���̃R�[�h�������ĕ��̂��Փ˂����蒵�˕Ԃ����肷��V���v���ȃv���O������������܂��B
6.1 Bullet��g�ݍ��ޑO�̏͂ŁADXUT���g����X�t�@�C���̃��f����\������v���O�����̉�������܂����B���̏͂ł́A�O�͂̃T���v�����x�[�X��Bullet�̃v���O������g�ݍ����3DCG�ɏՓˏ����Ȃǂ��������܂��B
6.2 Bullet�𗘗p���鏀��2.2��Bullet SDK���烉�C�u�������r���h���܂����B������v���W�F�N�g�ɒlj����܂��B�V���ɒlj����郉�C�u�����͉��L�ł��B
�EDebug�r���h��libbulletdynamics_d.lib libbulletcollision_d.lib libbulletmath_d.lib
�ERelase�r���h��libbulletdynamics.lib libbulletcollision.lib libbulletmath.lib
Debug�r���h�łɂ́A�u_d�v���t���܂��B
6.3 Bullet�̏�����
6.4���̂̓o�^
6.4.1�n�ʂ̒�`
6.4.2���̍��̂�
6.4.3�{�b�N�X�̓o�^
6.5�`��R�[�h
6.6�I������
7.WiiRemote���g�����T���v�����̏͂ł́A�O�͂̕����ɉ����Ă��悢��WiiRemote��g�ݍ�������������܂��B
7.1 WiiYourSelf !�̏���WiiRemote������̃v���O�����ɑg�ݍ��ނ��߂̃��C�u������\�t�g�E�F�A�ɂ��ėl�X�Ȃ��̂����J����Ă��܂��B����́AC++���痘�p�ł���WiiYourSelf !�𗘗p���܂��B
7.2 WiiYourSelf !�̑g�ݍ���
7.�Z���T�o�[���g����Pick�v���O����
7.1�Z���T�o�[�̗��p7.2 Pick�����̎���
8.WiiRemote�ƕ����G���W�����g�����~�j�Q�[��
8.1�~�j�Q�[�������
CAD(Computer Aided Design)��3DStudioMax�Ȃǂ�3D�f�[�^����A�C���^���N�e�B�u��3D�O���t�B�b�N�X�A�v���P�[�V�����𐧍�ł���c�[���ɁuVirtools(���@�[�c�[���X)�v������܂�(http://www.virtools.com/)�B���E�ő��CAD���[�J�[�A�t�����X�u�_�b�\�[�V�X�e���Y(Dassault Systemes)�v�̃O���[�v�ŁA�ŋ߂ł́u3dvia�v�Ƃ����u�����h�œW�J����Ă��܂��B
Virtools�͍����ȎY�ƌ������i�ł��邱�Ƃ�����A���{�ł͂���قǗL���ł͂���܂��A���Ăł͍ł����p����Ă�������v���b�g�t�H�[���ł�(�M�҂��t�����X�ł͓���I�Ɏg���Ă��܂����I)�B���f����摜�Ȃǂ̃��\�[�X��GUI�����łقƂ�ǂ̃C���^���N�e�B�u�f�U�C���W�����Ă��܂��A�Ƃ����_������I�ŁA�v���O���~���O�s�v�ł��B�������[���J��������ꍇ�̓v���O���~���O���K�v�ł����A�����_���[��v���O�C���ȂǂقƂ�ǂ̃\�[�X�͌��J����Ă��܂��B
�Y�Ɨp��CAD�f�[�^����AVirtools���g����Web��Ō��J�����C���^���N�e�B�u�ȏ��i�L���̊J���A�v���g�^�C�v���i�̃��[�U�����Ȃǂ��J�����邱�Ƃ��ł��܂����A���Ƃ���Virtools�̓Q�[���p�v���g�^�C�s���O�c�[���ł����B�Q�[���J���̃v���g�^�C�v�A�܂�Q�[���̗����ʔ����̍����Ɋւ�镔���̐v���v�����i�[��GUI�ōs���āA�ŏI�H���ł���œK����v���b�g�t�H�[���̓Ǝ������Ȃǂ��v���O���~���O�ōs���A�Ƃ������Q�[���J����@�ł��B
Virtools�͌����Ƀ��C�Z���X�����c�[���J���p�[�g�i�[�ł��̂ŁA�\�j�[PSP�p��C�V��Wii�p��Virtools�����݂��܂��B�C�V��Wii�̊J�����C�Z���X�������Ă���Q�[���J����Ƃł���AWiiRemote�W�̃v���O�C������肷�邱�Ƃ��ł��邻���ł��B
Virtools�̊J���҃R�~���j�e�B�͊����ŁA�X���b�v�~�[�g(http://www.theswapmeet-forum.com/)�ŗl�X�ȏ���\�[�X�A�v���O�C�������L����Ă��܂�(PC��ŗ��p�ł���WiiRemote�̃v���O�C���W����������܂�)�B�����Q�[�������ڎw���w�������A�t���[�̃Q�[�����҂ɂƂ��āA����͋��͂ȃ\�����[�V�����ł��BVirtools���g����PC��ŃQ�[���̃v���g�^�C�v�𐧍삷��A���₭�A�C�f�B�A���`�ɂł��܂����A������Z�p�I�ȃ��X�N������ł��邩��ł��B
�M�҂�Virtools���WiiRemote�𗘗p����Q�[�����������J�����܂�����(��q)�A�v���O�C���̊J�����܂ߔ��ɍ����ɁA�Â������̂���邱�Ƃ��ł��܂����B�����߂ł��B����Virtools�̃z�[���y�[�W����e��f�������Ă݂Ă��������B
��Virtools(3DVia)�Ɋւ�����Virtools(�p��) http://www.virtools.com/
���{�ł͎O�������ƃN���b�Z���g���㗝�X���s���Ă��܂��B�R���e���c�̐���T�|�[�g��Z�p�T�|�[�g�A����x���A�w�Z�������C�Z���X�̔��Ȃǃ��Z���[�e�Ђ̓��ӕ��삪����܂�����A���Ж₢���킹�Ă݂Ă��������B
���O������(Virtools�W) http://www.san-toku.co.jp/VirtoolsOnlinePage/VirtoolsIndex.htm
��������ЃN���b�Z���ghttp://www.crescentvideo.co.jp/virtools/
��WiiYourself! on Virtools Se'bastion Kuntz (http://cb.nowan.net/blog/)
Bespoke 3DUI XNA Framework Version 4.2 http://www.bespokesoftware.org/wordpress/?page_id=50
http://www.wiimoteproject.com/
%{Wii Fit�J���C���^�r���[} %http://wii.com/jp/articles/wii-fit/crv/vol2/index.html %�u���J�a�v�̊J���҂��Ƃ����Ƃ��낪�ʔ����ł��ˁB