我现在正为一些事情而挣扎。我有一个页面,它使用ToolInterface实现查看器的扩展名,这样我就可以捕获鼠标事件。我正在成功地获取鼠标事件,并可以检索返回的x,y坐标。
我要做的是得到这个点的世界坐标(x,y,z)。我尝试使用Viewer3D.clientToWorld函数,但是无论点是否超过几何学,它总是返回null。
我还尝试使用ViewingUtilites.getHitPoint函数获取世界(x,y,z)坐标,但它也总是返回null。我尝试使用事件返回的(x,y),并将其规范化。
因此,我的问题是,如何从Forge查看器中的客户端(x,y)坐标获取世界(x,y,z)坐标?
谢谢!
*编辑:下面添加的代码
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).
//发布于 2018-11-29 13:59:29
您可以使用查看器的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的使用。
https://stackoverflow.com/questions/53511258
复制相似问题