Vastagság (T) 0.4
Bal egér: forgat  |  Jobb: pásztáz  |  Görgő: zoom
Three.js · Tananyag

3D Nyíl – lapos, sík lapokból
Extrudált nyílprofil, X+ irány

01Az alakzat leírása

A nyíl kizárólag sík lapokból áll — síkra fektethető és csúsztatható. Az alap nyílprofil a YZ-síkban van definiálva (7 sarokpont), majd ez Z irányban ki van tolva T vastagságra.

A nyíl X+ irányba mutat. A talp középpontja az origóban van (z = 0 és z = T között, y = 0 magasságban).

02Parametrikus egyenlet

A nyílprofil 7 sarokpontja az XY-síkban (z = 0 és z = T lapok):

Szár félmagasság: hs = H_SHAFT / 2 Hegy félmagasság: hh = H_HEAD / 2 P0 = (0, −hs) ← talp bal-alsó P1 = (L_SHAFT,−hs) ← szár-hegy határ alsó P2 = (L_SHAFT,−hh) ← hegy váll alsó P3 = (L_TOTAL, 0 ) ← hegycsúcs P4 = (L_SHAFT,+hh) ← hegy váll felső P5 = (L_SHAFT,+hs) ← szár-hegy határ felső P6 = (0, +hs) ← talp bal-felső Paraméterek: H_SHAFT = szár magassága = 0.6 H_HEAD = hegy magassága = 1.4 L_SHAFT = szár hossza = 2.5 L_TOTAL = teljes hossz = 3.7 T = vastagság (z) ← csúszkával
03Geometria felépítése

Az extrudált nyíl 3 lap-típusból áll:

P6 P0 P5 P1 P4 P2 P3 ELŐLAP HÁTLAP → X+ Z (T)
  • Előlap — a profil z = 0 síkban, 5 háromszögre bontva (fülháromszög triangulációval)
  • Hátlap — ugyanaz z = T síkban, fordított normálissal
  • Oldallapok — 7 téglalap (minden profil-él egy oldallap), mindegyik 2 háromszög

A profil triangulációja (fülháromszögek, CCW sorrendben):

Előlap (z=0, normális: −Z): [0] P0→P1→P6 (szár alsó téglalapja, bal fele) [1] P1→P5→P6 (szár alsó téglalapja, jobb fele) [2] P2→P4→P3 (hegy háromszöge) [3] P1→P2→P5 (szár-hegy összekötő alsó) [4] P2→P4→P5 (szár-hegy összekötő felső) Htlap (z=T, normális: +Z): fordított sorrend
// 7 profil-csúcs × 2 lap = 14 csúcs // + oldallapok: 7 él × 4 csúcs = 28 csúcs // (külön csúcsok a flat shading miatt!) const profile = [ [0, -hs], // P0 [L_SHAFT, -hs], // P1 [L_SHAFT, -hh], // P2 [L_TOTAL, 0], // P3 csúcspont [L_SHAFT, +hh], // P4 [L_SHAFT, +hs], // P5 [0, +hs], // P6 ];
04Flat Shading

Minden lapnak saját normálisa van — ez a flat shading feltétele. Ezért minden oldallaphoz külön 4 csúcsot veszünk fel (nem osztjuk meg a szomszéd lapokkal), így a normális minden csúcsnál az adott lap síkjára merőleges.

flatShading: true a MeshPhongMaterial-ban, és computeVertexNormals() helyett computeFaceNormals() + saját normális-buffer.

Fájl

Egyetlen önálló HTML fájl, offline is megnyitható.

⬇ Letöltés: arrow3d.html