【发布时间】:2017-05-03 19:20:33
【问题描述】:
我从 .obj 和 .mtl 加载了一个模型,我希望用户能够单击模型的特定部分,例如,更改它们的颜色。即点击车门并能够更改该门网的颜色。
这是我的模型加载代码,如果需要的话。
var mtlLoader = new THREE.MTLLoader();
mtlLoader.setPath('Models/Aventador/');
mtlLoader.load('Avent.mtl', function (materials) {
materials.preload();
var objLoader = new THREE.OBJLoader();
objLoader.setMaterials(materials);
objLoader.setPath('Models/Aventador/');
objLoader.load('Avent.obj', function (object) {
object.position.y = 0;
scene.add(object);
}, onProgress, onError);
});
编辑: 我现在有以下代码,它没有给出错误并按预期将“mouseup”打印到控制台,但没有按预期打印出任何交叉点,有什么想法吗?
var mouse = new THREE.Vector2();
function onDocumentMouseUp(event) {
console.log("mouseUp")
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
var raycaster = new THREE.Raycaster();
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(scene.children);
for (var i = 0; i < intersects.length; i++) {
console.log(intersects[i]);
intersects[i].object.material.color.set(0x0000ff);
}
}
【问题讨论】:
-
我有一种感觉,你可以做到这一点的唯一方法是,如果网格的每个“可点击”部分(例如门)都是加载到场景中的单独网格。你有能力把它拆成这样吗?
-
@Hectate 我不确定,我对 3D 模型没有太多经验。我发现了一些可以遍历 3DObject 的子网格并单独更改它们的属性的东西,但是无法识别哪个网格是哪个
-
很公平,我也不知道。如果它由您可以修改的子网格组成,那么您正在寻找的答案是光线投射,以检测哪个组件被“触摸”并修改该组件的设置。试试:stackoverflow.com/questions/9275628/…
-
@Hectate 在那个例子中什么是
objectsinray.intersectObjects( objects );? -
如果我不得不猜测这将是场景中的一组对象。让我提供一个应该有更多帮助的答案。
标签: javascript model 3d three.js