Задавались ли вы когда-нибудь вопросом, можно ли выйти за рамки привычных трёх измерений? Мы привыкли видеть мир в 3D: кубы, сферы, пирамиды — все эти объекты легко вообразить и визуализировать. Но что, если мы попробуем заглянуть в четвёртое измерение? Это звучит как научная фантастика, но в мире математики и компьютерной графики всё возможно.

Сегодня я расскажу вам, как создать интерактивный гиперкуб, или тессеракт — четырехмерный аналог обычного куба. Мы будем использовать Three.js, популярную библиотеку для работы с 3D-графикой в браузере.

Почему гиперкуб?

Для начала, что же такое гиперкуб? В трёхмерном мире куб состоит из восьми вершин и шести граней. Гиперкуб, в свою очередь, — это четырёхмерный объект, который сложно представить в голове, но можно показать с помощью проекции на трёхмерное пространство. Это как если бы вы посмотрели на тень обычного куба на плоскости. Мы будем показывать не сам гиперкуб, а его "тень" в трёхмерном мире.

Зачем это нужно? Ну, если вы любите решать необычные задачи, вам просто интересно заглянуть в мир многомерных объектов, или вы увлечены математикой, эта тема точно для вас. А если вы разработчик, то этот проект станет отличным вызовом вашим навыкам работы с 3D-графикой.

Первый шаг: куб как отправная точка

Прежде чем взяться за гиперкуб, давайте создадим обычный куб в Three.js, чтобы было с чем сравнивать. Вот базовый код для рисования простого куба:

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();

renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// Создание куба с рёбрами
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.LineBasicMaterial({ color: 0x00ff00 });
const edges = new THREE.EdgesGeometry(geometry);
const line = new THREE.LineSegments(edges, material);

scene.add(line);
camera.position.z = 5;

function animate() {
    requestAnimationFrame(animate);
    line.rotation.x += 0.01;
    line.rotation.y += 0.01;
    renderer.render(scene, camera);
}
animate();

Это базовый код, который создаёт вращающийся куб с зелёными рёбрами.

Но зачем останавливаться на трёх измерениях? Давайте погрузимся в мир четвёртого измерения и создадим тессеракт!

Четвертое измерение: гиперкуб в действии

Итак, как мы можем нарисовать объект с четырьмя измерениями в привычном трёхмерном пространстве? Ответ прост — с помощью проекций. Представьте, как мы проецируем тень трёхмерного объекта на двумерную плоскость. По сути, мы делаем то же самое, только теперь проецируем четырехмерный объект на трёхмерное пространство.

Вершины гиперкуба

Гиперкуб имеет 16 вершин (в отличие от 8 у обычного куба). Мы можем задать их как 4D координаты (x, y, z, w), где w — это дополнительная координата, представляющая четвёртое измерение:

const vertices = [
    new THREE.Vector4(-1, -1, -1, -1),
    new THREE.Vector4(1, -1, -1, -1),
    new THREE.Vector4(1, 1, -1, -1),
    new THREE.Vector4(-1, 1, -1, -1),
    new THREE.Vector4(-1, -1, 1, -1),
    new THREE.Vector4(1, -1, 1, -1),
    new THREE.Vector4(1, 1, 1, -1),
    new THREE.Vector4(-1, 1, 1, -1),
    new THREE.Vector4(-1, -1, -1, 1),
    new THREE.Vector4(1, -1, -1, 1),
    new THREE.Vector4(1, 1, -1, 1),
    new THREE.Vector4(-1, 1, -1, 1),
    new THREE.Vector4(-1, -1, 1, 1),
    new THREE.Vector4(1, -1, 1, 1),
    new THREE.Vector4(1, 1, 1, 1),
    new THREE.Vector4(-1, 1, 1, 1)
];

Рёбра гиперкуба

Теперь давайте соединим вершины рёбрами, чтобы создать каркас гиперкуба:

const edges = [
    [0, 1], [1, 2], [2, 3], [3, 0],
    [4, 5], [5, 6], [6, 7], [7, 4],
    [0, 4], [1, 5], [2, 6], [3, 7],
    [8, 9], [9, 10], [10, 11], [11, 8],
    [12, 13], [13, 14], [14, 15], [15, 12],
    [8, 12], [9, 13], [10, 14], [11, 15],
    [0, 8], [1, 9], [2, 10], [3, 11],
    [4, 12], [5, 13], [6, 14], [7, 15]
];

Как это работает?

Мы визуализируем гиперкуб, показывая его "тень" в 3D. Эту "тень" можно вращать по различным осям, создавая иллюзию четвёртого измерения. Рендерить гиперкуб можно через вращение по осям, добавив дополнительную математику для поворота в четвёртом измерении.

Интерактивность

Вы можете сделать гиперкуб интерактивным. Например, добавьте возможность менять его цвет с помощью цветового инпута:

<input type="color" id="colorPicker" value="#00ff00" />

Или дайте пользователю выбрать между обычным кубом и гиперкубом:

shapeSelector.addEventListener('change', (event) => {
    currentShape = event.target.value;
    if (currentShape === "cube") {
        line.geometry = new THREE.EdgesGeometry(new THREE.BoxGeometry(1, 1, 1));
    } else if (currentShape === "tesseract") {
        line.geometry = createTesseractEdges();
    }
});

Итог

Гиперкуб — это не просто математическая абстракция. С помощью Three.js его можно визуализировать, вращать, менять его цвет и даже управлять скоростью вращения. Это помогает нам лучше понять многомерные объекты и выходит за рамки привычной 3D-графики.

