Браузерный симулятор ручной стыковки с МКС от SpaceX

Браузерный симулятор ручной стыковки с МКС от SpaceX Космос, Космонавтика, Игры, Симулятор, SpaceX, Илон Маск, МКС, Видео, Длиннопост

Ссылка на симулятор: https://iss-sim.spacex.com/


Видео скоростного прохождения (спидрана):

У меня получилось состыковаться со 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 подписчика

Добавить пост

Правила сообщества

Какие тут могут быть правила, кроме правил установленных самим пикабу :)

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

при открытии сайта (загрузке?) вентилятор на ноутбуке загудел словно я нехилую игру запустил=)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

А у меня ноутбук с пассивным охлаждением, я ничего не слышу, кроме небольшого писка дросселей)

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку