当前位置: 首页 > news >正文

threejs小案例——贴图翻转

简要说明:

该小案例,主要做的是对长方体6个面进行贴图,以及贴图的方向进行调整;

贴图图片:

1、不加旋转的贴图效果:

整体效果

代码运行的整体效果;

完整代码(可运行):

// 引入threejs
import * as THREE from "three";
// 引入轨道控制器扩展库
import { OrbitControls } from "three/addons/controls/OrbitControls.js";const scene = new THREE.Scene();
// 定义变量
const width = 1167;   // 画布大小
const height = 737;
const bigBox = {len: 822,W: 482,H: 86,
};
const smallBox = {len: 150,W: 50,H: 80,
};
// 外面大盒子
const geometry = new THREE.BoxGeometry(bigBox.len, bigBox.H, bigBox.W); // 形状
const meterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 材质
meterial.transparent = true;
meterial.opacity = 0.5;const mesh = new THREE.Mesh(geometry, meterial);
scene.add(mesh);
// 线框
borderLine(geometry, mesh)// 里面小盒子
const smallGeometry = new THREE.BoxGeometry(smallBox.W,smallBox.H,smallBox.len
);const textureLoader = new THREE.TextureLoader()let smallMaterial = []
// 顺序不可乱:右左、上下、前后
let arr = ['../../src/direction_image/right.jpg', '../../src/direction_image/left.jpg', '../../src/direction_image/top.jpg','../../src/direction_image/bottom.jpg', '../../src/direction_image/front.jpg', '../../src/direction_image/back.jpg']// 加载所有纹理并创建材质
Promise.all(arr.map(url => {return new Promise((resolve, reject) => {const texture = textureLoader.load(url, () => resolve(texture), error => reject(error));});
})).then((textures) => {// 对顶部和底部纹理进行特殊处理// const topTexture = textures[2]; // 顶部纹理// topTexture.rotation = Math.PI; // 旋转180度// topTexture.center.set(0.5, 0.5); // 设置旋转中心smallMaterial = textures.map((texture, index) => {// if (index === 2) {//     return new THREE.MeshBasicMaterial({//         map: texture,//         side: THREE.DoubleSide//     });// }return new THREE.MeshBasicMaterial({ map: texture });})const smallMesh = new THREE.Mesh(smallGeometry, smallMaterial);smallMesh.position.set(0, -(bigBox.H - smallBox.H - 2) / 2, 0)scene.add(smallMesh);borderLine(smallGeometry, smallMaterial)// 显示坐标轴const axesHelper = new THREE.AxesHelper(500);scene.add(axesHelper);const camera = new THREE.PerspectiveCamera(30, width / height, 0.1, 2000);// 创建渲染器对象const renderer = new THREE.WebGLRenderer();// 相机CameraFn(renderer,camera)// 设置相机空间轨道控制器const controls = new OrbitControls(camera, renderer.domElement);controls.addEventListener("change", function () {renderer.render(scene, camera);});
})function CameraFn(renderer,camera){camera.position.set(-1000, 800, 800); // 设置相机位置camera.lookAt(0, 10, 0);renderer.setSize(width, height);renderer.render(scene, camera);document.body.appendChild(renderer.domElement);
}// 各部件外框线
function borderLine(BoxGeometry, Mesh, color = 0xffffff) {let edgesGeometry = new THREE.EdgesGeometry(BoxGeometry)let edgesMaterial = new THREE.LineBasicMaterial({color: color,linewidth: 2})let line = new THREE.LineSegments(edgesGeometry, edgesMaterial)scene.add(line)
}

2、对贴图添加旋转

需求:要求左图和有图,图片上的箭头均指向后方;

目前的左图、右图如下所示:

目前的效果(不加旋转):

修改后的(添加旋转):

修改的核心代码:

完整代码(可运行):

