@osobh/reactar
Version:
AR Library for React Native and Expo
71 lines (65 loc) • 2.32 kB
text/typescript
// src/sensors/EnvironmentalDetection.ts
export interface Plane {
id: string;
center: { x: number; y: number; z: number };
extent: { width: number; length: number };
}
export interface Anchor {
id: string;
position: { x: number; y: number; z: number };
rotation: { x: number; y: number; z: number };
timestamp: number;
planeId: string;
}
export class EnvironmentalDetection {
// Simulate plane detection by returning a dummy plane after a short delay
detectPlanes(): Promise<Plane[]> {
return new Promise(resolve => {
setTimeout(() => {
resolve([
{
id: 'plane-1',
center: { x: 0, y: 0, z: -1 },
extent: { width: 1, length: 1 }
}
]);
}, 500);
});
}
// Simulate hit testing by returning the first detected plane
hitTest(x: number, y: number): Promise<Plane | null> {
return this.detectPlanes().then(planes => {
return planes.length > 0 ? planes[0] : null;
});
}
// Simulate light estimation by returning dummy ambient intensity and color temperature values
getLightEstimation(): Promise<{ ambientIntensity: number; ambientColorTemperature: number }> {
return new Promise(resolve => {
setTimeout(() => {
resolve({
ambientIntensity: 1000, // e.g., lumens
ambientColorTemperature: 6500 // in Kelvin
});
}, 300);
});
}
// Implement anchoring logic: attach a virtual object to a detected plane with an optional offset
createAnchor(plane: Plane, offset?: { x?: number; y?: number; z?: number }, rotation?: { x?: number; y?: number; z?: number }): Anchor {
const defaultOffset = { x: 0, y: 0, z: 0 };
const defaultRotation = { x: 0, y: 0, z: 0 };
const finalOffset = { ...defaultOffset, ...offset };
const finalRotation = { ...defaultRotation, ...rotation };
const position = {
x: plane.center.x + finalOffset.x,
y: plane.center.y + finalOffset.y,
z: plane.center.z + finalOffset.z,
};
return {
id: `anchor-${plane.id}`,
position,
rotation: finalRotation,
timestamp: Date.now(),
planeId: plane.id
};
}
}