我正在用 THREE.Ribbon 绘制地图道路,每条道路都有不同颜色的边框,所以我使用了两条色带,一个更宽的边框颜色,一个更窄,然后我可以达到我的目的。
我还在丝带的两端画了一个带圆圈的帽子,当然画了两个圆圈,较小的一个覆盖较大的一个,就像canvas2D中的linecap一样。
我不能使用 THREE.Line 作为替代方案,因为我的 webgl 中 Line 的宽度最大值为 1。
我的代码是这样的:
var circleShape = new THREE.Shape();
var circleRadius = lineWidth/2;
circleShape.moveTo( 0, circleRadius );
circleShape.quadraticCurveTo( circleRadius, circleRadius, circleRadius, 0 );
circleShape.quadraticCurveTo( circleRadius, -circleRadius, 0, -circleRadius );
circleShape.quadraticCurveTo( -circleRadius, -circleRadius, -circleRadius, 0 );
circleShape.quadraticCurveTo( -circleRadius, circleRadius, 0, circleRadius );
var circle = new THREE.ShapeGeometry( circleShape);
var material = new THREE.MeshBasicMaterial( { color: color, depthWrite: false} );
var mesh = new THREE.Mesh( circle, material );
this.parent.add( mesh );
var material = new THREE.MeshBasicMaterial( { color: widerColor, depthWrite: false} );
var widerRibbon = new THREE.Ribbon( widerGeometry, material );
this.parent.add( widerRibbon );
var material = new THREE.MeshBasicMaterial( { color: narrowerColor, depthWrite: false} );
var narrowerRibbon = new THREE.Ribbon( narrowerGeometry, material );
this.parent.add( narrowerRibbon );
我的逻辑是后者将涵盖前者。所以更窄的丝带会覆盖更宽的丝带,丝带会覆盖半圈。
我的困难:
结果是它们相互覆盖(没有depthWrite:false)。
我发现THREE.MeshBasicMaterial可以设置depthWrite为false,我加了,然后我发现较窄的ribbon成功覆盖了较宽的ribbon,但奇怪的是ribbon两端的帽子似乎异常,当我看右边的ribbon时在上面,它工作得很好,但是当我用一个角度看它时,我发现丝带无法覆盖圆圈。
我不知道如何处理这个问题,我只是希望后面的图在它们都具有相同的 z 坐标时覆盖前面的图。
感谢您的指导!