[英]Change color of three.js mesh using gui.dat
我有一个从STL文件加载的three.js网格:
var loader = new THREE.STLLoader();
var materialmodel = new THREE.MeshPhongMaterial(
{
color: 0xFF0000,
specular: 0x222222,
shininess: 75
}
);
function model()
{
loader.load( 'models/stl/binary/model.stl', function ( geometry ) {
var meshMaterial = materialmodel;
var model = new THREE.Mesh( geometry, meshMaterial );
model.scale.set( 0.02, 0.02, 0.02 );
model.castShadow = true;
model.receiveShadow = true;
model.geometry.center();
scene.add(model);
render();
} );
}
model();
当我在页面中调用模型函数时,模型将按预期方式呈现。
我想使用dat.gui
作为动态更改的轻量级界面。
我的第一个实验是更改模型的颜色。
我正在使用的代码是这样的:
var params = {
modelcolor: 0xff0000, //RED
};
var gui = new dat.GUI();
var folder = gui.addFolder( 'Model Colour' );
folder.addColor( params, 'modelcolor' )
.name('Model Color')
.listen()
.onChange( function() { materialmodel.MeshPhongMaterial.color.set( params.modelcolor); } );
folder.open();
DAT.GUIs颜色选择器看起来不错,我可以从选择器中选择一种颜色,然后将显示新的十六进制值。
但是,模型/网格物体本身不会使用新选择的颜色进行更新。
我想知道是否与更改颜色materialmodel.MeshPhongMaterial.color.set( params.modelcolor);
(我尝试过用其他方法来做到这一点,但是没有运气)。
我在这里看到了一个帖子(答案之一),他们在示例中使用model.material.color.set(params.color)
进行了此操作。 我的材料的属性是使用THREE.MeshPhongMaterial .....在一个变量中定义的
假设这是我出问题的地方,如何动态更改嵌套在这样的变量中的嵌套prroperty的颜色?
我不明白为什么要使用.listen()
,可能有一定原因。
在.onUpdate
功能你使用materialmodel
,这是材料本身,然后你设置.MeshPhongMaterial
不存在财产。 看起来您只是忽略了它。
这是一个工作示例:
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000); camera.position.set(0, 0, 10); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); var light = new THREE.DirectionalLight(0xffffff, 0.5); light.position.setScalar(10); scene.add(light); scene.add(new THREE.AmbientLight(0xffffff, 0.5)); var materialmodel = new THREE.MeshPhongMaterial({ color: 0xFF0000, specular: 0x222222, shininess: 75 }); var geometrymodel = new THREE.SphereBufferGeometry(5, 32, 16); var model = new THREE.Mesh(geometrymodel, materialmodel); scene.add(model); var params = { modelcolor: "#ff0000" }; var gui = new dat.GUI(); var folder = gui.addFolder('Model Colour'); folder.addColor(params, 'modelcolor') .name('Model Color') .onChange(function() { materialmodel.color.set(params.modelcolor); }); folder.open(); render(); function render() { requestAnimationFrame(render); renderer.render(scene, camera); }
body { overflow: hidden; margin: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/96/three.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.2/dat.gui.min.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.