123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- let scene, camera, renderer, controls;
- let stats = initStats();
- let key = 'points', id = 'id';
- let verticalLineAry = [];
- let geoKeys = ['3d_point1', '3d_point2'];
- // n_panorama_line_3d = rx1
- /* 初始加载 */
- (function () {
- console.log("three start...");
- init();
- animate();
- console.log("three end...");
- })();
- /**
- * 初始化函数
- */
- function init() {
- initRenderer();
- initScene();
- initCamera();
- initLight();
- initControls();
- drawGeometry(rx1);
- findIntersectLine();
- }
- // function drawGeometry() {
- // findIntersectLine();
- // if (!panorama_line_3d) {
- // let geometry = new THREE.geometry
- // console.log('panorama_line_3d未定义, 请检查');
- // return;
- // }
- // let material = new THREE.LineBasicMaterial({
- // color: 'red'
- // })
- // let geometry = new THREE.Geometry();
- // // 第一层的面循环
- // for (let i = 0; i < panorama_line_3d.length; i++) {
- // let face = panorama_line_3d[i]['faceLine'];
- // let index = panorama_line_3d[i]['index'];
- // let curVerticalLine = []
- // // if (face.length < 4) {
- // // console.log('构成面的线段数小于4, 请检查');
- // // return;
- // // }
- // let sta = false; // 用于控制寻找相同点还是不同点
- // // 第二层面中的线循环
- // for (let j = 0; j < face.length; j++) {
- // if (!face[j][key] || face[j][key].length < 2) {
- // console.log('线段' + face[j][id] + '的点数据有误, 请检查');
- // return;
- // }
- // // 绘制第一条线段
- // if (j === 0) {
- // // 第一条线段, 先寻找不同点
- // let firstPoint = findPoint(face[j][key], face[j + 1][key], false);
- // findverticalLine(firstPoint).forEach((item) => {
- // index.indexOf(item) < 0 && curVerticalLine.indexOf(item) < 0 && curVerticalLine.push(item);
- // })
- // firstPoint && geometry.vertices.push(new THREE.Vector3(firstPoint[0], firstPoint[1], firstPoint[2]));
- // // 再寻找相同点
- // let secondPoint = findPoint(face[j][key], face[j + 1][key], true);
- // findverticalLine(secondPoint).forEach((item) => {
- // index.indexOf(item) < 0 && curVerticalLine.indexOf(item) < 0 && curVerticalLine.push(item);
- // })
- // secondPoint && geometry.vertices.push(new THREE.Vector3(secondPoint[0], secondPoint[1], secondPoint[2]));
- // } else if (j === face.length - 1) { // 最后一条线段, 寻找与第一条线段相交的点
- // let lastPoint = findPoint(face[j][key], face[0][key], true);
- // findverticalLine(lastPoint).forEach((item) => {
- // index.indexOf(item) < 0 && curVerticalLine.indexOf(item) < 0 && curVerticalLine.push(item);
- // })
- // lastPoint && geometry.vertices.push(new THREE.Vector3(lastPoint[0], lastPoint[1], lastPoint[2]));
- // } else { // 寻找与上一条线段相交的点
- // let point = findPoint(face[j][key], face[j + 1][key], true);
- // findverticalLine(point).forEach((item) => {
- // index.indexOf(item) < 0 && curVerticalLine.indexOf(item) < 0 && curVerticalLine.push(item);
- // })
- // point && geometry.vertices.push(new THREE.Vector3(point[0], point[1], point[2]));
- // }
- // }
- // panorama_line_3d[i].verticalLine.push(curVerticalLine);
- // }
- // let line = new THREE.Line(geometry, material);
- // scene.add(line);
- // }
- function drawGeometry(n_panorama_line_3d) {
-
- // if (!panorama_line_3d) {
- // console.log('panorama_line_3d未定义, 请检查');
- // return;
- // }
- if (scene.getObjectByName("3d_line")) {
- scene.remove(scene.getObjectByName("3d_line"));
- }
- let material = new THREE.LineBasicMaterial({
- color: 'red'
- })
- let line_model = new THREE.Object3D();
- // 第一层的面循环
- for (let i = 0; i < n_panorama_line_3d.length; i++) {
- let threeDLine = n_panorama_line_3d[i];
- let geometry = new THREE.Geometry();
- for (let j = 0; j < geoKeys.length; j++) {
- geometry.vertices.push(new THREE.Vector3(threeDLine[geoKeys[j]][0], threeDLine[geoKeys[j]][1], threeDLine[geoKeys[j]][2]))
- }
- let line = new THREE.Line(geometry, material);
- line_model.add(line);
- }
- line_model.name = '3d_line';
- scene.add(line_model);
- }
- /**
- *
- * @param {*} point
- */
- // function findverticalLine(point) {
- // let lineAry = [];
- // for (let i = 0; i < panorama_line_3d.length; i++) {
- // for (let j = 0; j < panorama_line_3d[i].length; j++) {
- // for (let k = 0; k < panorama_line_3d[i][j]['points'].length; k++) {
- // let o_point = panorama_line_3d[i][j]['points'][k];
- // if (arrayEquals(o_point, point)) {
- // lineAry.push(panorama_line_3d[i][j]['id']);
- // }
- // }
- // }
- // }
- // // console.log(lineAry);
- // return lineAry;
- // }
- /**
- * 初始化渲染器
- */
- function initRenderer() {
- renderer = new THREE.WebGLRenderer({
- antialias: true
- });
- renderer.setSize(window.innerWidth / 2, window.innerHeight);
- renderer.setClearColor("#ccc");
- renderer.shadowMap.enabled = true;
- let rightCav = document.getElementById('geo-cav');
- rightCav.appendChild(renderer.domElement);
- // canvas = renderer.domElement;
- }
- /**
- * 初始化场景
- */
- function initScene() {
- scene = new THREE.Scene();
- // initContents();
- }
- /**
- * 初始化相机
- */
- function initCamera() {
- camera = new THREE.PerspectiveCamera(
- 45,
- 0.5 * window.innerWidth / window.innerHeight,
- 1,
- 100
- );
- // camera = new THREE.OrthographicCamera(3 / - 2, 3 / 2, 3 / 2, 3 / - 2, 1, 1000);
- camera.position.set(15, -15, 8);
- camera.up.x = 0;
- camera.up.y = 0;
- camera.up.z = 1;
- camera.lookAt(new THREE.Vector3(0, 0, 0));
- }
- /**
- * 初始化灯光
- */
- function initLight() {
- let ambientLight = new THREE.AmbientLight(0x333333);
- let directionalLight = new THREE.DirectionalLight("#FFFAFA", 1);
- directionalLight.position.set(100, -200, 200);
- directionalLight.castShadow = true;
- scene.add(ambientLight);
- scene.add(directionalLight);
- }
- /**
- * 初始化控制器
- */
- function initControls() {
- // TODO: 3D状态下启动控制器
- controls = new THREE.OrbitControls(camera, renderer.domElement);
- }
- /**
- * 初始化性能插件
- */
- function initStats() {
- let stats = new Stats();
- stats.setMode(0);
- stats.domElement.style.position = "absolute";
- stats.domElement.style.left = "0";
- stats.domElement.style.top = "0";
- document.body.appendChild(stats.domElement);
- return stats;
- }
- /* 循环调用 */
- function animate() {
- requestAnimationFrame(animate);
- renderer.render(scene, camera);
- update();
- }
- /* 更新数据 */
- function update() {
- stats.update();
- controls.update();
- }
|