body{
overflow: hidden;
margin: 0;
}
console.clear();
import * as THREE from "https://cdn.skypack.dev/[email protected]";
import {OrbitControls} from "https://cdn.skypack.dev/[email protected]/examples/jsm/controls/OrbitControls.js";
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera(60, innerWidth / innerHeight, 1, 1000);
camera.position.set(0, 8, 13);
let renderer = new THREE.WebGLRenderer();
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);
let controls = new OrbitControls(camera, renderer.domElement);
let cylGeom = new THREE.CylinderBufferGeometry(0.5, 1, 2, 8);
let cylMat = new THREE.MeshBasicMaterial({color: "red", polygonOffset: true, polygonOffsetFactor: 1});
let cylinder = new THREE.InstancedMesh(cylGeom, cylMat, 100);
let dummy = new THREE.Object3D();
let mat4 = new THREE.Matrix4();
let counter = 0;
let pos = [];
for(let z = 0; z < 10; z++){
for(let x = 0; x < 10; x++){
dummy.position.set(-4.5 + x, 0, -4.5 + z).multiplyScalar(2);
dummy.updateMatrix();
cylinder.setMatrixAt(counter, dummy.matrix);
pos.push(dummy.position.x, dummy.position.y, dummy.position.z);
counter++;
}
}
cylinder.instanceMatrix.needsUpdate = true;
console.log(cylinder);
scene.add(cylinder);
let lineGeom = new THREE.EdgesGeometry(cylGeom);
lineGeom = new THREE.InstancedBufferGeometry().copy(lineGeom);
lineGeom.instanceCount = Infinity;
lineGeom.setAttribute("instPos", new THREE.InstancedBufferAttribute(new Float32Array(pos), 3));
let lineMat = new THREE.LineBasicMaterial({
color: "yellow",
onBeforeCompile: shader => {
shader.vertexShader = `
attribute vec3 instPos;
${shader.vertexShader}
`.replace(
`#include <begin_vertex>`,
`#include <begin_vertex>
transformed += instPos;
`
);
console.log(shader.vertexShader);
}
});
let lines = new THREE.LineSegments(lineGeom, lineMat);
scene.add(lines);
renderer.setAnimationLoop(()=>{
renderer.render(scene, camera);
})
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.