Проблема при вращении трехмерного объекта с вращающимся родителем, чтобы он смотрел в заданном направлении в Three.js - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь построить сцену, где есть Земля, которая вращается независимо от камеры. На этой планете я строю случайные кривые Безье, как в этом примере: https://pubnub.github.io/webgl-visualization/

Поэтому я добавляю свою строку Безье как:

    var origin = latLonToVector3(lat_source, lon_source, earth_radius);
    var destination = latLonToVector3(lat_destination, lon_destination, earth_radius);
    var bezierline = bezierCurveBetween(origin, destination);
    earth.add(bezierline);

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

    var tangent_vectors = [];

    for (var i = 0; i < pnts.length - 1; i++) {

            var aux = new THREE.Vector3();

            aux.subVectors(pnts[i+1], pnts[i]);

            tangent_vectors[i] = aux.normalize();

    }

return tangent_vectors;

Просто чтобы проверить, что эти векторы в порядке, я использовал THREE.ArrowHelper, чтобы посмотреть, касаются ли они каждого сегмента кривой, и действительно ли они таковы. Поскольку я добавляю их в сцену с earth.add( arrowHelper );, они также вращаются вместе с планетой и соответствуют друг другу. Я повторяю этот процесс снова и снова, когда планета вращается, чертя и стирая одну и ту же кривую Безье (один и тот же источник и пункт назначения).

Тем не менее, 3D-модель работает нормально для первой кривой Безье, но по мере вращения планеты и построения новой кривой Безье в том же месте (с теми же координатами отправления и назначения) я вижу, что плоскость все еще следует ( plane.lookAt(tangent_vectors[point_index]);) касательные линии исходной кривой Безье (хотя я пересчитываю касательные линии).

Я думаю, что проблема заключается в том, что широта и долгота (lat_source, lon_source и т. Д.) Зафиксированы в референсной структуре реальной жизни. Это приводит к тому, что переменные origin и destination всегда возвращают одинаковые значения, даже если планета вращается. Затем новые кривые Безье по существу имеют те же точки, но, поскольку я добавляю эти точки с помощью earth.add(bezier_line); Three.js внутренне заботится о вращении их, чтобы расположить их в новом вращении, а это не делается с моими касательными векторами.

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

Спасибо за вашу помощь

...