#javascript #html #three.js
#javascript #HTML #three.js
Вопрос:
Я новичок в javascript и three.js я пытаюсь выяснить, как получить трехмерные позиции на веб-странице. например я хочу установить точечный индикатор в (50,20,10) значениях x, y, z. как я могу узнать, где эти значения x, y, z появятся на веб-странице?.Я видел код, подобный приведенному ниже.
var light2 = new THREE.PointLight(0xffffff, 10)
light2.position.set(500, 100, 0)
scene.add(light2)
Я погуглил, но не получил достаточно информации, чтобы разобраться в вещах должным образом, может кто-нибудь помочь мне хорошим объяснением или ссылкой на какую-нибудь статью / учебник?
Комментарии:
1. Что вы имеете в виду, что веб-страница имеет диапазон от -1 до 1? Вы не размещаете подсветку на веб-странице, вы помещаете ее в 3D-мир, который будет отображаться с помощью WebGL и canvas.
2. @zero298 я погуглил 3d space в Web, и это показало, что веб-страница всегда находится в диапазоне от -1 до 1. я действительно мало знаю об этом, не могли бы вы, пожалуйста, помочь мне понять 3D-пространство в Web?
Ответ №1:
Сначала просто немного предыстории…
- Трехмерное пространство бесконечно.
- Холст — это окно просмотра в этом пространстве.
- Размер холста на странице не имеет прямого отношения к чему-либо в 3D пространстве. Вы можете удвоить размер холста, и все, что это делает, это увеличивает отображаемое изображение.
На ваш вопрос…
Это не значит, что вы не можете определить, где на холсте может появиться 3D-объект. Вы можете спроецировать любую точку в трехмерном пространстве в нормализованные координаты устройства с помощью Vector3.project
.
var light2 = new THREE.PointLight(0xffffff, 10)
light2.position.set(500, 100, 0)
scene.add(light2)
// Where is it in NDC?
var ndc = new THREE.Vector3().copy( light2.position ).project( camera );
Нормализованные координаты устройства варьируются от -1
до 1
и представляют собой нормализованную ширину и высоту окна просмотра с (0,0)
точкой в центре отображаемого изображения. Итак, вам нужно будет преобразовать их из NDC в значения пикселей на вашем canvas. (Также вы можете игнорировать z
компонент, потому что экран не имеет глубины.)
var canvasX = ( ndc.x 1 ) * canvasWidth / 2;
var canvasY = ( ndc.y 1 ) * canvasHeight / -2;