Autodesk ForgeビューアではThree.jsで実行できる機能は実現したいが、それはできない。テストするリンクは次のとおりです。http://app.netonapp.com/JavaScript/Three.js/select_inner_objects.htmlAutodesk Forgeビューアで要素の要素をピッキングする
オブジェクト内のオブジェクトを選択する必要があります。この作業は、上のデモでTHREE.Raycasterを使用して実行できます。レイキャスターを使用して、レイが通過しているライン上のすべての要素を検出します。それから、私はオブジェクトを別のオブジェクトの背後または内側に置くことができます。
私はAutodesk Forgeビューアでこのコンセプトを試しましたが、成功しませんでした。ここでは、コードは次のようになります。
// Change this to:
// true to use original Three.js
// false to use Autodesk Forge Viewer API
var useThreeJS = true;
var container = $('div.canvas-wrap')[0];
container.addEventListener('mousedown', function (event) {
if (useThreeJS) {
var canvas = _viewer.impl.canvas;
var containerWidth = canvas.clientWidth;
var containerHeight = canvas.clientHeight;
var camera = _viewer.getCamera();
var mouse = mouse || new THREE.Vector3();
var raycaster = raycaster || new THREE.Raycaster();
mouse.x = 2 * (event.clientX/containerWidth) - 1;
mouse.y = 1 - 2 * (event.clientY/containerHeight);
mouse.unproject(camera);
raycaster.set(camera.position, mouse.sub(camera.position).normalize());
var intersects = raycaster.intersectObjects(objects);
if (intersects.length == 1) {
var obj = intersects[0].object;
obj.material.color.setRGB(1.0 - i/intersects.length, 0, 0);
} else if (intersects.length > 1) {
// Exclude the first which is the outer object (i == 0)
for (var i = 1; i < intersects.length; i++) {
var obj = intersects[i].object;
obj.material.color.setRGB(1.0 - i/intersects.length, 0, 0);
}
}
} else {
var vp = _viewer.impl.clientToViewport(event.canvasX, event.canvasY);
var renderer = _viewer.impl.renderer();
var dbId = renderer.idAtPixel(vp.x, vp.y);
if (dbId) {
console.debug("Selected Id: " + dbId);
_viewer.select(dbId);
_viewer.impl.invalidate(true);
}
}
}, false);
私はフォージの視聴者がピッキングピクセルにある要素を取得するために素晴らしいですviewer.impl.renderer().idAtPixel
方法を持っていました。しかし、ピッキングピクセルで(アンダーまたはネストされている)すべての要素を選択するために、もっとやりたいと思っています。 Forge Viewer APIを使ってどうすればいいですか?
'viewer.impl.hitTestViewport'は隠された/ゴースト要素の背後にある要素を選択することはできません。 'viewer.impl.renderer()。idAtPixel'がうまく機能します。 –