模型对象、材质

时游大约 2 分钟

模型对象、材质

三维向量 Vector3 与模型位置、缩放属性、向量归一化

点模型 Points、线模型 Line、网格模型 Mesh 等模型对象的父类都是 Object3D。

三维向量 Vector3:Vector3(x,y,z):x 轴、y 轴、z 轴

import * as THREE from "three";

const geometry = new THREE.BoxGeometry(50, 50, 50);
const meterial = new THREE.MeshBasicMaterial({
	color: 0x00ff00,
	transparent: true,
	opacity: 0.5,
});
const mesh = new THREE.Mesh(geometry, meterial);

// 创建一个三维向量对象Vector3
const v3 = new THREE.Vector3(100, 100, 100);
console.log("v3.x:", v3.x);

// .set(x,y,z),重新设置x、y、z的值
v3.set(200, 200, 200);
console.log("v3.x:", v3.x);

// 修改mesh的position
mesh.position.set(100, 0, 0);

// 缩放
mesh.scale.set(2, 10, 2);

// 向量归一化:就是等比例缩放向量的xyz三个分量,缩放到向量长度.length()为1。
const v = new THREE.Vector3(3, 1, 1);
console.log("v.length:", v.length());
v.normalize();
console.log("v.x:", v.x);
console.log("v.length", v.length());

// 归一化计算
const dir = new THREE.Vector3(1, 1, 0);
const L = dir.length();
// 归一化:三个分量分别除以向量长度
dir.x = dir.x / L;
dir.y = dir.y / L;
dir.z = dir.z / L;
//Vector3(√2/2, √2/2, 0)   Vector3(0.707, 0.707, 0)
console.log("dir", dir);

// 将物体沿着某个特定轴线旋转
mesh.rotateOnAxis(new THREE.Vector3(1, 0, 0), Math.PI / 4);

export default mesh;

欧拉 Euler 与角度属性

模型的 rotation 属性和.quaternion 属性都是表示模型的角度状态,只是 rotation 属性为欧拉对象 Euler,quaternion 属性为四元数对象 Quaternion。

/* 创建一个欧拉对象 */
const eu = new THREE.Euler(0, Math.PI, 0);
eu.x = Math.PI / 4;
console.log("eu:", eu);
mesh.rotation.x = Math.PI / 4; // rotation是一个Eular对象
mesh.rotateX(Math.PI / 8); // 旋转

export default mesh;

模型材质颜色

.color 属性:设置材质颜色

/* 创建一个颜色对象 */
const color = new THREE.Color();
// 方法一
color.set(0xff0000); // 融合了所有颜色修改方法
// 方法二
color.r = 1;
color.g = 0;
color.b = 1;
console.log("color:", color);

// 修改mesh颜色
mesh.material.color.set(color);

// 颜色相关
mesh.material.color.setRGB(1, 0, 0);

// setStyle():使用前端方式
mesh.material.color.setStyle("#fff");

.copy()和.clone()

threejs 中很多对象都具有 copy()和 clone()方法,用于复制对象,类似于三维向量 Vector3、网格模型 Mesh、几何体、材质等。

克隆 clone()

复制一个和原对象一样的新对象

const v1 = new THREE.Vector3(1, 2, 3);
console.log("v1", v1);

const v2 = v1.clone();
console.log("v2", v2);


// 创建球1、球2
const boxGeometry = new THREE.BoxGeometry(10, 10, 10);
const boxMaterial = new THREE.MeshBasicMaterial({
    color: 0x00ff00
});

const box1 = new THREE.Mesh(boxGeometry, boxMaterial);
const box2 = box1.clone();  // 克隆获取的新模型和原来的模型共享材质和几何体

// 修改box1的位置,会影响box2。原因:box1和box2共用一个boxGeometry,针对box1.getmetry设置会直接改变公用的geometry
box1.geometry.translate(100, 0, 0)

export { box1, box2 };

复制 copy()

将一个对象属性的值赋给另一个对象

const v1 = new THREE.Vector3(1, 2, 3);
console.log("v1", v1);

const v2 = new THREE.Vector3(4, 5, 6);
v2.copy(v1);
console.log("v2", v2);
上次编辑于:
贡献者: minmengwei
Loading...