three.cad/src/index.js

182 lines
5.2 KiB
JavaScript
Raw Normal View History

2021-03-21 03:08:15 +08:00
// class MinMaxGUIHelper {
// constructor(obj, minProp, maxProp, minDif) {
// this.obj = obj;
// this.minProp = minProp;
// this.maxProp = maxProp;
// this.minDif = minDif;
// }
// get min() {
// return this.obj[this.minProp];
// }
// set min(v) {
// this.obj[this.minProp] = v;
// this.obj[this.maxProp] = Math.max(this.obj[this.maxProp], v + this.minDif);
// }
// get max() {
// return this.obj[this.maxProp];
// }
// set max(v) {
// this.obj[this.maxProp] = v;
// this.min = this.min; // this will call the min setter
// }
// }
// const gui = new GUI();
// gui.add(camera, 'zoom', 0.01, 1, 0.01).listen();
// const minMaxGUIHelper = new MinMaxGUIHelper(camera, 'near', 'far', 0.1);
// gui.add(minMaxGUIHelper, 'min', 0.1, 50, 0.1).name('near');
// gui.add(minMaxGUIHelper, 'max', 0.1, 50, 0.1).name('far');
import * as THREE from '../node_modules/three/src/Three';
import { OrbitControls } from './OrbitControls'
import { TrackballControls } from './trackball'
import { Sketcher } from './Sketcher'
import GUI from '../node_modules/dat.gui/src/dat/gui/GUI.js'
import Stats from '../node_modules/three/examples/jsm/libs/stats.module.js';
import { KeyboardController } from './utils'
function main() {
const Controller = new KeyboardController()
var stats = new Stats();
stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom
document.body.appendChild(stats.dom);
const canvas = document.querySelector('#c');
const view1Elem = document.querySelector('#view1');
const view2Elem = document.querySelector('#view2');
const renderer = new THREE.WebGLRenderer({ canvas });
const scene = new THREE.Scene();
window.scene = scene;
scene.background = new THREE.Color('pink');
const helpersGroup = new THREE.Group();
scene.add(helpersGroup);
const size = 1;
const near = 5;
const far = 50;
const camera = new THREE.OrthographicCamera(-size, size, size, -size, near, far);
camera.zoom = 0.1;
camera.position.set(0, 0, 20);
const controls = new OrbitControls(camera, view1Elem);
// const controls = new TrackballControls(camera, view1Elem);
controls.target.set(0, 0, 0);
controls.update()
const cameraHelper = new THREE.CameraHelper(camera);
helpersGroup.add(cameraHelper);
2021-03-23 11:55:44 +08:00
// const camera2 = new THREE.PerspectiveCamera(
// 60, // fov
// 2, // aspect
// 0.1, // near
// 500, // far
// );
// camera2.position.set(16, 28, 40);
// camera2.lookAt(0, 5, 0);
// const controls2 = new OrbitControls(camera2, view2Elem);
// controls2.target.set(0, 5, 0);
// controls2.update();
2021-03-21 03:08:15 +08:00
const axesHelper = new THREE.AxesHelper(5);
helpersGroup.add(axesHelper);
const sketchPlane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0);
const sketcher = new Sketcher(camera, view1Elem, sketchPlane)
scene.add(sketcher)
{
const color = 0xFFFFFF;
const intensity = 1;
const light = new THREE.DirectionalLight(color, intensity);
light.position.set(0, 10, 0);
light.target.position.set(-5, 0, 0);
scene.add(light);
scene.add(light.target);
}
function resizeRendererToDisplaySize(renderer) {
const canvas = renderer.domElement;
const width = canvas.clientWidth;
const height = canvas.clientHeight;
const needResize = canvas.width !== width || canvas.height !== height;
if (needResize) {
renderer.setSize(width, height, false);
}
return needResize;
}
function setScissorForElement(elem) {
const canvasRect = canvas.getBoundingClientRect();
const elemRect = elem.getBoundingClientRect();
// compute a canvas relative rectangle
const right = Math.min(elemRect.right, canvasRect.right) - canvasRect.left;
const left = Math.max(0, elemRect.left - canvasRect.left);
const bottom = Math.min(elemRect.bottom, canvasRect.bottom) - canvasRect.top;
const top = Math.max(0, elemRect.top - canvasRect.top);
const width = Math.min(canvasRect.width, right - left);
const height = Math.min(canvasRect.height, bottom - top);
// setup the scissor to only render to that part of the canvas
const positiveYUpBottom = canvasRect.height - bottom;
renderer.setScissor(left, positiveYUpBottom, width, height);
renderer.setViewport(left, positiveYUpBottom, width, height);
// return the aspect
return width / height;
}
function render() {
stats.begin();
resizeRendererToDisplaySize(renderer);
renderer.setScissorTest(true);
{
const aspect = setScissorForElement(view1Elem);
camera.left = -aspect;
camera.right = aspect;
camera.updateProjectionMatrix();
cameraHelper.update();
cameraHelper.visible = false;
renderer.render(scene, camera);
}
2021-03-23 11:55:44 +08:00
// {
// const aspect = setScissorForElement(view2Elem);
// camera2.aspect = aspect;
// camera2.updateProjectionMatrix();
// cameraHelper.visible = true;
// renderer.render(scene, camera2);
// }
2021-03-21 03:08:15 +08:00
stats.end();
// requestAnimationFrame(render);
}
// requestAnimationFrame(render);
controls.addEventListener('change', render);
controls.addEventListener('start', render);
2021-03-23 11:55:44 +08:00
// controls2.addEventListener('change', render);
2021-03-21 03:08:15 +08:00
sketcher.addEventListener('change', render);
window.addEventListener('resize', render);
render();
}
main();