// 引入threejs
import * as THREE from "three";
// 引入轨道控制器扩展库
import { OrbitControls } from "three/addons/controls/OrbitControls.js";const scene = new THREE.Scene();
// 定义变量
const width = 1167;   // 画布大小
const height = 737;
const bigBox = {len: 822,W: 482,H: 86,
};
const smallBox = {len: 150,W: 50,H: 80,
};
// 外面大盒子
const geometry = new THREE.BoxGeometry(bigBox.len, bigBox.H, bigBox.W); // 形状
const meterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 材质
meterial.transparent = true;
meterial.opacity = 0.5;const mesh = new THREE.Mesh(geometry, meterial);
scene.add(mesh);
// 线框
borderLine(geometry, mesh)// 里面小盒子
const smallGeometry = new THREE.BoxGeometry(smallBox.W,smallBox.H,smallBox.len
);const textureLoader = new THREE.TextureLoader()let smallMaterial = []
// 顺序不可乱:右左、上下、前后
let arr = ['../../src/direction_image/right.jpg', '../../src/direction_image/left.jpg', '../../src/direction_image/top.jpg','../../src/direction_image/bottom.jpg', '../../src/direction_image/front.jpg', '../../src/direction_image/back.jpg']// 加载所有纹理并创建材质
Promise.all(arr.map(url => {return new Promise((resolve, reject) => {const texture = textureLoader.load(url, () => resolve(texture), error => reject(error));});
})).then((textures) => {// 对顶部和底部纹理进行特殊处理const topTexture = textures[0]; // 顶部纹理topTexture.rotation = Math.PI; // 旋转180度topTexture.center.set(0.5, 0.5); // 设置旋转中心smallMaterial = textures.map((texture, index) => {if (index === 0) {return new THREE.MeshBasicMaterial({map: texture,side: THREE.DoubleSide});}   return new THREE.MeshBasicMaterial({ map: texture });})const smallMesh = new THREE.Mesh(smallGeometry, smallMaterial);smallMesh.position.set(0, -(bigBox.H - smallBox.H - 2) / 2, 0)scene.add(smallMesh);borderLine(smallGeometry, smallMaterial)// 显示坐标轴const axesHelper = new THREE.AxesHelper(500);scene.add(axesHelper);const camera = new THREE.PerspectiveCamera(30, width / height, 0.1, 2000);// 创建渲染器对象const renderer = new THREE.WebGLRenderer();// 相机CameraFn(renderer,camera)// 设置相机空间轨道控制器const controls = new OrbitControls(camera, renderer.domElement);controls.addEventListener("change", function () {renderer.render(scene, camera);});
})function CameraFn(renderer,camera){camera.position.set(-1000, 800, 800); // 设置相机位置camera.lookAt(0, 10, 0);renderer.setSize(width, height);renderer.render(scene, camera);document.body.appendChild(renderer.domElement);
}// 各部件外框线
function borderLine(BoxGeometry, Mesh, color = 0xffffff) {let edgesGeometry = new THREE.EdgesGeometry(BoxGeometry)let edgesMaterial = new THREE.LineBasicMaterial({color: color,linewidth: 2})let line = new THREE.LineSegments(edgesGeometry, edgesMaterial)scene.add(line)
}

 

相关文章:

  • 华为云Flexus+DeepSeek征文|SpringBoot开发实战:基于ModelArts Studio高效集成DeepSeek大模型服务
  • 归并排序:分治思想的优雅实现
  • 后端框架(1):Mybatis
  • 在 C# 中将 DataGridView 数据导出为 CSV
  • ROS资料推荐学习
  • xss-labs靶场第11-14关基础详解
  • Microsoft Azure 服务4月更新告示
  • handsome主题美化及优化:10.1.0最新版 - 1
  • 网站运维基础 | 2. cms介绍及wordpress的搭建
  • 大模型——Crawl4AI使用JsonCssExtractionStrategy进行结构化数据提取
  • 真题卷001——算法备赛
  • PCIeSwitch 学习
  • MySQL的触发器
  • 本土DevOps革命:Gitee如何撬动中国企业的数字化转型新动能
  • 哈希表的实现02
  • 【C++/Qt shared_ptr 与 线程池】合作使用案例
  • 非受控组件在React中的使用场景有哪些?
  • node.js文件系统(fs) - 创建文件、打开文件、写入数据、追加数据、读取数据、创建目录、删除目录
  • 【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
  • 操作系统|| 虚拟内存页置换算法
  • 学者三年实地调查被判AI代笔,论文AI率检测如何避免“误伤”
  • 流失79载,国宝文物“子弹库帛书”(二、三卷)回归祖国
  • 上海国际珠宝时尚功能区未来三年如何建设?六大行动将开展
  • 广西:坚决拥护党中央对蓝天立进行审查调查的决定
  • 刘国中将出席第78届世界卫生大会并顺访瑞士、访问白俄罗斯
  • 温州通报“一母亲殴打女儿致其死亡”:嫌犯已被刑拘