@@ -79,14 +79,22 @@ export function calculateBaseFontSize(
7979 return mode === "screen" ? 0.3 * screenScale : sceneHeight ;
8080}
8181
82+ /**
83+ * Reference viewport height for screen-space label sizing.
84+ * Labels maintain consistent pixel size by scaling relative to this reference.
85+ */
86+ const REFERENCE_VIEWPORT_HEIGHT = 800 ;
87+
8288/**
8389 * Calculate screen-space scale factor for labels.
8490 * Returns scale factor to apply to base font size.
91+ * Accounts for camera distance, FOV, and viewport size to maintain constant pixel size.
8592 */
8693export function calculateScreenSpaceScale (
8794 camera : THREE . Camera ,
8895 worldPosition : THREE . Vector3 ,
8996 tempCameraSpacePos : THREE . Vector3 ,
97+ viewportHeight : number ,
9098) : number {
9199 if ( "fov" in camera && typeof camera . fov === "number" ) {
92100 // PerspectiveCamera: use Z-coordinate in camera space (not Euclidean distance).
@@ -99,9 +107,10 @@ export function calculateScreenSpaceScale(
99107 ( ( camera as THREE . PerspectiveCamera ) . fov * Math . PI ) / 360 ,
100108 ) ;
101109 // Reference depth is 10 units (baseFontSize is calibrated for this).
102- return ( depth / 10.0 ) * fovScale ;
110+ // Scale by reference/actual viewport height to maintain constant pixel size.
111+ return ( depth / 10.0 ) * fovScale * ( REFERENCE_VIEWPORT_HEIGHT / viewportHeight ) ;
103112 } else {
104- // OrthographicCamera: use constant scale (no perspective) .
105- return 1.0 ;
113+ // OrthographicCamera: scale based on viewport height only .
114+ return REFERENCE_VIEWPORT_HEIGHT / viewportHeight ;
106115 }
107116}
0 commit comments