本博文主要記錄如何使用three.js繪制物體的邊框及修改其lineWidth。three.js是個技術點比較多,查詢資料又比較少的框架,單單就這個修改lineWidth就是一個坑。先放一個動態的效果圖,需要的小伙伴可以看下相關實現。
開始的時候,我是使用LineSegments來實現的,線的材質使用LineBasicMaterial,但是發現無論linewidth設置多少,呈現出來的都是1
因此修改實現方式,這里直接可看懂的代碼:
// 引入新的線的材質類
import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js';
import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js';
import { Line2 } from 'three/examples/jsm/lines/Line2.js';
// 設置邊框
const edgesGeometry = new LineGeometry();
const pointArr = this.getLinePoint(points);
const lineMaterial = new LineMaterial({
color: 0xdd2222,
linewidth: 2, // 這里表示線的寬度
transparent: true
});
edgesGeometry.setPositions(pointArr);
lineMaterial.resolution.set(window.innerWidth, window.innerHeight);
這里的重點在於pointArr
的值,其實就是線的連線的頂點坐標,我這里的demo是個立方體,因此是按立方體的8個點,把立方體的12條線連接其來:
// 獲取邊框的點連線數據
getLinePoint(points): Array<any> {
// 立方體的8個頂點坐標
let [p0, p1, p2, p3, p4, p5, p6, p7] = points;
//順着點 保證12條線都連上即可
let pointLine = [
p0, p1, p2, p3, p0,
p4, p5, p6, p7, p4,
p4, p7, p3, p2, p6, p5, p1
];
let arr = [];
pointLine.forEach(item => {
arr.push(item.x)
arr.push(item.y)
arr.push(item.z)
})
return arr;
}
我覺得學習3d的這個框架只能邊查閱資料,邊嘗試,這個也是我們第一次學着用,把使用過程中遇到的坑記錄下來,便於查閱。