3d модели three.js в виде гиперссылки

Я пытаюсь найти способ использовать 3D-модель, созданную с помощью Three.js, в качестве гиперссылки. Другими словами, если я нажму на куб (THREE.CubeGeometry), я хочу, чтобы открылась другая страница.

Например, в этом примере threejs.org

как я могу изменить это, чтобы вместо того, чтобы делать маленькие точки на полях, нажатие на коробки открывало другую страницу, например, гиперссылку?


person lisa    schedule 11.07.2014    source источник
comment
Привет, Лиза, и добро пожаловать в SO, это может быть достигнуто с помощью комбинации threejs с некоторым пользовательским javascript, но не могли бы вы сказать, что ссылка перенаправления (гиперссылка) будет одинаковой для каждого куба (или объекта) или она будет отличаться   -  person Shiva    schedule 11.07.2014
comment
ОМГ Шива! Спасибо за быстрый ответ! Я хотел бы, чтобы каждый куб был отдельным звеном. Я только что нашел некоторую информацию о tquery, поэтому я жадно изучаю ее... Хотя я не уверен, что полностью ее пойму. хаха. Спасибо еще раз!   -  person lisa    schedule 11.07.2014


Ответы (3)


Один из способов добиться этого — связать пользовательские данные пользователя (URL) с каждым кубом при его создании.

Итак, вот пример кода, как мы можем помещать данные в кубы во время их генерации (в jsfiddle аналогичная логика используется между строками 25-63)

var object = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({
            color: Math.random() * 0xffffff }));  

object.userData = { URL: "http://stackoverflow.com"};

Теперь здесь мы используем метод под названием raycasting для обнаружения щелчка мыши, поэтому в принципе, когда мышь щелкнут, мы отбрасываем луч (невидимый) в плоскость, перпендикулярную щелчку, и захватываем все объекты, которые пересекает луч.

Затем мы извлекаем первый объект из списка пересекающихся объектов, потому что он будет ближе всего к экрану.

изображение для литья лучей

Чтобы лучше понять raycasting и выбор объектов, обратитесь к этому руководству.

Теперь при создании кубов мы уже вставили данные, поэтому мы можем просто получить (URL) их из пересекающегося куба и перенаправить пользователя на эту страницу.

Пример кода будет примерно таким (в строке номер 95 в скрипке)

if (intersects.length > 0) {
        window.open(intersects[0].object.userData.URL);
    }

Здесь нам рабочий jsfille, надеюсь, это поможет

Ссылка JSFiddle

person Shiva    schedule 11.07.2014
comment
Шива! Ты послан богом! Спасибо большое! ‹3! - person lisa; 11.07.2014
comment
@lisa: Спасибо за комментарий, если решение решило ваш запрос, вы можете принять ответ (выбрав зеленую галочку), или, если у вас есть что-то еще, вы также можете спросить об этом. :) - person Shiva; 11.07.2014
comment
@Shiva Это чертовски отличный ответ, приятель! Спасибо, что поделились этим. - person Jean-Michel Provencher; 18.08.2016
comment
@Shiva - Привет, Шива, спасибо за отличный ответ! При использовании этой техники intersects[0] является объектом с несколькими атрибутами, т.е. distance пересечения, какая грань была пересечена и т.д. Однако это только для точки входа луча внутри пересекаемого объекта. Есть ли способ получить всю информацию о месте, где луч вышел из объекта? - person Matteo; 31.08.2016
comment
@Shiva - Другими словами, как я могу получить список всех пересечений объекта с определенным лучом? - person Matteo; 31.08.2016
comment
@Shiva. Если вам интересно, я нашел ответ здесь: for meshes, faces must be pointed towards the origin of the ray in order to be detected; intersections of the ray passing through the back of a face will not be detected. To raycast against both faces of an object, you'll want to set the material's side property to THREE.DoubleSide . - person Matteo; 01.09.2016
comment
Спасибо за пример, один вопрос как открыть ссылку в том же окне? - person hanan-mstudio; 24.04.2019

В этом случае пригодится 3Dink.js. Это библиотека-оболочка three.js для WebGL, которая позволяет легко создавать трехмерные гиперссылки.

В самом коротком случае он может реализовать щелчок и световое излучение в 3 строки.

DDDINK.addURL(object, "https://www.npmjs.com/package/3dink");
DDDINK.readRendererObj( renderer, scene, camera );
DDDINK.domEvent.addFnc();

Пожалуйста, просмотрите его репозиторий. https://github.com/takashift/3Dink.js

person higechira    schedule 12.06.2018

Вы можете сделать это, изменив эту функцию:

function onDocumentMouseDown( event ) {

    // ......

    if ( intersects.length > 0 ) {

        switch(intersects[0].object) {
            case google_object:
                window.open('http://google.com');
                break;
            case yahoo_object:
                window.open('http://yahoo.com');
                break;
        } 

    }

    // ......
}
person parchment    schedule 11.07.2014
comment
хм, так что я попробовал это, и это, кажется, не работает. Я уверен, что я как-то не реализую это правильно... - person lisa; 11.07.2014
comment
Что ж, поскольку вы упомянули tquery, у них есть пример, который выглядит именно так, как вам нужно. jeromeetienne.github.io/tquery/plugins/linkify/examples - person parchment; 11.07.2014
comment
да, я попробую с tquery! Я просто подумал, что, вероятно, есть действительно простое решение, к которому я слеп. Спасибо еще раз! - person lisa; 11.07.2014