javascript - 使用对象 ID 的光线投射不起作用:threeJS
问题描述
我正在尝试通过光线投射为模型的不同部分分配不同的标准材质,并使用其对象 ID 作为参考。但是,当我尝试为同一模型的不同 id 应用多个材质时,所有对象都显示相同的材质。无法区分ID。
相同的代码如下。
var intersects = raycaster.intersectObjects(scene.children, true);
if (intersects.length > 0) {
for (var i = 0; i < intersects.length; i++) {
if (intersects[i].object.id) {
intersects[i].object.material = material1; /* standrad material */
intersects[i].object.material.needsUpdate = true;
}
}
/* I'm using the buttons to change the materials */
$('.btn1').click(function() {
for (var i = 0; i < intersects.length; i++) {
intersects[i].object.material = material2;
intersects[i].object.material.needsUpdate = true;
}
});
$('.btn2').click(function() {
for (var i = 0; i < intersects.length; i++) {
intersects[i].object.material = material3;
intersects[i].object.material.needsUpdate = true;
}
});
}
解决方案
这是构造这样的东西的一种方法:
function materialSwitchingTest(renderer,camera){
var mouseVec = new THREE.Vector3();
var mouse2D = new THREE.Vector3();
var rawMouse2D = new THREE.Vector3();
var intersections = []
/* I'm using the buttons to change the materials */
$('.btn1').click(function() {
if(intersections.length>0) intersections[0].object.material = material1
});
$('.btn2').click(function() {
if(intersections.length>0) intersections[0].object.material = material2
});
window.onmousedown=(e)=>{
if(event.target !== renderer.domElement.parentElement)return
var mx = event.layerX;
var my = event.layerY;
rawMouse2D.set(mx, my, 0);
mouse2D.x = (mx / renderer.domElement.width) * 2 - 1;
mouse2D.y = -(my / renderer.domElement.height) * 2 + 1;
raycaster.setFromCamera(mouse2D,camera)
intersects = raycaster.intersectObjects(scene.children, true);
}
}
materialSwitchingTest( yourRenderer, yourCamera )
推荐阅读
- pascal - 有没有办法确定对对象过程的引用是否对应于 Pascal 中的对象实例?
- python - 烧瓶应用程序中的多个静态文件夹和模板文件夹
- azure-logic-apps - 逻辑应用程序 - 如何将跟踪的属性 guid 保存为字符串?
- python - 为什么元素不会在 numpy.array 中替换?
- windows - WIndows Gitlab-runner:无法重新排队跑步者
- swift - 在后台获取领域错误数据
- c# - C# - 将多 GB 图像读取到数组
- xmpp - 当 converse 在嵌入模式下初始化为单例时,有没有办法在 conversejs 中不显示邀请弹出窗口?
- mysql - 表数组中不存在 MySql
- c# - 本地 IIS 和本地 AD 上的 Windows 身份验证(Windows Server 2008 R2 Datacenter)