mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-24 06:14:01 +08:00
- Compile mesh, line, and point picking with perspective and orthographic camera rays. - Preserve JavaScript override arguments, array identity, and native subclass values across checked calls. - Specialize package class helpers and handle unsupported JSDoc namepaths.
50 lines
3.2 KiB
JavaScript
50 lines
3.2 KiB
JavaScript
import { Mesh } from 'three/src/objects/Mesh.js';
|
|
import { BoxGeometry } from 'three/src/geometries/BoxGeometry.js';
|
|
import { BufferGeometry } from 'three/src/core/BufferGeometry.js';
|
|
import { Float32BufferAttribute } from 'three/src/core/BufferAttribute.js';
|
|
import { MeshBasicMaterial } from 'three/src/materials/MeshBasicMaterial.js';
|
|
import { Raycaster } from 'three/src/core/Raycaster.js';
|
|
import { Vector3 } from 'three/src/math/Vector3.js';
|
|
import { Scene } from 'three/src/scenes/Scene.js';
|
|
import { FrontSide, BackSide, DoubleSide } from 'three/src/constants.js';
|
|
const material = new MeshBasicMaterial();
|
|
const near = new Mesh(new BoxGeometry(2, 2, 2), material);
|
|
near.position.z = -5; near.name = 'near';
|
|
const far = new Mesh(new BoxGeometry(2, 2, 2), material);
|
|
far.position.z = -10; far.name = 'far';
|
|
const scene = new Scene(); scene.add(far, near); scene.updateMatrixWorld(true);
|
|
const ray = new Raycaster(new Vector3(0.25,0.5,0),new Vector3(0,0,-1));
|
|
const hits = ray.intersectObjects([far, near]);
|
|
console.log('sorted', hits.length, hits[0].distance, hits[1].distance, hits[0].object === near);
|
|
const hit = hits[0];
|
|
console.log('hit', hit.point.x, hit.point.y, hit.point.z, hit.normal.z, hit.uv.x, hit.uv.y, hit.faceIndex, hit.face.normal.z, hit.barycoord.x + hit.barycoord.y + hit.barycoord.z);
|
|
const target = [];
|
|
console.log('target', ray.intersectObject(near, false, target) === target, target.length);
|
|
ray.intersectObject(far, false, target);
|
|
console.log('append', target.length, target[0].distance, target[1].distance);
|
|
target.length = 0;
|
|
console.log('clear', ray.intersectObject(scene, true, target) === target, target.length);
|
|
console.log('shallow', ray.intersectObject(scene, false).length);
|
|
ray.near = 5; console.log('near', ray.intersectObject(scene).length);
|
|
ray.near = 0; ray.far = 5; console.log('far', ray.intersectObject(scene).length);
|
|
ray.far = Infinity; near.layers.set(1);
|
|
console.log('layers', ray.intersectObject(scene).length);
|
|
ray.layers.enable(1); console.log('enabled', ray.intersectObject(scene).length);
|
|
near.layers.set(0); near.geometry.computeBoundingBox();
|
|
ray.set(new Vector3(3,0,0),new Vector3(0,0,-1)); console.log('miss', ray.intersectObject(near).length);
|
|
ray.set(new Vector3(0.25,0.5,0),new Vector3(0,0,-1));
|
|
material.side = BackSide; console.log('back', ray.intersectObject(near)[0].distance);
|
|
material.side = DoubleSide; console.log('double', ray.intersectObject(near).length);
|
|
const triangle = new BufferGeometry();
|
|
triangle.setAttribute('position', new Float32BufferAttribute([-1,-1,-3,1,-1,-3,0,1,-3],3));
|
|
material.side = FrontSide;
|
|
const tri = new Mesh(triangle, material); tri.updateMatrixWorld();
|
|
const t = ray.intersectObject(tri)[0];
|
|
console.log('triangle', t.distance, t.faceIndex, t.face.normal.z, t.uv === undefined, t.normal === undefined);
|
|
triangle.setDrawRange(0,0); console.log('drawrange', ray.intersectObject(tri).length);
|
|
triangle.setDrawRange(0,3); triangle.addGroup(0,3,1);
|
|
const multi = new Mesh(triangle,[new MeshBasicMaterial({side: BackSide}),material]); multi.updateMatrixWorld();
|
|
console.log('group', ray.intersectObject(multi)[0].face.materialIndex);
|
|
triangle.setIndex([0,1,2]);
|
|
console.log('indexed-group', ray.intersectObject(multi)[0].face.materialIndex);
|