A catalyst is a substance that modifies the rate of a chemical reaction without itself being consumed or undergoing permanent chemical alteration at the end of the process. The phenomenon is termed catalysis. Catalysts are indispensable in modern industry, enabling reactions to proceed under milder conditions (lower temperature and pressure) with higher selectivity and faster rates. They do not alter the thermodynamic equilibrium but only the kinetic pathway.
Catalyst and reactants are in the same physical phase (all gases or all in solution). The catalyst is uniformly distributed. Examples: acid‑catalysed hydrolysis, NO catalysed oxidation of SO₂.
⚙️ Heterogeneous Catalysis
Catalyst and reactants are in different phases; typically a solid catalyst with gaseous or liquid reactants. Reaction occurs on the catalyst surface. Also called contact catalysis. Examples: Haber process (iron), Contact process (V₂O₅).
🧬 Enzyme Catalysis
Biological catalysts (proteins) that exhibit extraordinary specificity and efficiency under mild physiological conditions. They follow Michaelis‑Menten kinetics.
1. Homogeneous Catalysis – Detailed Examples
In homogeneous catalysis, the catalyst is evenly distributed in the same phase as the reactants. This allows intimate molecular contact and often leads to high selectivity.
Gas‑phase homogeneous catalysis
(a) Oxidation of sulphur dioxide: Nitric oxide (NO) acts as a gas‑phase catalyst.
2SO₂(g) + O₂(g) + [NO(g)] → 2SO₃(g) + [NO(g)]
(b) Thermal decomposition of acetaldehyde: Iodine vapour catalyses the reaction.
CH₃CHO(g) + [I₂(g)] → CH₄(g) + CO(g) + [I₂(g)]
Solution‑phase homogeneous catalysis (liquid)
(a) Acid‑catalysed inversion of cane sugar: Dilute H₂SO₄ or HCl catalyses the hydrolysis of sucrose to glucose and fructose.
C₁₂H₂₂O₁₁(aq) + H₂O(l) + [H⁺] → C₆H₁₂O₆(glucose) + C₆H₁₂O₆(fructose) + [H⁺]
(b) Ester hydrolysis (acid or base catalysed): H⁺ or OH⁻ ions catalyse the reaction.
CH₃COOC₂H₅ + H₂O + [H⁺/OH⁻] → CH₃COOH + C₂H₅OH + [H⁺/OH⁻]
(c) Decomposition of hydrogen peroxide: Iodide ion (I⁻) in solution catalyses the reaction.
2H₂O₂(aq) + [I⁻] → 2H₂O(l) + O₂(g) + [I⁻]
2. Heterogeneous Catalysis – Detailed Examples
Heterogeneous catalysis is of enormous industrial importance because solid catalysts can be easily separated, regenerated, and used in continuous flow reactors. The reaction occurs on the active sites of the catalyst surface.
Gas‑solid reactions (contact catalysis)
Contact process (manufacture of H₂SO₄): Vanadium pentoxide (V₂O₅) or platinum catalyses the oxidation of SO₂.
2SO₂(g) + O₂(g) + [V₂O₅(s)] → 2SO₃(g) + [V₂O₅(s)]
Haber process (ammonia synthesis): Finely divided iron with promoters (Al₂O₃, K₂O) catalyses the reaction.
N₂(g) + 3H₂(g) + [Fe(s)] → 2NH₃(g) + [Fe(s)]
Ostwald process (oxidation of ammonia): Platinum‑rhodium gauze catalyst.
4NH₃(g) + 5O₂(g) + [Pt(s)] → 4NO(g) + 6H₂O(g) + [Pt(s)]
Hydrogenation of alkenes: Finely divided nickel, palladium, or platinum catalysts.
H₂C=CH₂(g) + H₂(g) + [Ni(s)] → CH₃–CH₃(g) + [Ni(s)] Similarly, vegetable oils (unsaturated triglycerides) are hydrogenated to solid fats (vanaspati ghee) using nickel catalyst.
Catalytic cracking of petroleum: Zeolites (aluminosilicates) break large hydrocarbon molecules into smaller gasoline fractions.
Liquid‑solid heterogeneous catalysis
Decomposition of H₂O₂ by solid MnO₂:
2H₂O₂(l) + [MnO₂(s)] → 2H₂O(l) + O₂(g) + [MnO₂(s)]
Enzymes are protein molecules that act as highly specific catalysts in living organisms. They operate under mild conditions (ambient temperature, aqueous medium, pH ~7) and exhibit remarkable substrate specificity. Examples include:
Amylase – catalyses hydrolysis of starch to sugars.
Catalase – decomposes hydrogen peroxide to water and oxygen.
Urease – catalyses hydrolysis of urea to ammonia and carbon dioxide.
Pepsin / Trypsin – proteases that break down proteins.
Enzyme catalysis follows the lock‑and‑key model (or induced‑fit model) where the substrate binds specifically to the active site. The rate of an enzyme‑catalysed reaction is described by the Michaelis‑Menten equation:
v = Vmax [S] / (Km + [S])
Enzymes can be inhibited by competitive or non‑competitive inhibitors, which is important in drug design and metabolic regulation.
General Characteristics of Catalytic Reactions
The following features are common to most catalytic processes, whether homogeneous, heterogeneous, or enzymatic:
1. Catalyst remains unchanged in mass and chemical composition after the reaction. It may undergo physical changes (e.g., particle size reduction, surface restructuring) but its chemical identity is restored.
2. Small quantity often sufficient: A tiny amount of catalyst can accelerate a large amount of reactants. For example, traces of platinum catalyse the decomposition of hydrogen peroxide; however, some catalysts (e.g., AlCl₃ in Friedel‑Crafts) need up to 30% by mass of the reactants to be effective.
3. Finely divided form enhances activity: In heterogeneous catalysis, increased surface area provides more active sites. Colloidal platinum is far more active than a lump of platinum. Finely divided nickel is used in hydrogenation because of its high surface area.
4. Specificity: A catalyst that works for one reaction may not work for another. Moreover, different catalysts can yield different products from the same starting material. For example:
Ethanol with Al₂O₃ (dehydration) → ethene.
Ethanol with Cu (dehydrogenation) → acetaldehyde.
5. Catalysts can initiate reactions: Originally it was thought that catalysts only speed up already existing reactions, but many catalysts can initiate reactions that would otherwise not occur at all. Platinum black, for instance, initiates the combination of hydrogen and oxygen at room temperature, which would otherwise remain unchanged indefinitely.
6. Catalyst does not alter the equilibrium position: It accelerates forward and reverse reactions equally, so the equilibrium constant (K) remains unchanged. The catalyst only reduces the time required to reach equilibrium. For example, in the Haber process, iron catalyst enables equilibrium to be reached much faster, but the percentage yield of ammonia at equilibrium is the same as without catalyst (just achieved much later).
7. Temperature effect: The rate of a catalytic reaction increases with temperature up to an optimum point; beyond that, activity may decrease due to physical changes (e.g., coagulation of colloidal catalysts, deactivation of enzymes). This optimum temperature is specific to each catalyst.
8. Catalysts can be poisoned: Certain substances (poisons) can irreversibly bind to active sites and destroy catalytic activity. For example, lead or sulfur compounds poison platinum catalysts; carbon monoxide poisons iron catalysts.
9. Promoters and inhibitors: Promoters (activators) enhance catalytic activity (e.g., Al₂O₃ and K₂O added to iron in Haber process). Inhibitors decrease activity.
Industrial Applications of Catalysis
Catalysis is the backbone of the chemical industry. Below is a table of major industrial processes and their catalysts:
Process
Catalyst
Product / Importance
Haber process
Fe (with Al₂O₃, K₂O)
Ammonia (fertilizers)
Contact process
V₂O₅ or Pt
Sulfuric acid (most produced chemical)
Ostwald process
Pt‑Rh gauze
Nitric acid (fertilizers, explosives)
Catalytic cracking
Zeolites
Gasoline from crude oil
Hydrogenation of oils
Ni, Pd, Pt
Margarine, vanaspati
Water‑gas shift reaction
Fe‑Cr, Cu‑Zn
Hydrogen production
Polymerisation (Ziegler‑Natta)
TiCl₃ / Al(C₂H₅)₃
Polyethylene, polypropylene
Automotive catalytic converter
Pt, Pd, Rh
Reduction of CO, NOₓ, hydrocarbons
Methanol synthesis
CuO/ZnO/Al₂O₃
Methanol fuel and chemical feedstock
Mechanism of Heterogeneous Catalysis (Adsorption Theory)
The modern theory of heterogeneous catalysis involves the following steps:
Diffusion of reactants to the catalyst surface.
Adsorption of reactants onto active sites (physisorption or chemisorption).
Surface reaction between adsorbed species.
Desorption of products from the surface.
Diffusion of products away from the surface.
The rate‑determining step is usually the surface reaction. The catalyst provides an alternative pathway with lower activation energy, often by weakening bonds in the adsorbed molecules (e.g., H‑H bond cleavage on metal surfaces).
Differences Between Homogeneous and Heterogeneous Catalysis
Property
Homogeneous Catalysis
Heterogeneous Catalysis
Phase of catalyst
Same as reactants (gas or liquid)
Different (usually solid)
Separation of catalyst
Difficult (distillation, extraction)
Easy (filtration, centrifugation)
Reusability
Often limited (catalyst may degrade)
High (can be reused many times)
Selectivity
Generally high
Moderate; depends on surface structure
Operating conditions
Milder
Often high T and P
Industrial example
Acid catalysis, hydroformylation
Haber, Contact, cracking
📝 Catalysis – Comprehensive Quiz
1. Which of the following is an example of homogeneous catalysis?
2. A catalyst increases the rate of a reaction by:
3. In heterogeneous catalysis, the reaction occurs:
4. Which statement about catalysts is INCORRECT?
5. The catalyst used in the hydrogenation of vegetable oils is:
6. The promoter added to iron catalyst in the Haber process is:
7. Which of the following is an example of an enzyme?
8. In the Contact process for sulfuric acid, the catalyst used is:
// —- 2D simulation: always running, no play button —-
(function() {
const canvas = document.getElementById(‘simCanvasTop’);
const ctx = canvas.getContext(‘2d’);
const W = canvas.width;
const H = canvas.height;
const SURFACE_Y = H – 60;
const NUM_SITES = 6;
const SITE_RADIUS = 14;let catalystOn = false;
let particles = [];
let productsFormed = 0;
let recentProducts = [];
let animId = null;
let lastTime = 0;const sites = [];
const siteSpacing = (W – 120) / (NUM_SITES – 1);
for (let i = 0; i < NUM_SITES; i++) {
sites.push({ x: 60 + i * siteSpacing, y: SURFACE_Y + 8, occupied: null, cooldown: 0 });
}class Particle {
constructor(type) {
this.id = Math.random().toString(36).slice(2);
this.type = type;
this.r = type === 'P' ? 9 : 10;
this.x = 40 + Math.random() * (W – 80);
this.y = 40 + Math.random() * (SURFACE_Y – 100);
this.vx = (Math.random() – 0.5) * 1.8;
this.vy = (Math.random() – 0.5) * 1.8;
this.state = 'free';
this.site = null;
this.reactTimer = 0;
this.partner = null;
this.alpha = 1;
this.glow = 0;
}
color() {
if (this.type === 'A') return '#ff6b6b';
if (this.type === 'B') return '#ff9f43';
return '#2ed573';
}
update(dt) {
if (this.state === 'free') {
this.x += this.vx; this.y += this.vy;
if (this.x W – this.r – 8) { this.x = W – this.r – 8; this.vx *= -1; }
if (this.y SURFACE_Y – this.r – 4) {
this.y = SURFACE_Y – this.r – 4;
this.vy *= -0.6; this.vx *= 0.98;
}
this.vx += (Math.random() – 0.5) * 0.12;
this.vy += (Math.random() – 0.5) * 0.12;
const speed = Math.hypot(this.vx, this.vy);
if (speed > 2.4) { this.vx = (this.vx / speed) * 2.4; this.vy = (this.vy / speed) * 2.4; }
if (catalystOn) {
if (this.type === ‘A’ || this.type === ‘B’) {
this.tryAdsorb();
}
}
} else if (this.state === ‘adsorbed’) {
if (this.site) {
this.x = this.site.x + Math.sin(performance.now() / 180 + this.id.length) * 1.5;
this.y = this.site.y – this.r – 2 + Math.cos(performance.now() / 220) * 1.2;
}
this.glow = 0.4 + Math.sin(performance.now() / 200) * 0.2;
} else if (this.state === ‘reacting’) {
this.reactTimer -= dt;
this.glow = 1;
if (this.reactTimer <= 0) { this.finishReaction(); }
} else if (this.state === 'desorbing') {
this.y -= 1.8;
this.alpha -= 0.02;
if (this.alpha 0) continue;
const d = Math.hypot(this.x – s.x, this.y – s.y);
if (d p.id === n.occupied);
if (!partner || partner.state !== ‘adsorbed’) continue;
const isAB = (this.type === ‘A’) ? (partner.type === ‘B’) : false;
const isBA = (this.type === ‘B’) ? (partner.type === ‘A’) : false;
if (isAB || isBA) {
this.state = ‘reacting’;
partner.state = ‘reacting’;
this.partner = partner;
partner.partner = this;
this.reactTimer = 0.55;
partner.reactTimer = 0.55;
break;
}
}
}
finishReaction() {
if (this.site) { this.site.occupied = null; this.site.cooldown = 0.35; }
if (this.partner) {
if (this.partner.site) { this.partner.site.occupied = null; this.partner.site.cooldown = 0.35; }
}
this.type = ‘P’;
this.state = ‘desorbing’;
this.site = null;
this.partner = null;
this.reactTimer = 0;
this.alpha = 1;
productsFormed++;
recentProducts.push(performance.now());
if (this.partner) {
const idx = particles.indexOf(this.partner);
if (idx > -1) particles.splice(idx, 1);
}
}
draw(ctx) {
ctx.save();
ctx.globalAlpha = this.alpha;
if (this.glow > 0 || this.state === ‘adsorbed’) {
ctx.beginPath();
ctx.arc(this.x, this.y, this.r + 8, 0, Math.PI * 2);
ctx.fillStyle = this.color() + Math.floor((this.glow || 0.3) * 40).toString(16).padStart(2, ‘0’);
ctx.fill();
}
ctx.beginPath();
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
const grad = ctx.createRadialGradient(this.x – this.r * 0.3, this.y – this.r * 0.3, 1, this.x, this.y, this.r);
grad.addColorStop(0, ‘#ffffff’);
grad.addColorStop(0.35, this.color());
grad.addColorStop(1, this.color());
ctx.fillStyle = grad;
ctx.fill();
ctx.strokeStyle = ‘rgba(0,0,0,0.12)’;
ctx.lineWidth = 1.5;
ctx.stroke();
ctx.fillStyle = ‘#1a2b4a’;
ctx.font = ‘bold 11px Outfit, sans-serif’;
ctx.textAlign = ‘center’;
ctx.textBaseline = ‘middle’;
ctx.fillText(this.type, this.x, this.y + 0.5);
ctx.restore();
}
}function initParticles() {
particles = [];
for (let i = 0; i < 9; i++) particles.push(new Particle('A'));
for (let i = 0; i { s.occupied = null; s.cooldown = 0; });
}function update(dt) {
sites.forEach(s => { if (s.cooldown > 0) s.cooldown -= dt; });
particles.forEach(p => p.update(dt));
if (!catalystOn) {
for (let i = 0; i < particles.length; i++) {
const a = particles[i];
// FIXED: proper && operators
if (a.state !== 'free') continue;
if (a.type !== 'A') { if (a.type !== 'B') continue; }
for (let j = i + 1; j < particles.length; j++) {
const b = particles[j];
if (b.state !== 'free') continue;
if (b.type !== 'A') { if (b.type !== 'B') continue; }
if (a.type === b.type) continue;
const d = Math.hypot(a.x – b.x, a.y – b.y);
if (d < a.r + b.r + 2) {
if (Math.random() p.type === ‘A’ || p.type === ‘B’).length;
if (reactants < 12) {
if (Math.random() < 0.03) {
particles.push(new Particle(Math.random() {
if (p.type === ‘P’) {
if (p.state === ‘free’) {
if (p.y now – t {
ctx.beginPath();
ctx.arc(s.x, s.y, SITE_RADIUS, 0, Math.PI * 2);
if (s.occupied) {
ctx.fillStyle = ‘rgba(0, 210, 211, 0.25)’;
ctx.strokeStyle = ‘#00d2d3’;
} else if (s.cooldown > 0) {
ctx.fillStyle = ‘rgba(150, 150, 150, 0.2)’;
ctx.strokeStyle = ‘#8899aa’;
} else {
ctx.fillStyle = ‘rgba(0, 210, 211, 0.35)’;
ctx.strokeStyle = ‘#00d2d3’;
const pulse = 1 + Math.sin(performance.now() / 300 + s.x) * 0.08;
ctx.save();
ctx.translate(s.x, s.y);
ctx.scale(pulse, pulse);
ctx.beginPath();
ctx.arc(0, 0, SITE_RADIUS, 0, Math.PI * 2);
ctx.fill();
ctx.stroke();
ctx.restore();
return;
}
ctx.fill();
ctx.lineWidth = 2;
ctx.stroke();
});
} else {
sites.forEach(s => {
ctx.beginPath();
ctx.arc(s.x, s.y, SITE_RADIUS * 0.7, 0, Math.PI * 2);
ctx.fillStyle = ‘rgba(255,255,255,0.08)’;
ctx.fill();
});
}
ctx.fillStyle = catalystOn ? ‘rgba(255,255,255,0.7)’ : ‘rgba(255,255,255,0.4)’;
ctx.font = ’12px Outfit, sans-serif’;
ctx.textAlign = ‘center’;
ctx.fillText(catalystOn ? ‘Catalyst Surface · Active Sites’ : ‘No Catalyst · High Barrier’, W / 2, H – 18);
}function draw() {
ctx.clearRect(0, 0, W, H);
const bg = ctx.createRadialGradient(W/2, H*0.3, 50, W/2, H*0.4, 400);
bg.addColorStop(0, ‘rgba(255,255,255,0.5)’);
bg.addColorStop(1, ‘rgba(230,240,255,0)’);
ctx.fillStyle = bg;
ctx.fillRect(0, 0, W, H);
drawSurface();
const free = particles.filter(p => p.state === ‘free’ || p.state === ‘desorbing’);
const bound = particles.filter(p => p.state === ‘adsorbed’ || p.state === ‘reacting’);
free.forEach(p => p.draw(ctx));
bound.forEach(p => p.draw(ctx));
particles.filter(p => p.state === ‘reacting’).forEach(p => {
ctx.beginPath();
ctx.arc(p.x, p.y, 22, 0, Math.PI * 2);
ctx.strokeStyle = `rgba(46, 213, 115, ${0.4 + Math.sin(performance.now()/80)*0.3})`;
ctx.lineWidth = 3;
ctx.stroke();
});
}function loop(ts) {
if (!lastTime) lastTime = ts;
const dt = Math.min((ts – lastTime) / 1000, 0.05);
lastTime = ts;
update(dt);
draw();
document.getElementById(‘productCountTop’).textContent = productsFormed;
document.getElementById(‘rateValTop’).textContent = (recentProducts.length / 5).toFixed(1);
document.getElementById(‘sitesFreeTop’).textContent = sites.filter(s => { if (s.occupied) return false; return s.cooldown {
initParticles();
productsFormed = 0;
recentProducts = [];
});// Catalyst toggle
document.getElementById(‘btnCatalystTop’).addEventListener(‘click’, () => {
catalystOn = !catalystOn;
const btn = document.getElementById(‘btnCatalystTop’);
btn.textContent = catalystOn ? ‘Catalyst ON’ : ‘Catalyst OFF’;
btn.classList.toggle(‘on’, catalystOn);
if (!catalystOn) {
particles.forEach(p => {
if (p.state === ‘adsorbed’ || p.state === ‘reacting’) {
p.state = ‘free’;
p.site = null;
p.partner = null;
p.vy = -1;
}
});
sites.forEach(s => { s.occupied = null; s.cooldown = 0; });
}
});initParticles();
requestAnimationFrame(loop);
})();{
“imports”: {
“three”: “https://unpkg.com/three@0.128.0/build/three.module.js”,
“three/addons/”: “https://unpkg.com/three@0.128.0/examples/jsm/”
}
}import * as THREE from ‘three’;
import { OrbitControls } from ‘three/addons/controls/OrbitControls.js’;
import { CSS2DRenderer, CSS2DObject } from ‘three/addons/renderers/CSS2DRenderer.js’;const container = document.getElementById(‘threeContainer’);
const W = container.clientWidth || 720;
const H = container.clientHeight || 400;const scene = new THREE.Scene();
scene.background = new THREE.Color(0x0a0e1a);
scene.fog = new THREE.FogExp2(0x0a0e1a, 0.007);const camera = new THREE.PerspectiveCamera(40, W / H, 0.1, 1000);
camera.position.set(10, 5, 14);
camera.lookAt(0, 0.4, 0);const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(W, H);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
container.appendChild(renderer.domElement);const labelRenderer = new CSS2DRenderer();
labelRenderer.setSize(W, H);
labelRenderer.domElement.style.position = ‘absolute’;
labelRenderer.domElement.style.top = ‘0px’;
labelRenderer.domElement.style.left = ‘0px’;
labelRenderer.domElement.style.pointerEvents = ‘none’;
container.appendChild(labelRenderer.domElement);const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.06;
controls.target.set(0, 0.5, 0);
controls.update();const ambient = new THREE.AmbientLight(0x4060a0, 0.5);
scene.add(ambient);
const main = new THREE.DirectionalLight(0xffffff, 1.0);
main.position.set(6, 12, 8);
scene.add(main);
const fill = new THREE.DirectionalLight(0x88aaff, 0.4);
fill.position.set(-6, 4, -6);
scene.add(fill);
const glowLight = new THREE.PointLight(0x66aaff, 0.6, 18);
glowLight.position.set(0, 0.8, 0);
scene.add(glowLight);const grid = new THREE.GridHelper(14, 18, 0x88aaff, 0x446688);
grid.position.y = -1.0;
grid.material.opacity = 0.2;
grid.material.transparent = true;
scene.add(grid);const pts = [];
const steps = 70;
for (let i = 0; i <= steps; i++) {
const t = i / steps;
const x = (t – 0.5) * 8;
const y = 0.85 * Math.exp(-Math.pow((t – 0.5) * 6, 2)) + 0.12 * Math.sin(t * Math.PI * 2 + 0.3) + 0.1;
pts.push(new THREE.Vector3(x, y + 0.3, 0.2));
}
const catGeom = new THREE.BufferGeometry().setFromPoints(pts);
const catMat = new THREE.LineBasicMaterial({ color: 0x88ddff, transparent: true, opacity: 0.5 });
const catLine = new THREE.Line(catGeom, catMat);
scene.add(catLine);const dotPos = [];
for (let i = 0; i < steps; i+=2) {
const t = i / steps;
const x = (t – 0.5) * 8;
const y = 0.85 * Math.exp(-Math.pow((t – 0.5) * 6, 2)) + 0.12 * Math.sin(t * Math.PI * 2 + 0.3) + 0.1;
dotPos.push(x, y + 0.3, 0.2);
}
const dotGeom = new THREE.BufferGeometry();
dotGeom.setAttribute('position', new THREE.Float32BufferAttribute(dotPos, 3));
const dotMat = new THREE.PointsMaterial({ color: 0xaaccff, size: 0.15, transparent: true, blending: THREE.AdditiveBlending });
const dotPoints = new THREE.Points(dotGeom, dotMat);
scene.add(dotPoints);const sphereGeom = new THREE.SphereGeometry(0.6, 32, 32);
const subMat = new THREE.MeshStandardMaterial({ color: 0x6ab0ff, emissive: 0x1a3a6a, roughness: 0.2, emissiveIntensity: 0.4 });
const substrate = new THREE.Mesh(sphereGeom, subMat);
substrate.position.set(-3.5, 0.5, 0.2);
scene.add(substrate);const prodMat = new THREE.MeshStandardMaterial({ color: 0xffb347, emissive: 0x5a2a0a, roughness: 0.3, emissiveIntensity: 0.3, transparent: true, opacity: 0.1 });
const product = new THREE.Mesh(sphereGeom, prodMat);
product.position.set(3.5, 0.5, 0.2);
scene.add(product);function makeLabel(text, color = '#8ab8ff') {
const div = document.createElement('div');
div.textContent = text;
div.style.color = color;
div.style.fontSize = '14px';
div.style.fontWeight = '300';
div.style.background = 'rgba(0,0,0,0.3)';
div.style.padding = '2px 14px';
div.style.borderRadius = '20px';
div.style.backdropFilter = 'blur(4px)';
div.style.border = '1px solid rgba(255,255,255,0.05)';
div.style.letterSpacing = '1px';
return new CSS2DObject(div);
}
const subLabel = makeLabel('substrate', '#8ab8ff');
subLabel.position.set(-3.5, 1.6, 0.2);
scene.add(subLabel);
const prodLabel = makeLabel('product', '#ffb347');
prodLabel.position.set(3.5, 1.6, 0.2);
scene.add(prodLabel);const catalystGroup = new THREE.Group();
const coreMat = new THREE.MeshStandardMaterial({ color: 0xffaa44, emissive: 0xcc7722, roughness: 0.3, metalness: 0.5, emissiveIntensity: 0.8 });
const core = new THREE.Mesh(new THREE.SphereGeometry(0.9, 32, 16), coreMat);
catalystGroup.add(core);const orbMat = new THREE.MeshStandardMaterial({ color: 0x88ddff, emissive: 0x2266aa, emissiveIntensity: 0.7 });
const orbs = [];
for (let i = 0; i < 14; i++) {
const orb = new THREE.Mesh(new THREE.SphereGeometry(0.14, 8, 8), orbMat);
const angle = (i / 14) * Math.PI * 2;
const radius = 1.5 + 0.2 * Math.sin(i * 1.3);
orb.position.set(Math.cos(angle) * radius, Math.sin(angle * 0.7) * 0.6, Math.sin(angle) * radius * 0.8);
catalystGroup.add(orb);
orbs.push({ mesh: orb, angle: angle, radius: radius, offset: i * 0.9 });
}const auraCanvas = document.createElement('canvas');
auraCanvas.width = 128; auraCanvas.height = 128;
const ctx2 = auraCanvas.getContext('2d');
const grad = ctx2.createRadialGradient(64, 64, 0, 64, 64, 64);
grad.addColorStop(0, 'rgba(255, 200, 120, 1)');
grad.addColorStop(0.3, 'rgba(100, 180, 255, 0.6)');
grad.addColorStop(0.7, 'rgba(40, 80, 180, 0.2)');
grad.addColorStop(1, 'rgba(0,0,0,0)');
ctx2.fillStyle = grad;
ctx2.fillRect(0, 0, 128, 128);
const auraMat = new THREE.SpriteMaterial({ map: new THREE.CanvasTexture(auraCanvas), blending: THREE.AdditiveBlending, depthWrite: false, opacity: 0.2 });
const aura = new THREE.Sprite(auraMat);
aura.scale.set(6, 6, 1);
catalystGroup.add(aura);catalystGroup.position.set(0, 0.5, 0);
scene.add(catalystGroup);const interMat = new THREE.MeshStandardMaterial({
color: 0xff8844,
emissive: 0xcc4400,
transparent: true,
opacity: 0.0,
emissiveIntensity: 0.8
});
const intermediate = new THREE.Mesh(new THREE.SphereGeometry(0.6, 32, 16), interMat);
intermediate.position.set(0, 1.4, 0.4);
scene.add(intermediate);const interLabelDiv = document.createElement('div');
interLabelDiv.textContent = '⧫ transition state (fleeting)';
interLabelDiv.style.color = '#ff8844';
interLabelDiv.style.fontSize = '13px';
interLabelDiv.style.background = 'rgba(0,0,0,0.5)';
interLabelDiv.style.padding = '2px 14px';
interLabelDiv.style.borderRadius = '20px';
interLabelDiv.style.backdropFilter = 'blur(4px)';
interLabelDiv.style.border = '1px solid rgba(255,136,68,0.3)';
interLabelDiv.style.letterSpacing = '1px';
interLabelDiv.style.fontWeight = '300';
const interLabel = new CSS2DObject(interLabelDiv);
interLabel.position.set(0, 2.4, 0.4);
scene.add(interLabel);const pCount = 120;
const pGeom = new THREE.BufferGeometry();
const pPos = new Float32Array(pCount * 3);
for (let i = 0; i stepDuration) {
elapsed = 0;
step = (step + 1) % 4;
updateStepUI3D(step);
if (step === 0) {
substrate.position.copy(subStart);
product.material.opacity = 0.1;
intermediate.material.opacity = 0.0;
}
}const t = elapsed / stepDuration;switch(step) {
case 0:
substrate.position.lerpVectors(subStart, subNear, Math.min(t * 1.3, 1));
intermediate.material.opacity = 0.0;
product.material.opacity = 0.1;
break;
case 1:
substrate.position.copy(subNear);
intermediate.material.opacity = 0.0;
product.material.opacity = 0.1;
break;
case 2:
substrate.position.copy(subNear);
const flash = Math.sin(t * Math.PI * 6) * 0.3 + 0.7;
intermediate.material.opacity = Math.min(t * 2.5, 1.0) * flash;
intermediate.scale.setScalar(1.0 + 0.3 * Math.sin(t * Math.PI * 8));
product.material.opacity = Math.min(t * 0.8, 0.3);
break;
case 3:
substrate.position.lerpVectors(subNear, subFinal, Math.min(t * 1.6, 1));
intermediate.material.opacity = 0.7 * (1 – t);
product.material.opacity = 0.4 + 0.6 * t;
break;
}if (step === 3) { if (t > 0.8) product.material.opacity = 1.0; }catalystGroup.rotation.y += delta * 0.5;
catalystGroup.rotation.x = Math.sin(performance.now() / 3000) * 0.08;
const pulse = 1 + 0.04 * Math.sin(performance.now() / 400);
core.scale.set(pulse, pulse, pulse);orbs.forEach((orb, idx) => {
const time = performance.now() / 1000 + idx * 0.6;
const r = orb.radius + 0.2 * Math.sin(time * 0.7);
const angle = orb.angle + time * 0.5;
orb.mesh.position.x = Math.cos(angle + idx) * r;
orb.mesh.position.y = Math.sin(angle * 0.7 + idx) * 0.6;
orb.mesh.position.z = Math.sin(angle + idx * 0.5) * r * 0.8;
});const positions = particleSys.geometry.attributes.position.array;
for (let i = 0; i 5) positions[idx] = -5;
if (positions[idx] 2.2) positions[idx+1] = -0.3;
if (positions[idx+1] 4) positions[idx+2] = -3;
if (positions[idx+2] {
const w = container.clientWidth;
const h = container.clientHeight || (w * 0.555);
camera.aspect = w / h;
camera.updateProjectionMatrix();
renderer.setSize(w, h);
labelRenderer.setSize(w, h);
});
ro.observe(container);const submitQuiz = document.getElementById(‘submitQuizBtn’);
const quizResultDiv = document.getElementById(‘quizResult’);
const questions = document.querySelectorAll(‘.question’);
submitQuiz.addEventListener(‘click’, () => {
let score = 0;
let total = questions.length;
questions.forEach((q, idx) => {
const correctVal = q.dataset.correct;
const selected = q.querySelector(‘input[type=radio]:checked’);
const labels = q.querySelectorAll(‘.options label’);
const expDiv = q.querySelector(‘.explanation’);
labels.forEach(lbl => { lbl.classList.remove(‘correct’, ‘wrong’); });
if (selected) {
if (selected.value === correctVal) {
score++;
selected.parentElement.classList.add(‘correct’);
} else {
selected.parentElement.classList.add(‘wrong’);
}
}
labels.forEach(lbl => {
const inp = lbl.querySelector(‘input’);
if (inp) {
if (inp.value === correctVal) {
lbl.classList.add(‘correct’);
}
}
});
let expText = “”;
if (idx === 0) expText = “Acid‑catalysed hydrolysis of sucrose is homogeneous (all aqueous). Others are heterogeneous (solid catalyst).”;
else if (idx === 1) expText = “Catalysts provide an alternative pathway with lower activation energy, speeding up both forward and reverse reactions.”;
else if (idx === 2) expText = “In heterogeneous catalysis, the reaction occurs on the surface of the solid catalyst (adsorption, reaction, desorption).”;
else if (idx === 3) expText = “Catalysts do NOT change the equilibrium yield; they only speed up attainment of equilibrium.”;
else if (idx === 4) expText = “Finely divided nickel is the standard catalyst for hydrogenation of vegetable oils.”;
else if (idx === 5) expText = “Promoters (Al₂O₃, K₂O) are added to iron to increase its surface area and prevent sintering.”;
else if (idx === 6) expText = “Amylase is an enzyme that catalyses starch hydrolysis. Others are inorganic catalysts.”;
else if (idx === 7) expText = “Vanadium pentoxide (V₂O₅) or platinum is used in the Contact process for H₂SO₄.”;
expDiv.textContent = expText;
expDiv.style.display = ‘block’;
});
let percent = (score/total)*100;
let msg = `You scored ${score} out of ${total}. `;
if (percent >= 80) msg += “Excellent! You have a strong grasp of catalysis.”;
else if (percent >= 60) msg += “Good. Review the types and examples.”;
else msg += “Please re‑read the theory and examples carefully.”;
quizResultDiv.innerHTML = msg;
quizResultDiv.style.padding = “12px”;
quizResultDiv.style.background = “#e6f0f5”;
quizResultDiv.style.borderRadius = “20px”;
submitQuiz.textContent = “Retake Quiz”;
submitQuiz.onclick = () => location.reload();
});
Watch Complete Lecture in Urdu/Hindi for comprehensive understanding
Leave a Comment