2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
編輯:金字塔是一個(gè)有 4 個(gè)徑向段的圓錐體,如果需要,請(qǐng)查看 arrowhelper 如何根據(jù)參數(shù)構(gòu)造它的圓錐體(帶有錐形 CylinderGeometry)和線(xiàn),并將其替換為構(gòu)造如下的圓錐體幾何體:
原來(lái)的:
_coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );
新的:
_coneGeometry = new ConeBufferGeometry( 0.5, 1, 4);
然后您不必使用 EdgesGeometry,而是使用線(xiàn)框材質(zhì)選項(xiàng)(根據(jù) @prisoner849 的評(píng)論):
let wireframeMaterial = new THREE.MeshBasicMaterial({color: "aqua", wireframe: true}); let coneEdgeMesh = new THREE.Mesh(_coneGeometry, wireframeMaterial);
原答案:
THREE.ArrowHelper 由 2 個(gè) Object3D 組成:一個(gè) THREE.Line 用于直線(xiàn),另一個(gè) THREE.Mesh 用于箭頭的圓錐體。Line 幾何圖形僅包含 2 個(gè)點(diǎn)并且沒(méi)有邊,因?yàn)樗且粭l線(xiàn),但對(duì)于圓錐體,您可以使用:
let coneEdgeGeometry = new THREE.EdgesGeometry(arrow.cone.geometry);
然后你用你想要的邊幾何和顏色構(gòu)造一個(gè) LineSegments 對(duì)象:
let line = new THREE.LineSegments( coneEdgeGeometry, new THREE.LineBasicMaterial( { color: 0xffffff } ) ); arrow.add(line);
如果錐體邊緣未顯示,請(qǐng)嘗試將 THREE.LineSegments 的 renderOrder 設(shè)置為 -1(這可能會(huì)產(chǎn)生其他問(wèn)題)

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以像這樣更改箭頭錐體的顏色:
body {
overflow: hidden;
margin: 0;
}
<script type="module">
import * as THREE from "https://threejs.org/build/three.module.js";
import {OrbitControls} from "https://threejs.org/examples/jsm/controls/OrbitControls.js";
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera(60, innerWidth / innerHeight,
1, 100);
camera.position.set(0, 5, 10);
let renderer = new THREE.WebGLRenderer();
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);
new OrbitControls(camera, renderer.domElement);
scene.add(new THREE.GridHelper());
// different colors
let ah = new THREE.ArrowHelper(
new THREE.Vector3(0, 1, 0),
new THREE.Vector3(-4, 0, 0),
5,
"magenta" /* default colour */);
ah.cone.material.color.set("red"); // change color of cone
scene.add(ah);
// colourful pyramid
let cg = new THREE.SphereBufferGeometry(0.5, 4, 2).toNonIndexed();
let pos = cg.attributes.position;
for (let i = 0; i < pos.count; i++){
if (pos.getY(i) < 0) pos.setY(i, 0);
}
console.log(cg);
let cls = [
new THREE.Color("red"),
new THREE.Color("green"),
new THREE.Color("blue"),
new THREE.Color("yellow")
]
let colors = [];
for(let i = 0; i < 2; i++){
cls.forEach( (c) => {
colors.push(c.r, c.g, c.b);
colors.push(c.r, c.g, c.b);
colors.push(c.r, c.g, c.b);
});
}
cg.setAttribute("color", new THREE.Float32BufferAttribute(colors, 3));
let cm = new THREE.MeshBasicMaterial({vertexColors: true});
let co = new THREE.Mesh(cg, cm);
co.scale.set(1, 5, 1);
scene.add(co);
renderer.setAnimationLoop(()=>{
renderer.render(scene, camera);
});
</script>
展開(kāi)片段
添加回答
舉報(bào)