我使用THREE.Shape创建了一个简单的圆圈,并将其涂成绿色。
但是我希望改变颜色,使其从绿色(中间)变为红色(边框)。
我一直在看这个网站的例子, http://threejs.org/examples/#webgl_materials_texture_manualmipmap ,但我无法理解如何为我的项目实现类似的方式。
创建圆圈的代码:
var arcShape = new THREE.Shape();
arcShape.absarc(100, 100, circleRadius, 0, Math.PI * 2, false);
var geometry = new THREE.ShapeGeometry(arcShape);
var material = new THREE.MeshBasicMaterial({ color: 0x00ff11, overdraw: 0.5, side: THREE.DoubleSide });
var mesh = new THREE.Mesh(geometry, material);
mesh.position = CirclePosition;
mesh.rotation.set(Algorithms.ConvertDegreesToRadians(-90), 0, 0);
答案 0 :(得分:2)
另一种方法是使用顶点颜色
var colorRed = new THREE.Color (0.9, 0.0, 0.0);
var colorGreen = new THREE.Color (0.0, 0.9, 0.0);
material = new THREE.MeshBasicMaterial({ vertexColors: THREE.VertexColors});
geometry = new THREE.CircleGeometry(100, 10, 0, 3);
var nmax = geometry.faces.length;
for (var n=0; n<nmax; n++) {
geometry.faces[n].vertexColors[0] = colorRed;
geometry.faces[n].vertexColors[1] = colorRed;
geometry.faces[n].vertexColors[2] = colorGreen;
}
答案 1 :(得分:1)
你引用的例子在这里并不重要。最简单的方法是使用图像。如果您习惯使用仅与WebGL渲染器兼容的方法,我制作了一个JSFiddle,显示了一个简单的GLSL着色器示例:http://jsfiddle.net/2qqdm/
关键位是片段着色器:
varying vec2 vUv;
varying vec3 vPosition;
uniform float radius;
void main() {
vec3 center = vec3(100.0, 100.0, 0.0);
float redAmount = max(0.0, min(1.0, distance(vPosition, center) / radius));
gl_FragColor = vec4(redAmount, 1.0 - redAmount, 0.0, 1.0);
}
您也可以在JS中使用顶点颜色完全执行此操作,这也与CanvasRenderer兼容;你只需要找出中心顶点的位置。