Split the geometry into groups, each of which will be rendered in a separate WebGL draw call. This allows an array of materials to be used with the bufferGeometry.
const geometry = new THREE.TetrahedronGeometry();
for (let i = 0; i < 4; ++i) {
geometry.addGroup(
i * 3, //start : Integer, 從第幾個點開始
3, //count : Integer, 每 3 個點為一組
i //materialIndex : Integer, 使用第幾個 material
);
}
//材質
const materials = [
new THREE.MeshPhysicalMaterial({ color: 0xff0000 }),
new THREE.MeshPhysicalMaterial({ color: 0x00ff00 }),
new THREE.MeshPhysicalMaterial({ color: 0x0000ff }),
new THREE.MeshPhysicalMaterial({ color: 0xffff00 }),
];
// .Mesh 的第二個參數可以是陣列,geometry 需要用 addGroup 分群
const tetrahedron = new THREE.Mesh(geometry, materials);
scene.add(tetrahedron);
nice try :D
但我記得這樣做還是會有個問題, 就是材質會出現拉伸跟鏡射的狀況
主要是因為three.js 的tetra geo 的頂點似乎不止四個, 實際console geometry.attribute.position.array出來發現有出來發現座標有12 組, 也就是長度36 的陣列
(下列這行是錯誤的描述, 20220329更正)如果單純的用for loop去 iterate, 會出現頂點抓錯的狀況
我後來也有在stackoverflow 上面提問, 有個外國人是有提到這種的可能要自己定義模型
後來自己又嘗試了一下, 用內建的tetra, 需要自己再重新定義 uv array一次, 如果不重新定義uv, 那材質就會出現拉伸/鏡射的問題
我有把我自己定義tetra uv的作法寫在上面提到的stackoverflow 問題上面, 實際參考文獻可以看
https://www.twblogs.net/a/5eef515933cbe858769e6bd4
謝謝提供那麼多資訊,我再看一下
謝謝分享,我稍微整理一下:
對, 我前面回的"會出現頂點抓錯的狀況"其實是寫錯了, 正確應該是頂點並沒有抓錯, 但是uv跟使用者預想的不一樣
我猜原因有可能是因為內建的Tetra 本身是從Cylinder(或什麼別的東西) 演化過來的
我看了一下原始碼 TetrahedronGeometry 實際上是一個 PolyhedronGeometry
PolyhedronGeometry 預設的貼圖方式,可以想像成:
我昨天看到這題也有興趣查了很久...
結果繪了個四不像的東西XD
/*
* Add Object
*/
const geometry = new THREE.TetrahedronGeometry(2, 0)
const position = geometry.attributes.position.clone();
const material = new THREE.MeshBasicMaterial({
vertexColors: THREE.FaceColors,
});
const colors = [];
const color = new THREE.Color();
for ( let i = 0; i < position.count; i ++ ) {
const z = Math.random() * 0.2;
position.setZ( i, z );
const s = z * 5; // values in the range [0,1]
color.setHSL( s, s, s );
colors.push( color.r, color.g, color.b );
}
geometry.addAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) );
const tetrahedron = new THREE.Mesh(geometry, material)
scene.add(tetrahedron)
沒想到解法是像 淺水員 回答的這麼簡單