@playcanvas/splat-transform
Version:
Library and CLI tool for 3D Gaussian splat format conversion and transformation
23 lines (22 loc) • 1.81 kB
TypeScript
/**
* Equirect Jacobian + 2D EWA covariance.
*
* Reads: cx, cy, cz, r2, rxz, rxzClamped, imgWf, imgHf, invTwoPi, invPi,
* c00, c01, c02, c11, c12, c22 (camera-space 3D covariance)
* Defines: cov00 (var), cov01 (let), cov11 (var)
*
* With longitude θ = atan2(cx, cz) and latitude φ = asin(cy/r) (cy is
* the camera-down axis, so φ > 0 = below the horizon), the per-axis
* screen derivatives multiplied by the pixel scales (kx, ky) =
* (W/(2π), H/π) give the 2×3 Jacobian:
*
* ∂screenX/∂(cx,cy,cz) = kx · ( cz/rxz², 0, -cx/rxz² )
* ∂screenY/∂(cx,cy,cz) = ky · (-cx·cy/(r²·rxz), rxz/r², -cy·cz/(r²·rxz) )
*
* rxzClamped (>= POLE_EPS·r, set by the projection chunk) keeps every
* denominator finite as a splat approaches the pole. j[0][1] = 0 but
* j[1][0] != 0, so cov = J·Σ·Jᵀ carries the extra u00·jy0 / u10·jy0 /
* u11·jy0 terms that the pinhole simplification dropped.
*/
declare const jacobianEquirect = "\n let kx = imgWf * invTwoPi;\n let ky = imgHf * invPi;\n let invRxzC2 = 1.0 / (rxzClamped * rxzClamped);\n let invR2 = 1.0 / r2;\n let invR2Rxz = invR2 / rxzClamped;\n let jx0 = kx * cz * invRxzC2;\n let jx2 = -kx * cx * invRxzC2;\n let jy0 = -ky * cx * cy * invR2Rxz;\n let jy1 = ky * rxzClamped * invR2;\n let jy2 = -ky * cy * cz * invR2Rxz;\n\n let u00 = jx0 * c00 + jx2 * c02;\n let u01 = jx0 * c01 + jx2 * c12;\n let u02 = jx0 * c02 + jx2 * c22;\n let u10 = jy0 * c00 + jy1 * c01 + jy2 * c02;\n let u11 = jy0 * c01 + jy1 * c11 + jy2 * c12;\n let u12 = jy0 * c02 + jy1 * c12 + jy2 * c22;\n\n var cov00 = u00 * jx0 + u02 * jx2;\n let cov01 = u00 * jy0 + u01 * jy1 + u02 * jy2;\n var cov11 = u10 * jy0 + u11 * jy1 + u12 * jy2;\n";
export { jacobianEquirect };