javascript - 动态几何体上的面法线

标签 javascript three.js

我正在尝试为网格创建顶点动画。 想象一下顶点着色器,但采用软件而不是硬件。

基本上我所做的就是对每个顶点应用一个变换矩阵。网格还可以,但法线看起来一点都不好。 我尝试同时使用 computeVertexNormals()computeFaceNormals() 但它不起作用。

以下代码是我用于动画的代码(initialVertices 是 CubeGeometry 生成的初始顶点):

for (var i=0;i<mesh1.geometry.vertices.length; i++)
{
    var vtx=initialVertices[i].clone();
    var dist = vtx.y;

    var rot=clock.getElapsedTime() - dist*0.02;

    matrix.makeRotationY(rot);

    vtx.applyMatrix4(matrix);
    mesh1.geometry.vertices[i]=vtx;
}
mesh1.geometry.verticesNeedUpdate = true;

这里有两个示例,其中一个可以与 CanvasRenderer 一起正常工作:

http://kile.stravaganza.org/lab/js/dynamic/canvas.html

以及在 WebGL 中不起作用的一个:

http://kile.stravaganza.org/lab/js/dynamic/webgl.html

知道我缺少什么吗?

最佳答案

你错过了一些东西。

(1) 您需要设置 Material 的环境反射率。将其设置为等于漫反射率或颜色是合理的。

var material = new THREE.MeshLambertMaterial( {
    color:0xff0000,
    ambient:0xff0000
} );

(2) 如果要移动顶点,则需要按正确的顺序更新质心、面法线和顶点法线。查看源代码。

mesh1.geometry.computeCentroids();
mesh1.geometry.computeFaceNormals();
mesh1.geometry.computeVertexNormals();

(3) 当您使用WebGLRenderer时,您需要设置所需的更新标志:

mesh1.geometry.verticesNeedUpdate = true;
mesh1.geometry.normalsNeedUpdate = true;

提示:避免紧密循环中的 newclone 是个好主意吗?

三.js r.63

关于javascript - 动态几何体上的面法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388237/

相关文章:

javascript - 回调函数内没有值的变量

javascript - 根据单选按钮选择显示来自所选数组的图像?

javascript - 为动画添加重力

javascript - three.js 二维文本 Sprite 标签

javascript - 使用 Three.js 从一侧看不到脸

javascript - three.js rectAreaLight 是最新的

three.js - 在三个JS编辑器中使用场景的用户数据

JavaScript 双击函数 Three.js

javascript - 将元素数据传递给 Bootstrap 模态

javascript - 实现上一页和下一页逻辑的最佳方法是什么