P.S. Этот проект продолжает развиваться, и я планирую добавить новые возможности и улучшения, включая визуализацию многомерных объектов и новые функции взаимодействия. Если вам интересна тема многомерных пространств и их визуализация или у вас есть идеи по улучшению проекта — буду рад вашим предложениям и вкладу!

Вы можете присоединиться к разработке на GitHub или связаться со мной напрямую. Вместе мы сможем сделать этот проект ещё круче!

? GitHub: https://github.com/Laremin/HyperCube-Dream

Комментарии (12)


  1. artptr86
    28.09.2024 19:30

    Для такой статики можно было бы GitHub Pages легко использовать: https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site


  1. sonytruelove
    28.09.2024 19:30
    +3

    А где картинки, демка, хоть что-то. Стоило бы добавить графического материала, переписывать код, чтоб увидеть - не особо хочется


    1. 2128507
      28.09.2024 19:30

      нигде. это нонсенс. Мы своим 2-мерным зрением глядим на 3-мерный куб в нашей 4-мерной вселенной, это и есть проекция тессеракта из того мира, в котором время это линейное измерение. Ни представить себе этого, ни изобразить на плоскости нельзя. Можно только в 4-мерном пространстве-времени глазеть на 3 мерный куб своим 2-мерным зрением.


      1. RoasterToaster
        28.09.2024 19:30

        Там речь о геометрии с 4 измерениями, времени среди них нет.

        Картинок много, но мне кажется если эту проекцию крутить, в голове что-то начнет нужное рендериться.


        1. askv
          28.09.2024 19:30
          +2

          Когда мы смотрим на проекцию 3D-куба, каждая точка проекции представляет собой линию в пространстве, это ещё достаточно легко представить. Когда смотришь на проекцию 4D-куба, то каждая точка проекции — это на самом деле плоскость (2D), это уже сложно представить. Сечением тессеракта 3D-плоскостью чаще всего является не куб, а другие фигуры. Также как и сечение куба 2D-плоскостью чаще всего не квадрат.

          Например https://www.youtube.com/watch?v=1fQVnpwn1fA


      1. Laremin Автор
        28.09.2024 19:30

        Вы верно подметили, что наше зрение двумерное, а время в нашей вселенной является четвёртым измерением. Однако, использование математических проекций и визуализаций многомерных объектов, таких как тессеракт, позволяет представить, как такие объекты могут выглядеть при их проецировании на трёхмерное пространство. Мы не можем буквально видеть четвёртое измерение, но такие визуализации дают возможность ощутить его "тени" и динамику, что помогает лучше понимать сложные концепции многомерных пространств, даже если это всего лишь проекция, а не полный опыт 4D-восприятия. Это аналогично тому, как двумерные рисунки кубов на бумаге помогают нам представлять трёхмерные объекты.


        1. fourclever
          28.09.2024 19:30

          Очень хотелось бы понять: почему многие считают, что время - это четвёртое измерение? На изображении выше:

          https://habr.com/ru/articles/846772/comments/#comment_27353934

          предполагается путь: сначала точка растягивается в линию, потом линия в плоскость и так далее. Когда сдвигается в сторону куб, многие говорят, что это движение в четвёртом измерении и есть движение во времени. Но почему тогда движение точки по линии, или линии по плоскости не называют движением во времени?

          То есть течение времени - это просто движение в каком-либо измерении. Разве не так?


          1. Laremin Автор
            28.09.2024 19:30

            Привет!

            Я понимаю твои размышления о времени как о четвертом измерении. Это действительно интересный вопрос.

            Во-первых, время отличается от пространственных измерений тем, что оно однонаправленно. Мы можем двигаться в пространстве в разных направлениях, но время течет только в одном — от прошлого к будущему.

            Во-вторых, в теории относительности Эйнштейна время и пространство объединяются в четырехмерное пространство-время. Это означает, что время и пространство взаимодействуют друг с другом, и время действительно можно рассматривать как четвертое измерение.

            Когда ты говоришь о движении точки по линии или линии по плоскости, это все же остается движением в пространственных измерениях. Время, в свою очередь, отвечает за изменения, происходящие с этими объектами. Оно как бы меряет, насколько изменилось положение объекта во времени.

            И в конце концов, это не только физическая концепция, но и философская. Некоторые философы ставят под сомнение объективность времени, считая его скорее конструкцией нашего восприятия.


    1. Laremin Автор
      28.09.2024 19:30

      Благодарю за комментарий! Я уже добавил фотографию, чтобы вы могли увидеть, как это выглядит.

      В центре экрана расположена выбранная фигура. Сверху слева вы можете задать цвет фигуре, и он сразу же отобразится. Чуть правее находится меню, где можно выбрать другую фигуру. Затем следует параметр, позволяющий задать скорость вращения фигуры. В левом верхнем углу отображаются все данные о фигуре: её название, цвет и скорость вращения.


  1. saag
    28.09.2024 19:30

    4-м измерением считается время, выходя в него думаете, что попадете во что-то линейное, а когда видите нечто двумерное, за которым намекается еще одно измерение безмерно удивляетесь:-)


  1. ZVEZDO4ETik
    28.09.2024 19:30
    +1

    Вдохновлялись серией фильмов "Куб"?


    1. Laremin Автор
      28.09.2024 19:30

      Нет, просто я недавно познакомился с методом Three.js и захотел закрепить полученные знания, создав небольшой проект. Он очень простой и не требует больших вложений, но процесс разработки оказался довольно увлекательным.

      Кстати, я очень люблю «Матрицу»))))