openvr-driver-example icon indicating copy to clipboard operation
openvr-driver-example copied to clipboard

How could we add Rotational & Positional data to HMD or Controller

Open apurv1305 opened this issue 4 years ago • 1 comments

Thanks for your explanation of the OpenVR architecture, it's really very helpful.

I was trying to write a sample driver inspired by your explanation to the OpenVR APIs. I am trying to write a driver for a custom VR controller and want to write Rotational and Positional data for the same by reading the serial port.

My Question was how could I write both positional and rotational data for the controller in the driver.

Thank You.

apurv1305 avatar Jun 13 '21 14:06 apurv1305

Hi, to change the rotation of the controller, you need to add the following to the GetPos function: If you are using Euler angles:

inline vr::HmdQuaternion_t EulerAngleToQuaternion(double Yaw, double Pitch, double Roll)
{
	vr::HmdQuaternion_t q;
	// Abbreviations for the various angular functions
	double cy = cos(Yaw * 0.5);
	double sy = sin(Yaw * 0.5);
	double cp = cos(Pitch * 0.5);
	double sp = sin(Pitch * 0.5);
	double cr = cos(Roll * 0.5);
	double sr = sin(Roll * 0.5);

	q.w = cr * cp * cy + sr * sp * sy;
	q.x = sr * cp * cy - cr * sp * sy;
	q.y = cr * sp * cy + sr * cp * sy;
	q.z = cr * cp * sy - sr * sp * cy;

	return q;
}

pose.qRotation = EulerAngleToQuaternion(yourRoll, -yourYaw, yourPitch);

If you are using quaternions, then simply assign the quaternion.

To change the position, change the values (X, Y, Z):

pose.vecPosition[0] = 0.02; 
pose.vecPosition[1] = 0.001; 
pose.vecPosition[2] = 0.001; 

r57zone avatar Aug 09 '21 12:08 r57zone