// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Project a planned point into a view rectangle // Not compiled or tested in-world // Setup: Use a spare owned prim. Set camera pose, point, aspect ratio and FOV between1 and170 degrees. Touch for private calculations. // Stop / restore: Disable/remove. No camera or object settings are changed. // Notes: Camera local+X is forward,+Y left,+Z up. Output screen coordinates are rightwardU and downwardV. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Transform planning only. vector CAMERA=<0.0,0.0,2.0>; vector CAMERA_EULER=ZERO_VECTOR; vector POINT=<8.0,-2.0,4.0>; float FOV=60.0; float ASPECT=1.7777778; default { touch_start(integer detectedCount) { if(llDetectedKey(0)!=llGetOwner())return; if(FOV<=1.0||FOV>=170.0||ASPECT<=0.0) { llOwnerSay("Invalid FOV/aspect."); return; } rotation r=llEuler2Rot(CAMERA_EULER*DEG_TO_RAD); vector p=(POINT-CAMERA)/r; if(p.x<=0.000001) { llOwnerSay("Point behind camera plane."); return; } float scale=llTan(FOV*DEG_TO_RAD*0.5); float x=-p.y/(p.x*scale*ASPECT); float y=p.z/(p.x*scale); llOwnerSay("ScreenUV="+(string)<(x+1.0)*0.5,(1.0-y)*0.5,0.0>+" depth="+(string)p.x); } }