javascript - ThreeJS 更改不透明度时更新场景

标签 javascript jquery three.js

这是我的对象的构造函数:

<code>class Something {
    constructor(mesh = undefined, material = undefined) {
       this.mesh = undefined;
        material = material;
        this.gui = undefined;
        if (mesh) {
            this.mesh_opacity = 1;
            this.created = true;
            this.mesh = new THREE.Mesh(mesh.geometry, new THREE.MeshPhongMaterial({
            // wireframe: true,
            transparent : true,
            opacity: this.mesh_opacity,
            color : 0xffffff
        }));
}
</code>

我将此对象添加到场景中,在我的界面中,我有一个 slider ,可以使用此函数更改对象的不透明度:

<code><script type="text/javascript">
    $('#slider').on('change', function(){
        val = $("#slider").val();
        scene.something.mesh_opacity = val;
        scene.something.material = new THREE.MeshPhongMaterial({
            transparent : true,
            opacity: val,
            color : 0xffffff
        });
        scene.something.material.needsUpdate = true;
    })
</script></code>

但在我的场景中我没有看到任何更新。如何即时更新场景中不透明度的变化?

最佳答案

Opacity0.0 - 1.0 之间的值。您需要将从 slider 中获取的值(通常是 0 - 100)除以 100。如下所示:

val = $("#slider").val() / 100;

正如囚犯849提到的,其他选项是手动设置 slider 值:

<input type="range" id="slider" min="0" max="1" step="0.01" value="0.5" class="slider">

这允许您直接获取值:

val = $("#slider").val();

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(
  45,
  window.innerWidth / window.innerHeight,
  1,
  100
);

var renderer = new THREE.WebGLRenderer();

var light = new THREE.PointLight(0xcccccc, 1);
light.castShadows = true;
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var geometry = new THREE.SphereGeometry(1, 20, 20);
var material = new THREE.MeshPhongMaterial({
  transparent: true,
  opacity: 1,
  color: 0xffffff
});
var sphere = new THREE.Mesh(geometry, material);

scene.add(sphere);
scene.add(light);

camera.position.z = 5;

light.position.x = 5;
light.position.y = 5;
light.position.z = 5;

document.getElementById("slider").addEventListener("change", function() {
  sphere.material.opacity = document.getElementById("slider").value;
});

var render = function() {
  requestAnimationFrame(render);

  renderer.render(scene, camera);
};

render();
body {
  margin: 0;
  overflow: hidden;
}

canvas {
  width: 100%;
  height: 100%
}

.slider {
  position: absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/87/three.min.js"></script>

<input type="range" id="slider" min="0" max="1" step="0.01" value="0.5" class="slider">

此外,您不需要每次都创建新 Material (它会减慢整个渲染过程)。您应该直接编辑应用的 Material ,如下所示:

scene.something.material.opacity = val;

r87

关于javascript - ThreeJS 更改不透明度时更新场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46486385/

相关文章:

javascript - 如何在 Angular 中使用将指令创建的元素绑定(bind)到模型中?

javascript - * 选择器上绑定(bind)单击事件时多次执行

javascript - 根据子 DOM 元素的值应用不同的类

javascript - 如何在 Javascript 中标记字符串?

javascript - 在路由器 Action 中加载组件与路由器初始化之前加载组件的优缺点

javascript - 表单提交成功后禁用表单

javascript - 自定义 phong 着色器

three.js - 减小div的宽度时用raycaster进行的检测不完全准确三.js(v72)

javascript - 使用 THREE.Points() 时出现 TypeError : can't convert undefined to object in Three. js

javascript - 如何使用html5获取angularjs中可拖动选项卡的索引值