//This is the listener that is called by the event manager //It transforms and adds the received report to the reports list void Record(string name, VRPNAnalog.AnalogReport report) { if (firstReport) { firstTime_sec = report.msg_time.tv_sec; firstTime_usec = report.msg_time.tv_usec; firstReport = false; } if (report.msg_time.tv_usec < firstTime_usec) { report.msg_time.tv_sec = report.msg_time.tv_sec - (firstTime_sec + 1); report.msg_time.tv_usec = (report.msg_time.tv_usec + 1000000) - firstTime_usec; } else { report.msg_time.tv_sec = report.msg_time.tv_sec - firstTime_sec; report.msg_time.tv_usec = report.msg_time.tv_usec - firstTime_usec; } VRPNAnalog.AnalogReportNew newReport = new VRPNAnalog.AnalogReportNew(); VRPNManager.TimeValNew newMsgTime = new VRPNManager.TimeValNew(); newMsgTime.tv_sec = (int)report.msg_time.tv_sec; newMsgTime.tv_usec = (int)report.msg_time.tv_usec; newReport.msg_time = newMsgTime; newReport.num_channel = report.num_channel; newReport.channel = report.channel; data.list.Add(newReport); }
//Método que se encarga de estar pendiente de los mensajes que se envían desde los sensores análogos del dispositivo void CambioEnUnAnalogo(string name, VRPNAnalog.AnalogReport report) { //Info para el Log if (estaMostrandoInfoAnalogo) { string text; text = "Name: " + name; for (int i = 0; i < report.num_channel; i++) { text = text + " Channel " + i + ": " + report.channel[i]; } Debug.Log(text); } //Si el control que se está revisando es el izquierdo if (sensor == 0) { //Joystick capsulas[5].localScale = new Vector3(capsulasEscalaOriginal[5].x * (1 + (float)report.channel[0]), capsulasEscalaOriginal[5].y, capsulasEscalaOriginal[5].z * (1 + (float)report.channel[1])); //Trigger capsulas[7].localScale = new Vector3(capsulasEscalaOriginal[7].x, capsulasEscalaOriginal[7].y * (1 + (float)report.channel[2]), capsulasEscalaOriginal[7].z); } //Si el control que se está revisando es el derecho else if (sensor == 1) { //Joystick capsulas[5].localScale = new Vector3(capsulasEscalaOriginal[5].x * (1 + (float)report.channel[3]), capsulasEscalaOriginal[5].y, capsulasEscalaOriginal[5].z * (1 + (float)report.channel[4])); //Trigger capsulas[7].localScale = new Vector3(capsulasEscalaOriginal[7].x, capsulasEscalaOriginal[7].y * (1 + (float)report.channel[5]), capsulasEscalaOriginal[7].z); } }
//Auxiliar method that sends last frame report private void sendingReport(VRPNAnalog.AnalogReportNew lastReport) { VRPNAnalog.AnalogReport newReport = new VRPNAnalog.AnalogReport(); VRPNManager.TimeVal newMsgTime = new VRPNManager.TimeVal(); newMsgTime.tv_sec = (UInt32)lastReport.msg_time.tv_sec; newMsgTime.tv_usec = (UInt32)lastReport.msg_time.tv_usec; newReport.msg_time = newMsgTime; newReport.num_channel = lastReport.num_channel; newReport.channel = lastReport.channel; VRPNEventManager.TriggerEventAnalog(data.deviceType, data.deviceName, newReport); }
//VRPNAnalogRecording Constructor public VRPNAnalogRecording(string nName, float nTime, VRPNAnalog.AnalogReports nData) { name = nName; reportTime = nTime; data = nData; e = data.list.GetEnumerator(); while (e.MoveNext()) { VRPNAnalog.AnalogReportNew report = e.Current; channels = report.num_channel; lastTime = report.msg_time.tv_sec + (report.msg_time.tv_usec / 1000000f); } e = data.list.GetEnumerator(); }
//Método que se encarga de estar pendiente de los mensajes que se envían desde los sensores análogos del dispositivo void CambioEnUnAnalogo(string name, VRPNAnalog.AnalogReport report) { //Info para el Log if (estaMostrandoInfoAnalogo) { string text; text = "Name: " + name; for (int i = 0; i < report.num_channel; i++) { text = text + " Channel " + i + ": " + report.channel[i]; } Debug.Log(text); } //Posición: Notar que 'y' y 'z' se encuentran intercambiados e invertidos cubo.transform.position = new Vector3((float)report.channel[0] * 1f, (float)report.channel[2] * -1f, (float)report.channel[1] * -1f); //Rotación: Notar que 'y' y 'z' se encuentran intercambiados, y que 'x' se encuentra invertido //En este caso se pueden usar las entradas como ángulos de euler y convertirlos en cuaternión cubo.transform.localRotation = Quaternion.Euler((float)report.channel[3] * -45f, (float)report.channel[5] * 45f, (float)report.channel[4] * 45f); }
//Método que se encarga de estar pendiente de los mensajes que se envían desde los sensores análogos del dispositivo void moverConRaton(string name, VRPNAnalog.AnalogReport report) { //Se debe notar que los valores que se reportan son de 0 a 1, siendo (0, 0) la esquina superior izquierda de la pantalla y (1, 1) la esquina inferior derecha de la pantalla this.transform.position = new Vector3((float)report.channel[0]*10 - 5, (1-(float)report.channel[1])*10 - 5, this.transform.position.z); }
void moveWithMouse(string name, VRPNAnalog.AnalogReport report) { this.transform.position = new Vector3((float)report.channel[0]*10 -5, (1-(float)report.channel[1])*10 - 5, this.transform.position.z); }