我有一系列线条,我需要用颜色为线条下方或线条之间的所有区域着色。
为了简单起见,我创建了一个带有闭合线的片段。 实际上,我有一个绘制许多行的程序(如股票市场图),我需要为图表下方的所有区域着色。另见屏幕截图。
非常感谢我可能需要采取的任何帮助甚至新方法。
<html>
<head>
<title>My first three.js app</title>
<style>
body {
margin: 0;
}
canvas {
width: 100%;
height: 100%
}
</style>
</head>
<body>
<script src="https://threejs.org/build/three.min.js"></script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 500);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
function createLine(startX,startY,endX,endY) {
const geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(startX, startY, 0));
geometry.vertices.push(new THREE.Vector3(endX, endY, 0));
const material = new THREE.LineBasicMaterial({
color: 0xffffff
});
return new THREE.Line(geometry, material);
}
scene.add(createLine(0,0,1,0));
scene.add(createLine(1,0,1,1));
scene.add(createLine(1,1,0,1));
scene.add(createLine(0,1,0,0));
camera.position.z = 5;
var animate = function () {
requestAnimationFrame(animate);
renderer.render(scene, camera);
};
animate();
</script>
</body>
</html>
&#13;
答案 0 :(得分:4)
您可以使用THREE.Shape
和THREE.ShapeGeometry
按THREE.Mesh
绘制填充多边形:
function createPolygon( poly ) {
var shape = new THREE.Shape();
shape.moveTo( poly[0][0], poly[0][1] );
for (var i = 1; i < poly.length; ++ i)
shape.lineTo( poly[i][0], poly[i][1] );
shape.lineTo( poly[0][0], poly[0][1] );
var geometry = new THREE.ShapeGeometry( shape );
var material = new THREE.MeshBasicMaterial( {
color: 0x800000
} );
return new THREE.Mesh(geometry, material);
}
var poly = [[0,1],[0.25,0],[0.5,0.5],[0.75,0],[1,1]];
scene.add(createPolygon(poly))
参见示例:
var renderer, scene, camera, controls;
init();
animate();
function createLine(startX,startY,endX,endY) {
const geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(startX, startY, 0));
geometry.vertices.push(new THREE.Vector3(endX, endY, 0));
const material = new THREE.LineBasicMaterial({
color: 0xffffff
});
return new THREE.Line(geometry, material);
}
function createPolygon( poly ) {
var shape = new THREE.Shape();
shape.moveTo( poly[0][0], poly[0][1] );
for (var i = 1; i < poly.length; ++ i)
shape.lineTo( poly[i][0], poly[i][1] );
shape.lineTo( poly[0][0], poly[0][1] );
var geometry = new THREE.ShapeGeometry( shape );
var material = new THREE.MeshBasicMaterial( {
color: 0x800000
} );
return new THREE.Mesh(geometry, material);
}
function init() {
// renderer
renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 1000 );
//camera.position.set( 20, 20, 20 );
camera.position.z = 5;
window.onresize = resize;
var light = new THREE.HemisphereLight( 0xeeeeee, 0x888888, 1 );
light.position.set( 0, 20, 0 );
scene.add( light );
var poly = [[0,1],[0.25,0],[0.5,0.5],[0.75,0],[1,1]];
scene.add(createPolygon(poly))
for (var i = 0; i < poly.length-1; ++i)
{
var i2 = i<poly.length-1 ? i+1 : 0
scene.add(createLine(poly[i][0],poly[i][1],poly[i2][0],poly[i2][1]));
}
}
function resize() {
var aspect = window.innerWidth / window.innerHeight;
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = aspect;
camera.updateProjectionMatrix();
}
function animate() {
requestAnimationFrame( animate );
renderer.render( scene, camera );
}
&#13;
body {
margin: 0;
}
canvas {
width: 100%;
height: 100%
}
&#13;
<script src="https://threejs.org/build/three.min.js"></script>
&#13;
答案 1 :(得分:3)
要用颜色填充它,您必须使用带面(THREE.Face3()
)的几何体。要拥有它,您需要试验一个形状或使用符合您需要的现有几何体,并对其顶点进行一些更改。
下面是一个非常粗略的概念,使用现有几何体(THREE.PlaneGeometry()
),为图表下方的区域 着色。但请记住,当您需要在一个图表中仅显示正值或仅显示负值时,可以使用此类方法,否则,结果将看起来很奇怪(或更好地说,丑陋)。
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(0, 2, 10);
var renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var controls = new THREE.OrbitControls(camera, renderer.domElement);
var points = [],
pointCount = 21;
var plane, line;
scene.add(new THREE.GridHelper( pointCount - 1, pointCount -1 ));
for (let i = 0; i < pointCount; i++) {
points.push({
initValue: THREE.Math.randFloat(-1, 1),
amplitude: THREE.Math.randFloat(1, 2),
speed: THREE.Math.randFloat(.5, 2)
});
}
createGraph( pointCount );
function createGraph( pointCount ) {
var planeGeom = new THREE.PlaneGeometry(pointCount - 1, 1, pointCount - 1, 1);
planeGeom.translate(0, .5, 0);
plane = new THREE.Mesh(planeGeom, new THREE.MeshBasicMaterial({
color: "red",
wireframe: false,
side: THREE.DoubleSide,
transparent: true,
opacity: .75
}));
scene.add(plane);
var lineGeom = new THREE.Geometry();
for (let i = 0; i < plane.geometry.parameters.widthSegments + 1; i++) {
lineGeom.vertices.push(planeGeom.vertices[i]); // share the upper points of the plane
}
line = new THREE.Line(lineGeom, new THREE.LineBasicMaterial({
color: "aqua"
}));
plane.add(line);
}
var time = 0;
render();
function render() {
time = Date.now() * .001;
requestAnimationFrame(render);
points.forEach( ( p, idx ) => {
plane.geometry.vertices[idx].y = 2.5 + Math.sin( (time + p.initValue) * p.speed) * p.amplitude; // the trick is that indices of upper vertices are from 0 to N consequently in row (r87),
// thus we can assign the data from the `points` array to their Y-coordinates to form the graph
});
plane.geometry.verticesNeedUpdate = true; // the most important thing when you change coordiantes of vertices
line.geometry.verticesNeedUpdate = true; // the most important thing when you change coordiantes of vertices
renderer.render(scene, camera);
}
body {
overflow: hidden;
margin: 0;
}
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
答案 2 :(得分:2)
您需要创建一个大的形状,并考虑要填充的整个图形。所以,就像在你的图像中,然后包括轴。
然后你可以用任何材料填充形状。
以下是threejs网站上的一些示例:
https://threejs.org/examples/?q=shape#webgl_geometry_extrude_shapes2 https://threejs.org/examples/?q=shape#webgl_geometry_shapes
你可能不需要像那些例子那样挤出。