Forge Viewer:如何将任意客户端点转换为世界点
Forge Viewer: How to convert arbitrary client point to world point
我现在正在为一些事情而苦苦挣扎。我有一个使用 ToolInterface
扩展实现查看器的页面,以便我可以捕获鼠标事件。我已成功获取鼠标事件并可以检索返回的 x、y 坐标。
我想做的是获取该点的世界 (x, y, z) 坐标。我尝试使用 Viewer3D.clientToWorld
函数,但总是 returns null
无论该点是否在几何上。
我也尝试使用 ViewingUtilites.getHitPoint
函数来获取世界 (x, y, z) 坐标,但它总是 returns 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).
//
您可以使用查看器的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的使用
我现在正在为一些事情而苦苦挣扎。我有一个使用 ToolInterface
扩展实现查看器的页面,以便我可以捕获鼠标事件。我已成功获取鼠标事件并可以检索返回的 x、y 坐标。
我想做的是获取该点的世界 (x, y, z) 坐标。我尝试使用 Viewer3D.clientToWorld
函数,但总是 returns null
无论该点是否在几何上。
我也尝试使用 ViewingUtilites.getHitPoint
函数来获取世界 (x, y, z) 坐标,但它总是 returns 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).
//
您可以使用查看器的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的使用