Браузерный симулятор ручной стыковки с МКС от SpaceX
У меня получилось состыковаться со 2-й попытки, а у вас с какой?
Как играть:
1) Значение каждого угла и координаты в момент касания со шлюзом должно быть не больше 0.2, а скорость -- меньше 0.080 м/с (поначалу можно разогнаться, но в конце скорость должна быть не больше данного значения)
2) На правом джойстике вы корректируете 3 угла корабля: поворот по крену (вращение по часовой-против часовой стрелки), тангажу (поворот вверх-вниз), рысканью (поворот влево-вправо)
3) На левом джойстике вы корректируете поступательное движение модуля: движение вперед-назад (кнопки "+" и "-"), влево-вправо, вверх-вниз
4) При нажатии на центр джойстика изменяется его чувствительность, т.е. выбирается, насколько большие шаги выполняют кнопки джойстика: грубо или тонко
5) Нужно попасть в зелёную точку
6) Синие цифры -- угловая скорость. "Rate" в правом нижнем углу -- скорость приближения к МКС.
7) Нужно учитывать, что движение происходит в космосе, сопротивления воздуха или трения нет, поэтому из-за инерции любая скорость движения или вращения будет сохраняться, пока вы её не погасите
БОНУС: Если нажать на значок шестерёнки, то можно задать в настройках плоскую Землю (Flat). Плоскоземельщики оценят.
БОНУС 2: Сзади корабля летает автомобиль Тесла (её действительно в реальности запустили на орбиту)
БОНУС 3:
Есть программа для автоматической стыковки (для Хрома). Как ей пользоваться:
1) Открыть сайт и запустить симулятор.
2) Нажать F12
3) Открыть вкладку Console
4) Вставить код, написанный ниже. Нажать Enter.
5) Наслаждаться.
Код:
function simulateKey(keyCode, type, modifiers) {
var evtName = (typeof (type) === "string") ? "key" + type : "keydown";
var modifier = (typeof (modifiers) === "object") ? modifier : {};
var event = document.createEvent("HTMLEvents");
event.initEvent(evtName, true, false);
event.keyCode = keyCode;
for (var i in modifiers) {
event[i] = modifiers[i];
}
document.dispatchEvent(event);
}
function keyPress(keyCode) {
simulateKey(keyCode)
setTimeout(() => simulateKey(keyCode, "up"), 15);
}
let _accelerator = 69;
let _brake = 81;
let _translateLeft = 65;
let _translateRigth = 68;
let _translateUp = 87;
let _translateDown = 83;
let _left = 37;
let _rigth = 39;
let _up = 38;
let _down = 40;
let _rollRigth = 105;
let _rollLeft = 103;
let index = 0;
roll = {
path: [0, 0, 0, 0, 0],
prev: 0,
speed: 0,
}
pitch = {
path: [0, 0, 0, 0, 0],
prev: 0,
speed: 0,
}
yaw = {
path: [0, 0, 0, 0, 0],
prev: 0,
speed: 0,
}
z = {
path: [0, 0, 0, 0, 0],
prev: 0,
speed: 0,
}
y = {
path: [0, 0, 0, 0, 0],
prev: 0,
speed: 0,
}
function calculatePath(data, value) {
data.path = [];
if (data.prev === value) {
data.speed = 0;
}
for (let i = 0; i < 5; i++) {
if (0 < value + data.speed * (i + 1)) {
data.speed -= 0.1;
data.path.push(-1);
} else if (value + data.speed * (i + 1) < -0) {
data.speed += 0.1;
data.path.push(1);
} else if (i > 0) {
if (0 < data.speed) {
data.speed -= 0.1;
data.path.push(-1);
} else if (data.speed < 0) {
data.speed += 0.1;
data.path.push(1);
} else {
data.path.push(0);
}
} else {
data.path.push(0);
}
}
data.prev = value;
}
function A() {
let range = parseFloat($("#range .rate").textContent.split(' '));
let yDistance = parseFloat($("#y-range .distance").textContent.split(' ')[0]);
let zDistance = parseFloat($("#z-range .distance").textContent.split(' ')[0]);
let rollError = parseFloat($("#roll .error").textContent);
let pitchError = parseFloat($("#pitch .error").textContent);
let yawError = parseFloat($("#yaw .error").textContent);
let rate = parseFloat($("#rate .rate").textContent.split(' ')[0]);
if (index % 5 === 0) {
calculatePath(roll, rollError);
calculatePath(pitch, pitchError);
calculatePath(yaw, yawError);
calculatePath(y, yDistance);
calculatePath(z, zDistance);
}
let rollStep = roll.path[index % 5];
if (0 < rollStep) {
keyPress(_rollLeft);
} else if (rollStep < 0) {
keyPress(_rollRigth);
}
let pitchStep = pitch.path[index % 5];
if (0 < pitchStep) {
keyPress(_up);
} else if (pitchStep < 0) {
keyPress(_down);
}
let yawStep = yaw.path[index % 5];
if (0 < yawStep) {
keyPress(_left);
} else if (yawStep < 0) {
keyPress(_rigth);
}
let yStep = y.path[index % 5];
if (0 < yStep) {
keyPress(_translateRigth);
} else if (yStep < 0) {
keyPress(_translateLeft);
}
let zStep = z.path[index % 5];
if (0 < zStep) {
keyPress(_translateUp);
} else if (zStep < 0) {
keyPress(_translateDown);
}
const rangeLimit = Math.min(Math.max((Math.abs(range) / 100), 0.05), 2);
if (-rate < rangeLimit) {
keyPress(_accelerator);
} else if (-rangeLimit < -rate) {
keyPress(_brake);
}
index++;
setTimeout(A, 200);
}
A();
Исследователи космоса
16.3K постов46.4K подписчика
Правила сообщества
Какие тут могут быть правила, кроме правил установленных самим пикабу :)