123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- import * as THREE from "three";
- import TextLabel from "./object/TextLabel";
- import SimpleLabel from "./object/SimpleLabel";
- import ImgLabel from "./object/ImgLabel";
- import { LineMaterial } from "three/examples/jsm/lines/LineMaterial.js";
- export default class HorizontalBox extends THREE.Group {
- constructor(manager, data, index, total) {
- super();
- this.manager = manager;
- this.name = "horizontal_box";
- this.total = total;
- this.getStyle();
- this.load(data, index);
- }
- getStyle() {
- this.width = 2;
- this.height = (2 * 710) / 500;
- this.color = 0xffffff;
- }
- cover(texture, aspect) {
- var imageAspect = texture.image.width / texture.image.height;
- if (aspect < imageAspect) {
- texture.matrix.setUvTransform(0, 0, aspect / imageAspect, 1, 0, 0.5, 0.5);
- } else {
- texture.matrix.setUvTransform(0, 0, 1, imageAspect / aspect, 0, 0.5, 0.5);
- }
- }
- load(data, index) {
- //box
- const geometry = new THREE.PlaneGeometry(1, 1);
- geometry.rotateX(-Math.PI / 2);
- const bm = new THREE.MeshBasicMaterial({
- color: this.color,
- });
- const box = new THREE.Mesh(geometry, bm);
- box.scale.set(this.width, 1, this.height);
- this.add(box);
- this.position.x = (this.width + 0.125) * index - 1.8;
- const matLine = new LineMaterial({
- color: 0xe44d54,
- linewidth: 4, // in world units with size attenuation, pixels otherwise
- dashed: false,
- alphaToCoverage: true,
- });
- matLine.resolution = new THREE.Vector2(
- this.manager.scene.width,
- this.manager.scene.height
- );
- //content
- data.forEach((i, j) => {
- //img
- let img;
- this.manager.loader.load(i.imgUrl, (texture) => {
- let imgRatio = texture.image.width / texture.image.height;
- texture.matrixAutoUpdate = false;
- let planeRatio = 1.5 / 0.85;
- // let ratio = planeRatio / imgRatio;
- texture.matrixAutoUpdate = false;
- if (planeRatio < imgRatio) {
- texture.matrix.setUvTransform(
- 0,
- 0,
- planeRatio / imgRatio,
- 1,
- 0,
- 0.5,
- 0.5
- );
- } else {
- texture.matrix.setUvTransform(
- 0,
- 0,
- 1,
- imgRatio / planeRatio,
- 0,
- 0.5,
- 0.5
- );
- }
- // texture.wrapS = THREE.RepeatWrapping;
- // texture.wrapS = THREE.RepeatWrapping;
- // texture.wrapT = THREE.ClampToEdgeWrapping;
- // texture.repeat.x = ratio;
- // texture.offset.x = 0.5 * (1 - ratio);
- // console.log("texture", texture);
- texture.colorSpace = THREE.SRGBColorSpace;
- img = new ImgLabel(texture, matLine);
- img.userData = i.id;
- img.position.y += 1;
- if (j === 0) {
- img.position.z -= 0.8;
- } else {
- img.position.z += 0.43;
- }
- this.add(img);
- this.manager.imgList.push(img);
- const textlabel = new TextLabel(i.imgInfo, true);
- this.add(textlabel);
- textlabel.position.copy(img.position);
- textlabel.position.z += textlabel.scale.z * 0.5 + 0.1;
- });
- });
- //页脚
- const f_txt_label = ` 第 ${index + 1} 页 共 ${this.total} 页`;
- const footlabel = new SimpleLabel(f_txt_label, true);
- footlabel.renderOrder = 100;
- footlabel.position.z += 1.26;
- this.add(footlabel);
- }
- }
|