Lo paso por aqui pq veo que hay más gente con bass shakers.
Me he creado un efecto que me transmite a la pedalera la carga de las RPM del motor (lo que viene por defecto me parece basura) sin que esta vibración tape efectos de bloqueo, slip de las ruedas o pianos. Va bastante bien y se siente natural, da un feedback adicional de la carga del coche sin necesidad de tener que mirar las RPM que llevas, si es un coche que sube muy lineal o pega un golpe de RPM también lo notarás.
El efecto funciona tal que así:
Hay 2 scripts, 1 para calcular la intensidad, y otra para calcular los HZ a los que irá el efecto.
La intensidad es una curva ascendente conforme los RPM suben, pero sobre el 60-80 % de las RPM del coche, llegando al pico máximo de intensidad, baja.
Si ocurre un efecto de bloqueo o slip de las ruedas, el efecto se atenúa de forma instantánea para dar paso a que el trasnductor emita la señal lo más limpia para ese efecto.
El cálculo de los HZ está pensado para que, a mayor RPM, mayor frecuencia, utilizando una curva sigmoide. En este caso, cuanto más rango de RPM tenga un coche, más alta será la frecuencia que coja (es adaptable el rango). Por ej, un coche que va a 8000 rpm, quizá llega a 60hz, y uno de 16000, a 70hz. El aumento no es lineal. Además, aprovecho que la intensidad en las RPM máximas cae, junto con los HZ más altos para no saturar el pie y dar una sensación de que las revs son tan altas que entran en armonía con el chasis y se disimulan.
Si ocurre el efecto de slip sobre el coche, los HZ del efecto de las RPM converge hacia los HZ que tenga el efecto del slip/bloqueo, haciendo que para tu pie la transición sea natural y no notes un salto entre el efecto de carga de motor/rpms, y el slip/bloqueo de la rueda. Cuando deja de haber slip/bloqueo, vuelves a notar la carga del motor sobre tu pie.
Intensidad del 1 al 100 según RPMconst rpm = $prop('Rpms');
const wheel_slip = $prop('ShakeITBSV3Plugin.Export.wheel_slip.Front');
const rumble_piano = $prop('ShakeITBSV3Plugin.Export.rumble_piano.Front');
const RPM_MIN = 1000;
const RPM_MAX = $prop('MaxRpm');
const SLIP_BLEND_START = 10;
const SLIP_BLEND_END = 60;
const normalizedInput = (Math.max(rpm, RPM_MIN) - RPM_MIN) / (RPM_MAX - RPM_MIN);
// Parámetros ajustados de las funciones sigmoides para crear la meseta más ancha
const k1 = 10; // Pendiente de la primera sigmoide, para el aumento
const x01 = 0.3; // Punto medio de la primera sigmoide ajustado para retrasar el final del aumento
const k2 = -10; // Pendiente de la segunda sigmoide (negativa para disminuir), para la caída
const x02 = 0.7; // Punto medio de la segunda sigmoide ajustado para retrasar el inicio de la caída
const sigmoid1 = 1 / (1 + Math.exp(-k1 * (normalizedInput - x01))); // Aumento inicial
const sigmoid2 = (1 / (1 + Math.exp(-k2 * (normalizedInput - x02)))) * (1 - 0.4) + 0.4; // Caída después de la meseta
let vibrationValue = 1 + 120 * (sigmoid1 * sigmoid2);
vibrationValue = Math.min(vibrationValue, 100);
// Calcular el factor de atenuación basado en el wheel_slip
let wheelSlipNormalized = (wheel_slip - SLIP_BLEND_START) / (SLIP_BLEND_END - SLIP_BLEND_START);
wheelSlipNormalized = Math.max(0, Math.min(1, wheelSlipNormalized));
let attenuationFactor = 1 / (1 + Math.exp(-10 * (wheelSlipNormalized - 0.5)));
vibrationValue *= (1 - attenuationFactor);
// Si rumble_piano es mayor de 50, ajustar vibrationValue
if (rumble_piano > 30) {
vibrationValue = 0; // Ajusta este valor según la lógica deseada para rumble_piano > 50
}
return vibrationValue;
Salida en HZ según RPMconst rpm = $prop('Rpms');
const wheel_slip = $prop('ShakeITBSV3Plugin.Export.wheel_slip.Front');
const rumble_piano = $prop('ShakeITBSV3Plugin.Export.rumble_piano.Front');
const RPM_MAX = $prop('RPM_MAX');
const RPM_MIN = 1000;
const RPM_REV_CAP_MIN = 6000; // Valor minimo de tope de rpms (coches con pocos rpm)
const RPM_REV_CAP_MAX = 16000; // Valor maximo de tope de rpms (coches con muchos rpm)
const HZ_MIN_MAX_TARGET = 60; // Valor mínimo de Hz en el rango deseado (para coches hasta 6000 rpm), ajustar según cockpit/chasis
const HZ_MAX_TARGET = 70; // Valor máximo de Hz en el rango deseado (para coches hasta 16000 rpm), ajustar según cockpit/chasis
const HZ_MIN = 38; // Hz minimos que sacará el trasnductor, ajustar según tu cockpit/chasis
// Calcular HZ_MAX basado en RPM_MAX
const HZ_MAX = (HZ_MAX_TARGET - HZ_MIN_MAX_TARGET) * ((RPM_MAX - RPM_REV_CAP_MIN) / (RPM_REV_CAP_MAX - RPM_REV_CAP_MIN)) + HZ_MIN_MAX_TARGET;
const HZ_WHEEL_SLIP_TARGET = 62; // Ajustar para que tenga los mismos Hz que el efecto de wheel_slip
const WHEEL_SLIP_START = 10;
const WHEEL_SLIP_END = 50;
// Normalizar RPM
const normalizedRPM = (Math.max(rpm, RPM_MIN) - RPM_MIN) / (RPM_MAX - RPM_MIN);
const k = 15; // Pendiente del sigmoide
const x0 = 0.5; // Punto medio del sigmoide
const L = HZ_MAX - HZ_MIN;
// Calcular la frecuencia usando una función sigmoide
const frequency = HZ_MIN + (L / (1 + Math.exp(-k * (normalizedRPM - x0))));
// Calcular el factor de atenuación basado en el wheel_slip
let adjustmentFactor = 0;
if (wheel_slip > WHEEL_SLIP_START) {
adjustmentFactor = Math.min((wheel_slip - WHEEL_SLIP_START) / (WHEEL_SLIP_END - WHEEL_SLIP_START), 1);
}
// Ajustar la frecuencia hacia 62 Hz según el wheel_slip registrado
let adjustedFrequency = (1 - adjustmentFactor) * frequency + adjustmentFactor * HZ_WHEEL_SLIP_TARGET;
return adjustedFrequency;
Aquí es donde tenéis que poner los scripts
Y acordaros de sacar como property y asignarle un nombre al efecto de wheel_slip (lo uso tanto para bloqueo como para slip de rueda) para que el script pueda leerlo.
Esta tarde tengo pensado mirar de crearme un efecto de wheel_slip a partir de la telemetría de las ruedas, porque el que viene por defecto no me funciona igual según el juego. Automobilista suele ir muy bien, pero hay coches que no. Igual en iracing y assetto.
Lo comparto por si alguien quiere probarlo. Esta tarde tb subiré una captura de como se ven las curvas.