Three.js 自定义 objLoader 几何光照

标签 three.js

我有这个对象,我正在用 THREE.objLoader 加载,然后用它创建一个网格,如下所示:

mesh = new THREE.SceneUtils.createMultiMaterialObject(
  geometry,
  [
    new THREE.MeshBasicMaterial({color: 0xFEC1EA}),
    new THREE.MeshBasicMaterial({
      color: 0x999999,
      wireframe: true,
      transparent: true,
      opacity: 0.85
    })
  ]
);

在我的场景中,我添加了一个 DirectionalLight,它可以工作并且我可以看到我的对象,但是它就像 DirectionalLight 是一个环境光。没有一张脸像它应该的那样变得更黑或更亮。

对象填充了颜色,但没有对其应用照明。
如果有人可以帮助我,我将不胜感激:)

我会错过什么?

Jsfiddle在这里:http://jsfiddle.net/5hcDs/

最佳答案

好的伙计们,感谢 Maël Nison 和 doob 先生,我能够理解我遗漏的一些东西,作为我的 3d 菜鸟......我相信人们开始进入 3d 可能会发现一些有用的回顾:
基本的 3d 概念

  • 一个 3d 人脸 由一些点( 顶点 )和一个称为 的向量组成正常 ,表示人脸的方向(哪一边是正面,哪一边是背面)。
  • 没有法线可能真的很糟糕,因为默认情况下只会在正面应用光照。因此在尝试应用 LambertMaterial 或 PhongMaterial 时出现黑色模型。
  • OBJ 文件是一种描述 3D 信息的方式。想了解更多信息?阅读 this wikipedia article (en) .另外,the french page提供了一个可用于测试的多维数据集示例。

  • Three.js 提示和技巧
  • 当法线不存在时,无法应用照明,因此黑色模型渲染。 Three.js 实际上可以使用 geometry.computeVertexNormals() 和/或 geometry.computeFaceNormals() 计算顶点和面法线,具体取决于缺少的内容
  • 这样做时,Three.js 的法线计算可能会出错,法线将被翻转,要解决此问题,您可以简单地循环遍历几何体的面数组,如下所示:

  • /* Compute normals */
    geometry.computeFaceNormals();
    geometry.computeVertexNormals();
    
    /* Next 3 lines seems not to be mandatory */
    mesh.geometry.dynamic = true
    mesh.geometry.__dirtyVertices = true;
    mesh.geometry.__dirtyNormals = true;
    
    mesh.flipSided = true;
    mesh.doubleSided = true;
    
    /* Flip normals*/               
    for(var i = 0; i<mesh.geometry.faces.length; i++) {
      mesh.geometry.faces[i].normal.x = -1*mesh.geometry.faces[i].normal.x;
      mesh.geometry.faces[i].normal.y = -1*mesh.geometry.faces[i].normal.y;
      mesh.geometry.faces[i].normal.z = -1*mesh.geometry.faces[i].normal.z;
    }
    

    关于Three.js 自定义 objLoader 几何光照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11032145/

    相关文章:

    javascript - 如何在特定的 div 中显示 Canvas 场景?

    javascript - WebGL : When using THREE. MeshFaceMaterial,每个面都有不同的方向

    javascript - Three.js - 如果对象相交,则剪切平面?

    javascript - 在 Three.js 中使用 DragControl 进行条件拖放

    javascript - three.js 在平面上旋转相机

    javascript - 将场景中新的 ThreeJS 子元素置于前端和中心?

    javascript - Threejs Canvas 背景黑色

    javascript - Three.js 向场景添加多个立方体的更好方法

    javascript - 如何将 InstancedBufferGeometry 与 Threejs 一起使用

    jquery - 三个js控件只在div中