javascript - 三.js MeshPhongMaterial线框光照

标签 javascript three.js

当我尝试在 arrayBufferGeometry 上使用线框查看 meshphongmaterial 时,其中 vetexColors 设置为 THREE.vertexColors;照明仅适用于 1 个随机面。当我切换到 MeshBasicmaterial 时,我得到了所需的行为。将线框设置为 false 后,phong Material 看起来不错并且被点亮:

 geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));
    geometry.addAttribute('color', new THREE.BufferAttribute(colors, 3));
    geometry.computeFaceNormals();
    geometry.computeVertexNormals();

    console.log(geometry);
    var material = new THREE.MeshBasicMaterial({
        side: THREE.DoubleSide,
        wireframe: true,
        transparent: false,
        vertexColors: THREE.VertexColors, // CHANGED
        shininess: 100,
        //     color: 0xff0000,
        shading: THREE.SmoothShading
    });

    console.log(material);

    var terrainMesh = new THREE.Mesh(geometry, material);
    terrainMesh.name = 'GRD';
    terrainMesh.receiveShadow = true;
    terrainMesh.castShadow = true;
    console.log(terrainMesh);
    return terrainMesh;

我需要在 Material 之后重新计算顶点法线吗?光照适用于实体面而不适用于线框是否有原因?

最佳答案

这是一个照明问题。

我有各种灯光,环境光、代表太阳的定向光,以及跟随相机目标周围以突出显示用户正在查看的内容的聚光灯。

这些都没有正确照亮线框。然后我按照MeshPhongMaterial example看到他们使用点光源。我认为点光源和聚光灯之间的唯一区别是方向和目标。这是不正确的,因为点光源最终工作了。

另一个问题是,从点光源到线框的照明必须位于 Material 的正面(无论 MeshPhongMaterial 中的侧面属性如何),而不能来自背面。我的几何体朝下,因为加载的文件格式与标准相反。点光源必须位于几何体下方才能照亮 Material 。我最终添加了一个反向太阳型光,使用点光源从下方照亮几何体。

我仍然不明白为什么线框仅由 PointLight 照亮,以及为什么它不从后面照亮 THREE.DoubleSide。

关于javascript - 三.js MeshPhongMaterial线框光照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43508382/

相关文章:

javascript - react 绑定(bind)到类外的常量

javascript - Node.js:异步代码 + js 闭包的问题

javascript - 使用 React JS 上传多个文件

javascript - 在 mousemove 事件监听器函数主体中设置左侧位置不起作用

Three.js 高效地将 Uvs 映射到平面

javascript - 如何渲染 THREE.Group 始终位于其他项目的前面

javascript - 无法让 Sprite 贴图在三个 js 中正常工作

python - 如何立即更新 ipyvolume 形状而无需中间 View

javascript - 如何在 Javascript 中使用 PHP 中的 JSON 数据(数组)

javascript - 在 Three.js 中添加立方体数量