javascript - Three.js:更改一个网格的材质会更改场景中的所有材质
问题描述
我正在尝试从数组中随机选择我的场景中的三个 JS 中的网格,在我的场景中选择看起来像网格的东西并编辑它的属性,似乎会影响整个场景,即它会改变所有网格的颜色,但是,在这个例子中我没有合并任何多边形。关于我做错了什么以选择随机一个>的任何想法?
var buildingObjs = [];
for ( var i = 0; i < 20; i ++ ) {
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
geometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, 0.5, 0 ) );
var building = new THREE.Mesh( geometry, material );
var geo = new THREE.EdgesGeometry( building.geometry ); // or WireframeGeometry
var mat = new THREE.LineBasicMaterial( { color: 0xcfcfcf } );
var wireframe = new THREE.LineSegments( geo, mat );
building.add( wireframe );
var value = 1 - Math.random() * Math.random();
var color = new THREE.Color().setRGB( value + Math.random() * 0.1, value, value + Math.random() * 0.1 );
var top = color.clone().multiply( light );
var bottom = color.clone().multiply( shadow );
building.position.x = Math.floor( Math.random() * 200 - 100 ) * 10;
building.position.z = Math.floor( Math.random() * 200 - 100 ) * 10;
building.rotation.y = Math.random();
building.scale.x = building.scale.z = Math.random() * Math.random() * Math.random() * Math.random() * 50 + 10;
building.scale.y = ( Math.random() * Math.random() * Math.random() * building.scale.x ) * 8 + 8;
buildingObjs.push(building);
scene.add(building);
}
function randomBuildingSelector()
{
var randomBuilding = buildingObjs[Math.floor(Math.random()*buildingObjs.length)];
return randomBuilding;
}
function startAniLabels() {
var selectedMesh = undefined;
var tt = setInterval(function(){
selectedMesh = randomBuildingSelector();
console.log(selectedMesh);
selectedMesh.material.color.setHex( 0x333333 );
}, 5000);
}
下面的小提琴说明:
https://jsfiddle.net/60j5z9w3/
你会看到所有的建筑物都会改变颜色,而我预计只有一个会改变。
解决方案
问题源于您的material
变量。您只对所有建筑物使用一种材料,因此当您更改其中一个的颜色时,您会更改所有的颜色。为清楚起见,这是您的代码的简化版本:
// Create 1 material
var material = new THREE.MeshPhongMaterial();
for (var i = 0; i < 2000; i++) {
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
// Use that same material on 2000 meshes
var building = new THREE.Mesh( geometry, material );
}
// This is changing the color of the only material,
// effectively changing the color of all meshes
buildingObjs[500].material.color.setHex( 0x333333 );
如果您打算单独更改它们,则需要为每个网格创建一个新材质。
推荐阅读
- javascript - 如何使 html div 快速向右移动(不到 1 秒)并消失?
- ios - UISlider 跟踪标注未与拇指对齐
- html - 为什么浮动元素中的图像大小没有改变?
- scheme - 以下表达式中的值、变量、对象和名称有什么区别?
- python - python中的正则表达式用句点替换以整数为界的逗号
- bash - 如何将变量 args="foo bar=\"baz qux\"" 作为 *2* 参数传递?
- android - 无法为 org.gradle.api.internal.tasks.DefaultSourceSetContainer 类型的 SourceSet 容器获取未知属性“main”
- ssis - 在 SSIS 中查找假期的表达式
- asp.net-mvc - 在 ASP.NET Core MVC 中发布网站后动态更改模型和控制器
- java - 如何根据点击的微调器更改字体大小