JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://jsc3d.googlecode.com/svn/trunk/jsc3d/jsc3d.js"></script>
<canvas id="cv" height="200" width="300" style="border:1px solid #000;"></canvas>

JavaScript

var canvas, viewer, scene, groundPlane;

function onViewerMouseDown(x, y, button, depth, mesh) {
	viewer.buttonStates[button] = true;
	viewer.mouseX = x;
	viewer.mouseY = y;
}

function onViewerMouseUp(x, y, button, depth, mesh) {
	viewer.buttonStates[button] = false;
}

function onViewerMouseMove(x, y, button, depth, mesh) {
	var isDragging = viewer.buttonStates[0] == true;
	if (isDragging) {
		var rotY = (x - viewer.mouseX) * 360 / viewer.canvas.height;
		
        // original:
        // viewer.rotMatrix.rotateAboutYAxis(rotY);
        
        var rotMat = new JSC3D.Matrix3x4;
		rotMat.rotateAboutYAxis(rotY);
		viewer.rotMatrix.multiply(rotMat);
        
		viewer.mouseX = x;
		viewer.mouseY = y;
		viewer.update();
	}
}


canvas = document.getElementById('cv');
viewer = new JSC3D.Viewer(canvas);
viewer.setParameter('InitRotationX', 25);
viewer.setParameter('InitRotationY', 10);
viewer.setParameter('InitRotationZ', 5);
viewer.setParameter('Renderer', 'canvas');
viewer.init();
viewer.isDefaultInputHandlerEnabled = false;
viewer.onmousedown = onViewerMouseDown;
viewer.onmouseup = onViewerMouseUp;
viewer.onmousemove = onViewerMouseMove;
scene = viewer.getScene();
scene = new JSC3D.Scene;
scene.init();
scene.aabb = new JSC3D.AABB();
scene.aabb.maxX = 50;
scene.aabb.maxY = 200;
scene.aabb.maxZ = 50;
scene.aabb.minX = -50;
scene.aabb.minY = 0;
scene.aabb.minZ = -50;
makeGroundPlane(scene, 0x0000ff);
viewer.replaceScene(scene);
scene = viewer.getScene();
scene.calcAABB();
viewer.update();


function makeGroundPlane(scene, color) {
	var sceneBox = scene.aabb;
	var planeCenter = sceneBox.center();
	var planeHalfSize = 0.5 * Math.max(sceneBox.maxX - sceneBox.minX, sceneBox.maxZ - sceneBox.minZ);
	var planeMinX = planeCenter[0] - planeHalfSize;
	var planeMinZ = planeCenter[2] - planeHalfSize;
	var planeY = sceneBox.minY - 0.01 * (sceneBox.maxY - sceneBox.minY);
	var numOfGridsPerDimension = 10;
	var sizePerGrid = 2 * planeHalfSize / numOfGridsPerDimension;

	groundPlane =...