其他文件和之前一样,只在main.vue内进行改动
Vue three.js基础四大组件实现三维效果:Vue three.js基础四大组件实现三维效果(二)多个几何体 - 代码先锋网 (codeleading.com)
画圆柱步骤:
1.常规操作
创建场景,灯光,摄像机,渲染器
2.调用几何体画圆柱,设置参数
let geometry = new THREE.CylinderGeometry(0.5, 0.5, 1, 32);
参数分别为:顶部半径、底部半径、高度、圆周细分数
3.调用材质,设置颜色
let material = new THREE.MeshPhongMaterial({ color: 0x00ff00 });
材质 MeshBasicMaterial不受灯光影响
4.利用网格把几何体和材质结合起来
let cylinder = new THREE.Mesh(geometry, material);
网格
5.依次把3个画好,设置他们的位置,x:左右,y:上下
cylinder2.position.y = 1.1; cylinder3.position.y = -1.1;
6.将网格加到场景去
scren.add(cylinder);
scren.add(cylinder2);
scren.add(cylinder3);
贴图步骤:
为了给圆柱体添加纹理贴图,我们需要加载纹理图像,并将其应用到圆柱体的材质上。在这里,我将演示如何加载一张图片纹理,并将其应用到圆柱体上。首先,确保您有一张纹理图像,可以通过以下方式加载纹理图像:
1.在 src/assets
文件夹中创建一个名为 texture.jpg
的图片文件,并将您的纹理图像保存在其中。
2.先导入贴图import texture1 from "@/assets/texture1.jpg";
3.使用 three.js
提供的 TextureLoader
来加载纹理图像。
4.调用材质,把图片贴上去
let material = new THREE.MeshPhongMaterial({ map: new THREE.TextureLoader().load(texture1) });
<template>
<div id="three" style="height: 100%; width: 100%"></div>
</template>
<script>
import * as THREE from "three";
//引入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
// 导入贴图
import texture1 from "@/assets/texture1.jpg";
import texture2 from "@/assets/texture2.jpg";
import texture3 from "@/assets/texture3.jpg";
export default {
name: "HelloWorld",
data() {
return {};
},
mounted() {
this.qwe();
},
methods: {
qwe() {
const conter = document.getElementById("three"); // 容器元素
console.log(conter.clientWidth);
let scren = new THREE.Scene(); // 场景
//灯光
{
const color = 0xffffff;
const intensity = 1;
const light = new THREE.DirectionalLight(color, intensity);
light.position.set(2, 2, 2); //x,y,z
scren.add(light);
}
let camera = new THREE.PerspectiveCamera(
45,
conter.clientWidth / conter.clientHeight,
1,
1000
); //透视相机
let render = new THREE.WebGL1Renderer(); //渲染器
render.setClearColor("#f60");
render.setSize(conter.clientWidth, conter.clientHeight); //渲染器大小
conter.appendChild(render.domElement); //渲染结果加载到容器里面
let geometry = new THREE.CylinderGeometry(0.5, 0.5, 1, 32); //参数分别为:顶部半径、底部半径、高度、圆周细分数
let material = new THREE.MeshPhongMaterial({ map: new THREE.TextureLoader().load(texture1) }); //材质 MeshBasicMaterial不受灯光影响
let cylinder = new THREE.Mesh(geometry, material); //网格
let geometry2 = new THREE.CylinderGeometry(0.5, 0.5, 1, 32); //参数分别为:顶部半径、底部半径、高度、圆周细分数
let material2 = new THREE.MeshPhongMaterial({ map: new THREE.TextureLoader().load(texture2)}); //材质 MeshBasicMaterial不受灯光影响
let cylinder2 = new THREE.Mesh(geometry2, material2); //网格
let geometry3 = new THREE.CylinderGeometry(0.5, 0.5, 1, 32); //参数分别为:顶部半径、底部半径、高度、圆周细分数
let material3 = new THREE.MeshPhongMaterial({ map: new THREE.TextureLoader().load(texture3) }); //材质 MeshBasicMaterial不受灯光影响
let cylinder3 = new THREE.Mesh(geometry3, material3); //网格
cylinder2.position.y = 1.1;
cylinder3.position.y = -1.1;
scren.add(cylinder); //将网格加到场景去
scren.add(cylinder2);
scren.add(cylinder3);
camera.position.z = 10; //改变相机位置
// 创建轨道控制器
let controls = new OrbitControls(camera, render.domElement);
function renders() {
requestAnimationFrame(renders);
controls.update();// 更新轨道控制器
render.render(scren, camera);
}
renders();
},
},
};
</script>
运行结果: