Lite Solar System
Loading example…
import { ExtensionCategory, Graph, register } from '@antv/g6';
import { Light, Sphere, renderer } from '@antv/g6-extension-3d';
register(ExtensionCategory.PLUGIN, 'light', Light);
register(ExtensionCategory.NODE, 'sphere', Sphere);
const graph = new Graph({
renderer,
data: {
nodes: [
{
id: 'sum',
style: {
x: 300,
y: 300,
radius: 100,
texture: 'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*-mZfQr8LtPUAAAAAAAAAAAAADmJ7AQ/original',
},
},
{
id: 'mars',
style: {
x: 430,
y: 300,
z: 0,
radius: 20,
texture: 'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*mniGTZktpecAAAAAAAAAAAAADmJ7AQ/original',
},
},
{
id: 'earth',
style: {
x: 500,
y: 300,
z: 0,
radius: 30,
texture: 'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*cdTdTI2bNl8AAAAAAAAAAAAADmJ7AQ/original',
},
},
{
id: 'jupiter',
style: {
x: 600,
y: 300,
z: 0,
radius: 50,
texture: 'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*t_mQSZYAT70AAAAAAAAAAAAADmJ7AQ/original',
},
},
],
},
node: {
type: 'sphere',
style: {
materialShininess: 0,
labelText: (d) => d.id,
labelFill: '#fff',
},
},
plugins: [
{
type: '3d-light',
directional: {
direction: [0, 0, 1],
},
},
{
type: 'background',
backgroundImage:
'url(https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*M_OaRrzIZOEAAAAAAAAAAAAADmJ7AQ/original)',
backgroundPosition: 'center',
},
],
});
graph.draw().then(() => {
const element = graph.context.element;
const sum = element.getElement('sum');
const mars = element.getElement('mars');
const earth = element.getElement('earth');
const jupiter = element.getElement('jupiter');
const setRotation = (element, speed) => {
setInterval(() => {
element.rotate(0, -speed, 0);
}, 30);
};
setRotation(sum, 0.1);
setRotation(mars, 0.8);
setRotation(earth, 1);
setRotation(jupiter, 0.5);
const setRevolution = (element, center, speed) => {
setInterval(() => {
const [x, y, z] = element.getPosition();
const [cx, , cz] = center;
const angle = (speed * Math.PI) / 180;
const newX = (x - cx) * Math.cos(angle) + (z - cz) * Math.sin(angle) + cx;
const newZ = -(x - cx) * Math.sin(angle) + (z - cz) * Math.cos(angle) + cz;
element.setPosition(newX, y, newZ);
}, 30);
};
setRevolution(mars, [300, 300, 0], 1.5);
setRevolution(earth, [300, 300, 0], 1);
setRevolution(jupiter, [300, 300, 0], 0.5);
});
import { Graph } from '@antv/g6';
import GUI from 'lil-gui';
export function addPanel(renderPanel: (gui: GUI) => void) {
const gui = new GUI({ container: document.body });
gui.title('Control');
Object.assign(gui.domElement.style, { position: 'absolute', top: '0', right: '0', zIndex: '10' });
renderPanel(gui);
addEventListener('pagehide', () => gui.destroy(), { once: true });
}
export async function createGraph(
options: ConstructorParameters<typeof Graph>[0],
size: { width?: number; height?: number } = {},
renderPanel?: (gui: GUI, graph: Graph) => void,
) {
const container = document.createElement('div');
Object.assign(container.style, {
width: '100%',
maxWidth: `${size.width || 600}px`,
height: `${size.height || 400}px`,
});
document.getElementById('container')!.append(container);
const graph = new Graph({ ...size, ...options, width: container.clientWidth, container, autoResize: true });
addEventListener('pagehide', () => graph.destroy(), { once: true });
await graph.render();
if (renderPanel) addPanel((gui) => renderPanel(gui, graph));
return container;
}