首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >伪造查看器:如何将任意客户端点转换为世界点

伪造查看器:如何将任意客户端点转换为世界点
EN

Stack Overflow用户
提问于 2018-11-28 02:33:46
回答 1查看 807关注 0票数 1

我现在正为一些事情而挣扎。我有一个页面,它使用ToolInterface实现查看器的扩展名,这样我就可以捕获鼠标事件。我正在成功地获取鼠标事件,并可以检索返回的x,y坐标。

我要做的是得到这个点的世界坐标(x,y,z)。我尝试使用Viewer3D.clientToWorld函数,但是无论点是否超过几何学,它总是返回null

我还尝试使用ViewingUtilites.getHitPoint函数获取世界(x,y,z)坐标,但它也总是返回null。我尝试使用事件返回的(x,y),并将其规范化。

因此,我的问题是,如何从Forge查看器中的客户端(x,y)坐标获取世界(x,y,z)坐标?

谢谢!

*编辑:下面添加的代码

代码语言:javascript
运行
复制
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).
//
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-29 13:59:29

您可以使用查看器的clientToWorld(x, y, ignoreTransparent)函数。

一个示例实现:

代码语言:javascript
运行
复制
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的使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53511258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档