螺旋线
import { CameraType } from '@antv/g';
import { Renderer as WebGLRenderer } from '@antv/g-webgl';
import { Plugin as ThreeDPlugin } from '@antv/g-plugin-3d';
import { Plugin as ControlPlugin } from '@antv/g-plugin-control';
import { Runtime, corelib, extend } from '@antv/g2';
import { threedlib } from '@antv/g2-extension-3d';
// Create a WebGL renderer.
const renderer = new WebGLRenderer();
renderer.registerPlugin(new ThreeDPlugin());
renderer.registerPlugin(new ControlPlugin());
// Customize our own Chart with threedlib.
const Chart = extend(Runtime, { ...corelib(), ...threedlib() });
const chart = new Chart({
container: 'container',
renderer,
depth: 400, // Define the depth of chart.
});
/**
* 3D Spiral
* @see https://plotly.com/javascript/3d-line-plots/
*/
const pointCount = 500;
let r;
const data = [];
for (let i = 0; i < pointCount; i++) {
r = i * (pointCount - i);
data.push({
x: r * Math.cos(i / 30),
y: r * Math.sin(i / 30),
z: i,
});
}
chart.options({
type: 'line3D',
data: data,
encode: { x: 'x', y: 'y', z: 'z', size: 4 },
coordinate: { type: 'cartesian3D' },
scale: { x: { nice: true }, y: { nice: true }, z: { nice: true } },
legend: false,
axis: {
x: { gridLineWidth: 2 },
y: { gridLineWidth: 2, titleBillboardRotation: -Math.PI / 2 },
z: { gridLineWidth: 2 },
},
});
chart.render().then(() => {
const { canvas } = chart.getContext();
const camera = canvas.getCamera();
// Use perspective projection mode.
camera.setPerspective(0.1, 5000, 45, 640 / 480);
camera.rotate(30, 30, 0);
camera.dolly(30);
camera.setType(CameraType.ORBITING);
});