【问题标题】:Three.js: Smoothing normals on non indexed BufferGeometryThree.js:平滑非索引 BufferGeometry 上的法线
【发布时间】:2021-07-07 05:22:47
【问题描述】:

我正在尝试从非索引 BufferGeometry 开始平滑网格的法线。 This question has been answered before 但是 Three.js api 已经发生了很大的变化,我无法让它在 r130 上工作

据我了解,我需要先合并顶点以获得索引的 BufferGeometry,然后重新计算法线,但这似乎不起作用。

这是一个使用默认立方体的最小示例:

    // Scene
    const scene = new THREE.Scene();
    
    // Geometry
    const boxGeometry = new THREE.BoxGeometry(.7,.7,.7);
    
    // Materials
    const shadedMaterial = new THREE.MeshStandardMaterial();
    shadedMaterial.metalness = 0.4;
    shadedMaterial.roughness = 0.4;
    shadedMaterial.color = new THREE.Color(0xffffff);
    
    // Mesh
    const smoothBoxGeometry=BufferGeometryUtils
    .mergeVertices(new THREE.BufferGeometry().copy(boxGeometry))
    smoothBoxGeometry.computeVertexNormals();
    smoothBoxGeometry.computeBoundingBox();
    smoothBoxGeometry.normalizeNormals();
    
    const box = new THREE.Mesh(smoothBoxGeometry, shadedMaterial);
    scene.add(box);

flat shaded cube instead of expected smooth shaded cube

我错过了什么?

【问题讨论】:

  • 问题被回答并接受后,请勿编辑问题。

标签: javascript three.js rendering smoothing normals


【解决方案1】:

像这样尝试:

let camera, scene, renderer;

let mesh;

init();
animate();

function init() {

  camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.01, 10);
  camera.position.z = 4;

  scene = new THREE.Scene();

  const hemiLight = new THREE.HemisphereLight(0xffffff, 0x444444);
  hemiLight.position.set(0, 20, 0);
  scene.add(hemiLight);

  const dirLight = new THREE.DirectionalLight(0xffffff);
  dirLight.position.set(-3, 10, -10);
  scene.add(dirLight);

  let geometry = new THREE.BoxGeometry();
  geometry.deleteAttribute('normal');
  geometry.deleteAttribute('uv');
  geometry = THREE.BufferGeometryUtils.mergeVertices(geometry);
  geometry.computeVertexNormals();
  const material = new THREE.MeshStandardMaterial();

  mesh = new THREE.Mesh(geometry, material);
  scene.add(mesh);

  renderer = new THREE.WebGLRenderer({
    antialias: true
  });
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);

}

function animate() {

  requestAnimationFrame(animate);

  mesh.rotation.x += 0.01;
  mesh.rotation.y += 0.02;

  renderer.render(scene, camera);

}
body {
      margin: 0;
}
<script src="https://cdn.jsdelivr.net/npm/three@0.130.1/build/three.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.130.1/examples/js/utils/BufferGeometryUtils.js"></script>

BufferGeometryUtils.mergeVertices() 只能在顶点数据相同的情况下执行合并。为确保这一点,有必要移除现有的 normal 和 uv 属性。

【讨论】:

  • 实际上我在删除法线时遇到了一些问题,我已经编辑了我的原始帖子并提供了更多信息。谢谢!
  • 请不要在 stackoverflow 编辑已回答的问题。最好创建一个新的。
猜你喜欢
  • 2018-10-09
  • 2017-12-20
  • 2016-06-20
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多