import * as THREE from "three";
|
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
|
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader";
|
|
import { OBJLoader } from "three/addons/loaders/OBJLoader.js";
|
import { MTLLoader } from "three/addons/loaders/MTLLoader.js";
|
|
const mapThree = {
|
scene: null,
|
camera: null,
|
mesh: null,
|
renderer: null,
|
object: null,
|
mixer: null,
|
clock: null,
|
speed: 0,
|
LoopId: null,
|
init() {
|
// 创建场景
|
this.setSceneCreate();
|
},
|
setModelStart() {
|
this.speed = 0.2;
|
this.animate();
|
},
|
setModelClosed() {
|
if (mapThree.LoopId) {
|
cancelAnimationFrame(mapThree.LoopId);
|
mapThree.LoopId = null;
|
|
}
|
},
|
setModeladdSpeed() {
|
mapThree.speed += 0.2;
|
mapThree.speed = mapThree.speed > 1 ? 1 : mapThree.speed;
|
|
},
|
setModeldelSpeed() {
|
mapThree.speed -= 0.2;
|
mapThree.speed = mapThree.speed < 0.2 ? 0.2 : mapThree.speed;
|
|
},
|
setModelreFreash() {
|
this.speed = 0;
|
this.animate();
|
},
|
setSceneCreate() {
|
const threeBox = document.getElementById("threeBox");
|
const width = threeBox.offsetWidth;
|
const height = threeBox.offsetHeight;
|
// 创建场景
|
this.scene = new THREE.Scene();
|
// AxesHelper:辅助观察的坐标系
|
// const axesHelper = new THREE.AxesHelper(200);
|
// this.scene.add(axesHelper);
|
// 创建相机
|
this.camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 10000);
|
// 根据需要设置相机位置具体值
|
this.camera.position.set(0.5, 0.5, 0.5);
|
this.camera.lookAt(0, 0, 0);
|
this.scene.add(this.camera);
|
// 添加光源
|
const ambientLight = new THREE.AmbientLight(0xffffff, 0.4);
|
this.scene.add(ambientLight);
|
|
const pointLight = new THREE.PointLight(0xffffff, 0.8);
|
|
this.camera.add(pointLight);
|
|
const ambientLight1 = new THREE.HemisphereLight("#Ffffff", "#000000", 1);
|
this.scene.add(ambientLight1);
|
|
// 创建渲染器
|
this.renderer = new THREE.WebGLRenderer({ antialias: false });
|
|
this.renderer.setClearColor("rgb(248,248,255)", 1.0);
|
|
this.renderer.setSize(width, height);
|
|
threeBox.appendChild(this.renderer.domElement);
|
|
this.clock = new THREE.Clock();
|
this.addOrbitControls();
|
this.addObjModel();
|
//监听点击事件
|
const that = this;
|
window.addEventListener("click", (event) => {
|
event.preventDefault();
|
|
var raycaster = new THREE.Raycaster();
|
|
var mouse = new THREE.Vector2();
|
|
mouse.x = (event.clientX / that.renderer.domElement.clientWidth) * 2 - 1;
|
|
mouse.y =
|
-(event.clientY / that.renderer.domElement.clientHeight) * 2 + 1;
|
|
raycaster.setFromCamera(mouse, that.camera);
|
|
var intersects = raycaster.intersectObjects(that.scene.children, true);
|
|
//当intersects.length > 0说明碰点击到物体(可能为多个重合的物体),获取最近的物体名称进行判断
|
|
if (intersects.length > 0) {
|
// console.log(intersects);
|
}
|
});
|
},
|
addObjModel() {
|
var that = this;
|
var mtlLoader = new MTLLoader();
|
mtlLoader.load("http://localhost:5173/data/电机/电机.mtl", (material) => {
|
material.preload();
|
var objLoader = new OBJLoader();
|
//设置当前加载的纹理
|
objLoader
|
.setMaterials(material)
|
.load("http://localhost:5173/data/电机/电机.obj", (item) => {
|
item.position.set(0, 0, 0);
|
//
|
//
|
item.traverse(function (obj) {
|
if (obj.isMesh) {
|
obj.castShadow = true; //阴影
|
obj.receiveShadow = true; //接受别人投的阴影
|
}
|
});
|
|
that.scene.add(item);
|
that.object = item;
|
that.setRender();
|
});
|
});
|
},
|
animate() {
|
mapThree.LoopId = requestAnimationFrame(mapThree.animate);
|
mapThree.setModelChange();
|
mapThree.renderer.render(mapThree.scene, mapThree.camera);
|
},
|
setModelChange() {
|
if (mapThree.object) {
|
mapThree.object.traverse((obj) => {
|
if (obj.isMesh && obj.name == "dj_01") {
|
let center = new THREE.Vector3();
|
obj.geometry.computeBoundingBox();
|
obj.geometry.boundingBox.getCenter(center);
|
let x = center.x;
|
let y = center.y;
|
let z = center.z;
|
// 把对象放到坐标原点
|
obj.geometry.center();
|
// 绕轴旋转
|
obj.geometry.rotateZ(mapThree.speed);
|
// 再把对象放回原来的地方
|
obj.geometry.translate(x, y, z);
|
}
|
});
|
}
|
},
|
|
setRender() {
|
this.renderer.render(this.scene, this.camera);
|
},
|
addFBXModel() {
|
var that = this;
|
var fbxLoader = new FBXLoader();
|
|
var url = "http://localhost:5173/data/电机/电机.obj";
|
|
fbxLoader.load(url, (object) => {
|
//模型设置位置
|
object.position.set(0, 0, 0);
|
//模型大小
|
object.scale.multiplyScalar(0.5);
|
object.traverse((child) => {
|
if (child.isMesh) {
|
// console.log(child);
|
// 定制材质颜色
|
child.material.color.set(0x00ffff); // 红色
|
}
|
});
|
that.scene.add(object);
|
that.renderer.render(that.scene, that.camera);
|
});
|
},
|
addGeometry() {
|
// 模型形状
|
const geometry = new THREE.BoxGeometry(50, 50, 50);
|
// 模型材质
|
const material = new THREE.MeshBasicMaterial({
|
color: 0x00ffff, //16进制颜色
|
transparent: true, //允许透明
|
opacity: 0.5 //透明度
|
});
|
//创建一个网格模型
|
this.mesh = new THREE.Mesh(geometry, material);
|
//网格模型设置位置
|
this.mesh.position.set(10, 10, 10);
|
// 场景添加模型
|
this.scene.add(this.mesh);
|
this.camera.lookAt(this.mesh.position);
|
this.renderer.render(this.scene, this.camera);
|
},
|
addOrbitControls() {
|
// 设置相机控件轨道控制器OrbitControls
|
const controls = new OrbitControls(this.camera, this.renderer.domElement);
|
// 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景
|
const that = this;
|
controls.addEventListener("change", function () {
|
that.setRender();
|
}); //监听鼠标、键盘事件
|
}
|
};
|
export default mapThree;
|