Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenVR-IVRSystem::GetControllerState始终返回空结构_C++_Htc Vive_Openvr - Fatal编程技术网

C++ OpenVR-IVRSystem::GetControllerState始终返回空结构

C++ OpenVR-IVRSystem::GetControllerState始终返回空结构,c++,htc-vive,openvr,C++,Htc Vive,Openvr,我一直在关注Kamran Bigdely Shamloo关于如何从HTC Vive获取位置信息的文章,到目前为止,它一直运作良好。我的下一步是听按钮按下。我已经阅读了文档,它说我所需要做的就是查询IVRSystem::GetControllerState,它将返回一个 具有控制器当前状态的结构 但是,此结构始终包含值为0的变量。在主函数的while true循环中调用以下函数 bool CMainApplication::HandleInput() { SDL_Event sdlEvent; b

我一直在关注Kamran Bigdely Shamloo关于如何从HTC Vive获取位置信息的文章,到目前为止,它一直运作良好。我的下一步是听按钮按下。我已经阅读了文档,它说我所需要做的就是查询IVRSystem::GetControllerState,它将返回一个

具有控制器当前状态的结构

但是,此结构始终包含值为0的变量。在主函数的while true循环中调用以下函数

bool CMainApplication::HandleInput()
{
SDL_Event sdlEvent;
bool bRet = false;

while ( SDL_PollEvent( &sdlEvent ) != 0 )
{
    if ( sdlEvent.type == SDL_QUIT )
    {
        bRet = true;
    }
    else if ( sdlEvent.type == SDL_KEYDOWN )
    {
        if ( sdlEvent.key.keysym.sym == SDLK_ESCAPE 
             || sdlEvent.key.keysym.sym == SDLK_q )
        {
            bRet = true;
        }
        if( sdlEvent.key.keysym.sym == SDLK_c )
        {
            m_bShowCubes = !m_bShowCubes;
        }
    }
}

// Process SteamVR events
// Periodically returns an event of type 404 ("VREvent_SceneApplicationChanged      = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor)"
vr::VREvent_t event;
vr::VREvent_Controller_t controllerEvent;
std::chrono::milliseconds ms4;
while( m_pHMD->PollNextEvent( &event, sizeof( event ) ) )
{
    ms4 = std::chrono::duration_cast<std::chrono::milliseconds>(
        std::chrono::system_clock::now().time_since_epoch()
        );
    ProcessVREvent( &event);
    printPositionalData(&event, ms4);
}

vr::VRControllerState_t state;

// Check every device attached, usually it's four devices
// Second if statement is never reached
for (int i = 0; i < 1000; i++) {
    if (m_pHMD->GetControllerState(i, &state, sizeof(state))) {
        dprintf("%d", i);
            if (state.ulButtonPressed != 0 || state.unPacketNum != 0 || state.ulButtonTouched != 0) {
                dprintf("Some action?");
            }
    }
}
dprintf("\n");

// Process SteamVR action state
// UpdateActionState is called each frame to update the state of the actions themselves. The application
// controls which action sets are active with the provided array of VRActiveActionSet_t structs.
vr::VRActiveActionSet_t actionSet = { 0 };
actionSet.ulActionSet = m_actionsetDemo;
vr::VRInput()->UpdateActionState( &actionSet, sizeof(actionSet), 1 );

m_bShowCubes = !GetDigitalActionState( m_actionHideCubes );

vr::VRInputValueHandle_t ulHapticDevice;
if ( GetDigitalActionRisingEdge( m_actionTriggerHaptic, &ulHapticDevice ) )
{
    if ( ulHapticDevice == m_rHand[Left].m_source )
    {
        vr::VRInput()->TriggerHapticVibrationAction( m_rHand[Left].m_actionHaptic, 0, 1, 4.f, 1.0f, vr::k_ulInvalidInputValueHandle );
    }
    if ( ulHapticDevice == m_rHand[Right].m_source )
    {
        vr::VRInput()->TriggerHapticVibrationAction( m_rHand[Right].m_actionHaptic, 0, 1, 4.f, 1.0f, vr::k_ulInvalidInputValueHandle );
    }
}

vr::InputAnalogActionData_t analogData;
if ( vr::VRInput()->GetAnalogActionData( m_actionAnalongInput, &analogData, sizeof( analogData ), vr::k_ulInvalidInputValueHandle ) == vr::VRInputError_None && analogData.bActive )
{
    m_vAnalogValue[0] = analogData.x;
    m_vAnalogValue[1] = analogData.y;
}

m_rHand[Left].m_bShowController = true;
m_rHand[Right].m_bShowController = true;

vr::VRInputValueHandle_t ulHideDevice;
if ( GetDigitalActionState( m_actionHideThisController, &ulHideDevice ) )
{
    if ( ulHideDevice == m_rHand[Left].m_source )
    {
        m_rHand[Left].m_bShowController = false;
    }
    if ( ulHideDevice == m_rHand[Right].m_source )
    {
        m_rHand[Right].m_bShowController = false;
    }
}

for ( EHand eHand = Left; eHand <= Right; ((int&)eHand)++ )
{
    vr::InputPoseActionData_t poseData;
    if ( vr::VRInput()->GetPoseActionData( m_rHand[eHand].m_actionPose, vr::TrackingUniverseStanding, 0, &poseData, sizeof( poseData ), vr::k_ulInvalidInputValueHandle ) != vr::VRInputError_None
        || !poseData.bActive || !poseData.pose.bPoseIsValid )
    {
        m_rHand[eHand].m_bShowController = false;
    }
    else
    {
        m_rHand[eHand].m_rmat4Pose = ConvertSteamVRMatrixToMatrix4( poseData.pose.mDeviceToAbsoluteTracking );

        vr::InputOriginInfo_t originInfo;
        if ( vr::VRInput()->GetOriginTrackedDeviceInfo( poseData.activeOrigin, &originInfo, sizeof( originInfo ) ) == vr::VRInputError_None 
            && originInfo.trackedDeviceIndex != vr::k_unTrackedDeviceIndexInvalid )
        {
            std::string sRenderModelName = GetTrackedDeviceString( originInfo.trackedDeviceIndex, vr::Prop_RenderModelName_String );
            if ( sRenderModelName != m_rHand[eHand].m_sRenderModelName )
            {
                m_rHand[eHand].m_pRenderModel = FindOrLoadRenderModel( sRenderModelName.c_str() );
                m_rHand[eHand].m_sRenderModelName = sRenderModelName;
            }
        }
    }
}

return bRet;
我一定是做错了什么,因为在下面的代码片段中,if语句只在前四次迭代中传递,应该是控制器、vive跟踪器、耳机和灯塔。这告诉我我可以访问这些状态,但不知何故我无法读取信息

for (int i = 0; i < 1000; i++) {
    if (m_pHMD->GetControllerState(i, &state, sizeof(state))) {
        dprintf("%d", i);
            if (state.ulButtonPressed != 0 || state.unPacketNum != 0 || state.ulButtonTouched != 0) {
                dprintf("Some action?");
            }
    }
我无法想象这是一个bug,所以我猜我的配置有问题,或者我做了错误的查询。
非常感谢您的帮助

显然我犯了两个错误。 错误1是我使用了错误的示例文件。我使用OpenVr示例文件夹中的hellovr_opengl,但hellovr_dx12是可行的解决方案。它也必须有不同的配置,因为我复制了一个在hellovr_opengl项目中工作的函数,但在那里,它不工作!然后我复制了添加到hellovr_dx12项目中的函数,并能够获得Vive控制器的控制器状态

然而,我想得到Vive Tracker的状态,但它不起作用。在谷歌搜索之后,我发现了一个,所以我把它恢复到beta hoftix,它为我解决了Vive Tracker的问题

你必须打电话; vr::VRInput->SetActionManifestPath

for (int i = 0; i < 1000; i++) {
    if (m_pHMD->GetControllerState(i, &state, sizeof(state))) {
        dprintf("%d", i);
            if (state.ulButtonPressed != 0 || state.unPacketNum != 0 || state.ulButtonTouched != 0) {
                dprintf("Some action?");
            }
    }