Forge Viewer: Как преобразовать произвольную точку клиента в точку мира - PullRequest
0 голосов
/ 28 ноября 2018

Я борюсь с чем-то прямо сейчас.У меня есть страница, реализующая средство просмотра с расширением, использующим ToolInterface, чтобы я мог захватывать события мыши.Я успешно получаю события мыши и могу получить координаты x, y, которые были возвращены.

Я хотел бы получить координаты мира (x, y, z) для этой точки.Я пытался использовать функцию Viewer3D.clientToWorld, но она всегда возвращает null независимо от того, находится ли точка над геометрией или нет.

Я также пытался использовать функцию ViewingUtilites.getHitPoint, чтобы получить мир (x, y, z), но также всегда возвращает null.Я попытался использовать (x, y) как возвращено событием и также нормализовал.

Поэтому мой вопрос, как мне получить координаты мира (x, y, z) от клиента (x, y)) координаты в программе просмотра Forge?

Спасибо!

**** РЕДАКТИРОВАТЬ: Код добавлен ниже

MyViewerTool = function (viewer, options) {

Autodesk.Viewing.Extension.call(this, viewer, options);

var _self = this;
var _viewer = viewer;

// ....
_self.tool = null;

function MyViewerTool(viewer, toolName) {

    function normalizePoint(screenPoint) {
        const viewport = _viewer.navigation.getScreenViewport();
        var n = {
            x: (screenPoint.x - viewport.left) / viewport.width,
            y: (screenPoint.y - viewport.height) / viewport.height
        }

        return n;
    }

    this.handleSingleClick = function(event, button) {
        console.log(event);
        const normalizedPoint = normalizePoint({ x: event.clientX, y: event.clientY });
        const worldPoint = _viewer.utilities.getHitPoint(normalizedPoint.x, normalizedPoint.y);
        console.log(worldPoint);
        return false;
    };

    // ...
}
// other code that just does the register/load/etc
// this does load in the viewer as I am able to
// set a breakpoint above and I see what looks like
// valid point data.
// my first try used the clientToWorld(...)
// using the same event data passed in handleSingleClick (above).
//

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете использовать функцию просмотра clientToWorld(x, y, ignoreTransparent).

Пример реализации:

let canvas = this.viewer.canvas;
let drag = false;

canvas.addEventListener('mousedown', () => drag = false);
canvas.addEventListener('mousemove', () => drag = true);
canvas.addEventListener('mouseup', (evt) => {        
    if (!drag) {
        var hitTest = this.viewer.clientToWorld(evt.offsetX, evt.offsetY, true);
        if (hitTest) {                   
            let x = hitTest.point.x;
            let y = hitTest.point.y;
            let z = hitTest.point.z;
        }
    }
});    

Обратите внимание на использование offsetX и offsetY.

...