Skip to content
Mvivant edited this page Oct 26, 2017 · 2 revisions

Welcome to the Half-Life-VR 3dRudder wiki!

  • vr_helper.h
#define _3DRUDDER_SDK_STATIC
#include "3dRudderSDK\Include\3dRudderSDK.h"
...
ns3dRudder::CSdk* pSdk = nullptr;
float vrangle = 0;
  • vr_helper.cpp
void VRHelper::Init()
{
        // Init the 3dRudder SDK
        pSdk = ns3dRudder::GetSDK();
	pSdk->Init();
        ...
}
void VRHelper::Exit(const char* lpErrorMessage)
{
	...
        // Free 3dRudder SDK
	if (pSdk != nullptr)
		ns3dRudder::EndSDK();
	pSdk = nullptr;
}

void VRHelper::Update3dRudder(double time)
{
        // Create linear curves
	ns3dRudder::CurveArray curves;
	curves.InitLinear();
	ns3dRudder::Axis axis;
	float deadzone = 0.1f;
        // At least one 3dRudder connected
	if (pSdk->IsDeviceConnected(0))
	{
		ns3dRudder::Status status = pSdk->GetStatus(0);
                // 3dRudder is not in calibration
		if (status == ns3dRudder::InUse || status == ns3dRudder::ExtendedMode)
		{
			ns3dRudder::ErrorCode res = pSdk->GetAxis(0, ns3dRudder::ValueWithCurveNonSymmetricalPitch, &axis, &curves);
			if (res == ns3dRudder::Success)
			{
				if (axis.GetXAxis() < -deadzone) // Roll Left
					ClientCmd("+moveleft");		
				else 
					ClientCmd("-moveleft");

				if (axis.GetXAxis() > deadzone) // Roll Right
					ClientCmd("+moveright");
				else
					ClientCmd("-moveright");
				
				if (axis.GetYAxis() > deadzone) // Pitch forward
					ClientCmd("+forward");
				else 
					ClientCmd("-forward");

				if (axis.GetYAxis() < -deadzone) // Pitch backward
					ClientCmd("+back");
				else
					ClientCmd("-back");			

				float	speed = gEngfuncs.pfnGetCvarFloat("cl_yawspeed");
				if (speed == 0)
					speed = 1;
				vrangle += speed * time * axis.GetZRotation(); // Rotation Yaw
			}
		}
	}
}
...
void VRHelper::UpdateGunPosition(struct ref_params_s* pparams)
{
	// Transform the position of controller with the rotation of 3dRudder
	Vector controllerFromPlayer;
	float angle = DEG2RAD * -vrangle;
	controllerFromPlayer.x = (originInRelativeHLSpace.x * cos(angle)) - (originInRelativeHLSpace.y * sin(angle));
	controllerFromPlayer.y = (originInRelativeHLSpace.x * sin(angle)) + (originInRelativeHLSpace.y * cos(angle));
	controllerFromPlayer.z = originInRelativeHLSpace.z;
	// apply new position
	Vector originInHLSpace = clientGroundPosition + controllerFromPlayer;
	...
	viewent->angles = GetHLAnglesFromVRMatrix(controllerAbsoluteTrackingMatrix);
	// apply new rotation
	viewent->angles.y -= vrangle;
}
  • vr_renderer.cpp
void VRRenderer::Frame(double time)
{
	...
        // Poll event of SteamVR
	vrHelper->PollEvents();
        // Get axis of 3dRudder and send command to player
	vrHelper->Update3dRudder(time);
}
Clone this wiki locally