Published
Edited
May 20, 2022
Fork of Three.js
1 fork
1 star
Insert cell
Insert cell
Insert cell
Insert cell
renderer.domElement
Insert cell
updatePos()
Insert cell
{
while (true) {
renderer.render(scene, camera);
yield null
}
}
Insert cell
Insert cell
function removeByName(name) {
const toDelete = scene.getObjectByName(name);
if (toDelete) {
scene.remove(toDelete);
}
}
Insert cell
birdMaterial = new THREE.MeshBasicMaterial({side: THREE.DoubleSide, color: "gray" })
Insert cell
birdShader = new THREE.ShaderMaterial({
side: THREE.DoubleSide,
vertexShader: `
varying vec2 vUv;

void main() {
vec3 transformed = vec3( position );
vec4 mvPosition = vec4( transformed, 1.0 );
#ifdef USE_INSTANCING
mvPosition = instanceMatrix * mvPosition;
#endif
//vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0);
vec4 modelViewPosition = modelViewMatrix * mvPosition;
vUv = uv;
gl_Position = projectionMatrix * modelViewPosition;
}
`,
fragmentShader: `
uniform float u_time;
uniform float test;
varying vec2 vUv;

void main () {
//float hue = abs(sin(u_time));
// gl_FragColor = vec4(0.0,1.0,0.0,1.0); // green
gl_FragColor = vec4(1.0,0.0,0.0,1.0); // red
if (!gl_FrontFacing){
gl_FragColor = vec4(1.0,0.95,0.01,1.0); // yellow
}
}
`,
uniforms: {
u_time: { value: 0 }
}
});
Insert cell
function updatePos(){
for (let i = 0; i < params.maxBirds; ++i) {
dummy.position.set(rand(),rand(),rand());
dummy.updateMatrix();
instanceMesh.setMatrixAt(i, dummy.matrix);
}
instanceMesh.instanceMatrix.needsUpdate = true;
}
Insert cell
function createBirdHalfInstanceMesh(vertices) {
const instanceName = "meshBottom";
removeByName(instanceName);

const sphereGeometry = new THREE.SphereGeometry();
const geometry = new THREE.BufferGeometry();
geometry.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
const mesh = new Troika.InstancedUniformsMesh(geometry, birdShader, params.maxBirds);
mesh.instanceMatrix.setUsage(THREE.DynamicDrawUsage);
mesh.instanceMatrix.needsUpdate = true;
mesh.frustumCulled = false;
mesh.name = instanceName;
scene.add(mesh);
return mesh;
}
Insert cell
instanceMesh = createBirdHalfInstanceMesh(birdTopVertices)
Insert cell
Insert cell
dummy = new THREE.Object3D();
Insert cell
height = 600
Insert cell
cubeMaterial = new THREE.MeshNormalMaterial();
Insert cell
scene = {
const scene = new THREE.Scene();
scene.background = new THREE.Color( 0x8fbbc9 );
return scene;
}
Insert cell
camera = {
const fov = 45;
const aspect = width / height;
const near = 1;
const far = 1000;
const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
camera.position.set(22, 10, 10)
return camera;
}
Insert cell
Insert cell
Insert cell
controls = {
const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.addEventListener("change", () => renderer.render(scene, camera));
controls.target = new THREE.Vector3(5,5,5)
controls.update();
invalidation.then(() => (controls.dispose()));
return controls
}
Insert cell
renderer = {
const renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize(width, height);
renderer.setPixelRatio(devicePixelRatio);
invalidation.then(() => (renderer.dispose()));
return renderer;
}
Insert cell
THREE = {
const THREE = window.THREE = await require("three@0.130.0/build/three.min.js");
await require("three@0.130.0/examples/js/controls/OrbitControls.js").catch(() => {});
return THREE;
}
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more