FlatShading彩色自定义几何体

时间:2015-06-28 00:39:37

标签: three.js shader

只要我将自己的顶点推到几何体上,几何体就是纯色,而不是有彩色阴影。

将此代码应用于名为THREE.PlaneGeometry的{​​{1}}会产生以下阴影:

mesh

但是,当我使用自定义顶点和面将相同的代码应用于var light = new THREE.DirectionalLight(0xffffff, 1); light.castShadow = true; light.shadowDarkness = 0.5; // .. THREE.MeshLambertMaterial({ color: 0x66e6b0, shading: THREE.FlatShading }); // ... mesh.receiveShadow = true; mesh.castShadow = true; 时,几何图形为纯黑色。如何为自定义几何图形赋予与平面几何图形相同的阴影?

  • 我可以使用THREE.Geometry(),但脸上不再有阴影。
  • 使用THREE.MeshBasicMaterial并为每张脸着色仍然会使所有黑色。
  • A vertexColors: THREE.FaceColors会给出颜色,但脸上没有阴影。

这是随机生成的fiddle个面,它们都是相同的颜色。相反,我希望他们有不同的阴影,因为它们是不同的角度(如上图所示)。

2 个答案:

答案 0 :(得分:1)

不是阴影会产生这样的效果,而是z坐标。在你的jsfiddle中,你所有的三角形都在xy平面上,所以它们都具有相同的法线。所以他们的照明会是一样的。所以,如果你这样打电话:

Declare @nextStartTime nvarchar(30)
        set @nextStartTime = @DisplayStartTime

        WHILE (CONVERT(DateTime, '2015-04-17' @nextStartTime ) <= CONVERT(DateTime, '2015-04-18 23:00:00'))

        begin

            set @DisplayStartTime = @nextStartTime
            select @nextStartTime = ltrim(right(convert(varchar(100), DATEADD(minute, @Frequency, @nextStartTime)),8))


            insert into #ActualTimeSlot
            select @Parameter,@DisplayStartTime ,@nextStartTime,LTRIM((RIGHT(CONVERT(VARCHAR(100),DATEADD(minute,convert(int,@Tolerance),@nextStartTime),100),8))) as CodeEndTime,@Frequency,@Tolerance 


            set @intFlag +=1
        end

以及geometry.vertices.push(new THREE.Vector3(Math.random() * 100, Math.random() * 100, Math.random() * 100)); 因为它对任何事情没有贡献,那么你将得到你想要的变化。

答案 1 :(得分:0)

附加到几何体的顶点的任何初始坐标具有未定义的值时,会出现几何显示为全黑的问题。

甚至如果显示几何体,动画并且不会引发任何错误,如果THREE.Vector3的初始坐标未定义,则THREE.MeshLambertMaterial着色将不起作用。< / p>

fiddle中演示了此问题,undefined_variable使用new THREE.Vector3(0, 0, 0)可以防止彩色阴影,只会产生纯色。

要处理此问题,请将所有顶点初始化为任意值,例如animate()然后使用getListView()中的变量值。